From 28e80bf07733231823b57acdb02ad8d0aebfa595 Mon Sep 17 00:00:00 2001 From: Yoav Steinberg Date: Mon, 6 Jul 2020 10:54:22 +0300 Subject: [PATCH 01/22] Make JsonPathError implement std::error::Error so it can be encapsulated as a standard error by users of jsonpath lib. --- src/select/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/select/mod.rs b/src/select/mod.rs index a3d0ec43..9217b5b5 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -44,6 +44,8 @@ pub enum JsonPathError { Serde(String), } +impl std::error::Error for JsonPathError {} + impl fmt::Debug for JsonPathError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self) From 6b7ad5d6ca8ff4ca2457725066e3948bebf0c3a9 Mon Sep 17 00:00:00 2001 From: freestrings Date: Tue, 2 Mar 2021 20:24:37 +0900 Subject: [PATCH 02/22] fix clippy --- src/parser/mod.rs | 4 ++++ wasm/src/lib.rs | 1 + 2 files changed, 5 insertions(+) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 91cd8960..0c68e4a8 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -145,6 +145,7 @@ impl Parser { } } + #[allow(clippy::unnecessary_wraps)] fn path_leaves_key(prev: Node, tokenizer: &mut TokenReader) -> ParseResult { debug!("#path_leaves_key"); Ok(Node { @@ -154,6 +155,7 @@ impl Parser { }) } + #[allow(clippy::unnecessary_wraps)] fn path_leaves_all(prev: Node, tokenizer: &mut TokenReader) -> ParseResult { debug!("#path_leaves_all"); Self::eat_token(tokenizer); @@ -164,6 +166,7 @@ impl Parser { }) } + #[allow(clippy::unnecessary_wraps)] fn path_in_all(prev: Node, tokenizer: &mut TokenReader) -> ParseResult { debug!("#path_in_all"); Self::eat_token(tokenizer); @@ -174,6 +177,7 @@ impl Parser { }) } + #[allow(clippy::unnecessary_wraps)] fn path_in_key(prev: Node, tokenizer: &mut TokenReader) -> ParseResult { debug!("#path_in_key"); Ok(Node { diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 4bfaacc8..e99fe13c 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -56,6 +56,7 @@ where } } +#[allow(clippy::unnecessary_wraps)] fn replace_fun(v: Value, fun: &js_sys::Function) -> Option { match JsValue::from_serde(&v) { Ok(js_v) => match fun.call1(&JsValue::NULL, &js_v) { From 2d8e53473b6a48264bad1f102b8a3cf880e2b598 Mon Sep 17 00:00:00 2001 From: LOU Xun Date: Mon, 8 Mar 2021 00:43:56 +0000 Subject: [PATCH 03/22] Move env-logger to dev-dependencies --- Cargo.toml | 4 +++- src/lib.rs | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1f325d9a..fd8897bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,11 +18,13 @@ travis-ci = { repository = "freestrings/jsonpath", branch = "master" } [dependencies] log = "0.4" -env_logger = "0.7" serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } array_tool = "1.0.3" +[dev-dependencies] +env_logger = "0.8" + [lib] name = "jsonpath_lib" path = "src/lib.rs" diff --git a/src/lib.rs b/src/lib.rs index 55ac5194..162568fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,7 +124,6 @@ //! ``` extern crate array_tool; extern crate core; -extern crate env_logger; #[macro_use] extern crate log; extern crate serde; From 86bedfbfb7dd58c1724217a08f708a2746ce39d4 Mon Sep 17 00:00:00 2001 From: freestrings Date: Thu, 3 Jun 2021 10:17:24 +0900 Subject: [PATCH 04/22] fix clippy --- src/parser/mod.rs | 2 +- src/select/expr_term.rs | 11 +++++------ src/select/value_walker.rs | 11 ++--------- tests/lib.rs | 4 ++-- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 0c68e4a8..5a28b730 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -80,7 +80,7 @@ pub struct Parser; impl Parser { pub fn compile(input: &str) -> ParseResult { let mut tokenizer = TokenReader::new(input); - Ok(Self::json_path(&mut tokenizer)?) + Self::json_path(&mut tokenizer) } fn json_path(tokenizer: &mut TokenReader) -> ParseResult { diff --git a/src/select/expr_term.rs b/src/select/expr_term.rs index ddbf64e5..f777880a 100644 --- a/src/select/expr_term.rs +++ b/src/select/expr_term.rs @@ -186,10 +186,10 @@ impl<'a> ExprTerm<'a> { } } -impl<'a> Into> for &Vec<&'a Value> { - fn into(self) -> ExprTerm<'a> { - if self.len() == 1 { - match &self[0] { +impl<'a> From<&Vec<&'a Value>> for ExprTerm<'a> { + fn from(vec: &Vec<&'a Value>) -> Self { + if vec.len() == 1 { + match &vec[0] { Value::Number(v) => return ExprTerm::Number(v.clone()), Value::String(v) => return ExprTerm::String(v.clone()), Value::Bool(v) => return ExprTerm::Bool(*v), @@ -197,11 +197,10 @@ impl<'a> Into> for &Vec<&'a Value> { } } - ExprTerm::Json(None, None, self.to_vec()) + ExprTerm::Json(None, None, vec.to_vec()) } } - #[cfg(test)] mod expr_term_inner_tests { use serde_json::{Number, Value}; diff --git a/src/select/value_walker.rs b/src/select/value_walker.rs index e7b4de0e..87a0deff 100644 --- a/src/select/value_walker.rs +++ b/src/select/value_walker.rs @@ -6,11 +6,7 @@ pub(super) struct ValueWalker; impl<'a> ValueWalker { pub fn all_with_num(vec: &[&'a Value], tmp: &mut Vec<&'a Value>, index: f64) { Self::walk(vec, tmp, &|v| if v.is_array() { - if let Some(item) = v.get(index as usize) { - Some(vec![item]) - } else { - None - } + v.get(index as usize).map(|item| vec![item]) } else { None }); @@ -24,10 +20,7 @@ impl<'a> ValueWalker { }); } else { Self::walk(vec, tmp, &|v| match v { - Value::Object(map) => match map.get(key) { - Some(v) => Some(vec![v]), - _ => None, - }, + Value::Object(map) => map.get(key).map(|v| vec![v]), _ => None, }); } diff --git a/tests/lib.rs b/tests/lib.rs index cacc9254..907af051 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -57,7 +57,7 @@ fn selector() { { let json = selector(path).unwrap(); compare_result(json, target); - }; + } let json_obj = read_json("./benchmark/data_obj.json"); let mut selector = jsonpath::selector(&json_obj); @@ -94,7 +94,7 @@ fn selector_as() { { let json = selector(path).unwrap(); assert_eq!(json, target); - }; + } let json_obj = read_json("./benchmark/data_obj.json"); let mut selector = jsonpath::selector_as::(&json_obj); From b012cbea5df19a3b8b53ca7e691b537d0d50a9b5 Mon Sep 17 00:00:00 2001 From: freestrings Date: Thu, 3 Jun 2021 11:29:52 +0900 Subject: [PATCH 05/22] remove array_tools --- Cargo.toml | 1 - src/lib.rs | 1 - src/select/cmp.rs | 35 ++++++++++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fd8897bf..f67e65c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ travis-ci = { repository = "freestrings/jsonpath", branch = "master" } log = "0.4" serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } -array_tool = "1.0.3" [dev-dependencies] env_logger = "0.8" diff --git a/src/lib.rs b/src/lib.rs index 162568fe..1258a010 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -122,7 +122,6 @@ //! &json!({"category" : "fiction","author" : "Herman Melville","title" : "Moby Dick","isbn" : "0-553-21311-3","price" : 8.99}) //! ]); //! ``` -extern crate array_tool; extern crate core; #[macro_use] extern crate log; diff --git a/src/select/cmp.rs b/src/select/cmp.rs index 209e6729..8b7a10c0 100644 --- a/src/select/cmp.rs +++ b/src/select/cmp.rs @@ -1,4 +1,3 @@ -use array_tool::vec::{Intersect, Union}; use serde_json::Value; pub(super) trait Cmp { @@ -31,7 +30,15 @@ impl Cmp for CmpEq { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - v1.to_vec().intersect(v2.to_vec()) + let mut ret = vec![]; + for a in v1 { + for b in v2 { + if a == b { + ret.push(*a); + } + } + } + return ret; } } @@ -51,7 +58,15 @@ impl Cmp for CmpNe { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - v1.to_vec().intersect_if(v2.to_vec(), |a, b| a != b) + let mut ret = vec![]; + for a in v1 { + for b in v2 { + if a != b { + ret.push(*a); + } + } + } + return ret; } } @@ -151,7 +166,7 @@ impl Cmp for CmpAnd { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - v1.to_vec().intersect(v2.to_vec()) + CmpEq.cmp_json(v1, v2) } } @@ -171,7 +186,17 @@ impl Cmp for CmpOr { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - v1.to_vec().union(v2.to_vec()) + let mut ret = [v1, v2].concat(); + + for x in (0..ret.len()).rev() { + for y in (x+1..ret.len()).rev() { + if &ret[x] == &ret[y] { + ret.remove(y); + } + } + } + + ret } } From fd6dbd67fe7ba34b2a8124bb3c07738e63a908e8 Mon Sep 17 00:00:00 2001 From: freestrings Date: Thu, 3 Jun 2021 11:32:53 +0900 Subject: [PATCH 06/22] fix clippy --- src/select/cmp.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/select/cmp.rs b/src/select/cmp.rs index 8b7a10c0..6d2eaef1 100644 --- a/src/select/cmp.rs +++ b/src/select/cmp.rs @@ -31,6 +31,7 @@ impl Cmp for CmpEq { fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { let mut ret = vec![]; + for a in v1 { for b in v2 { if a == b { @@ -38,7 +39,8 @@ impl Cmp for CmpEq { } } } - return ret; + + ret } } @@ -59,6 +61,7 @@ impl Cmp for CmpNe { fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { let mut ret = vec![]; + for a in v1 { for b in v2 { if a != b { @@ -66,7 +69,8 @@ impl Cmp for CmpNe { } } } - return ret; + + ret } } @@ -190,7 +194,7 @@ impl Cmp for CmpOr { for x in (0..ret.len()).rev() { for y in (x+1..ret.len()).rev() { - if &ret[x] == &ret[y] { + if ret[x] == ret[y] { ret.remove(y); } } From bf901857f3da5c1117b233e0d4bda7d8771294f5 Mon Sep 17 00:00:00 2001 From: freestrings Date: Thu, 3 Jun 2021 13:01:20 +0900 Subject: [PATCH 07/22] version bump 0.3.0 --- Cargo.toml | 4 +- docs/0.bootstrap.js | 10 +- docs/494668cdc2dc16eb1895.module.wasm | Bin 0 -> 233350 bytes docs/bench/0.bootstrap.js | 10 +- docs/bench/1.bootstrap.js | 2 +- docs/bench/494668cdc2dc16eb1895.module.wasm | Bin 0 -> 233350 bytes docs/bench/bootstrap.js | 30 +- docs/bench/f9980c137fc7d5609726.module.wasm | Bin 246391 -> 0 bytes docs/bootstrap.js | 30 +- docs/f9980c137fc7d5609726.module.wasm | Bin 246391 -> 0 bytes docs/serverwasm.py | 17 + wasm/Cargo.toml | 2 +- wasm/tests/package-lock.json | 1369 +++- wasm/www/package-lock.json | 7761 ++++++++++++++++-- wasm/www_bench/package-lock.json | 7894 +++++++++++++++++-- 15 files changed, 15896 insertions(+), 1233 deletions(-) create mode 100644 docs/494668cdc2dc16eb1895.module.wasm create mode 100644 docs/bench/494668cdc2dc16eb1895.module.wasm delete mode 100644 docs/bench/f9980c137fc7d5609726.module.wasm delete mode 100644 docs/f9980c137fc7d5609726.module.wasm create mode 100644 docs/serverwasm.py diff --git a/Cargo.toml b/Cargo.toml index f67e65c5..fdfe18f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jsonpath_lib" -version = "0.2.6" +version = "0.3.0" authors = ["Changseok Han "] description = "It is JsonPath engine written in Rust. it provide a similar API interface in Webassembly and Javascript too. - Webassembly Demo: https://freestrings.github.io/jsonpath" @@ -10,7 +10,7 @@ keywords = ["jsonpath", "json", "webassembly", "lua", "query"] categories = ['wasm', "parser-implementations", "api-bindings"] repository = "https://github.com/freestrings/jsonpath" -documentation = "https://docs.rs/jsonpath_lib/0.2.6/jsonpath_lib" +documentation = "https://docs.rs/jsonpath_lib/0.3.0/jsonpath_lib" license = "MIT" [badges] diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js index 3f8750ed..19bf8de2 100644 --- a/docs/0.bootstrap.js +++ b/docs/0.bootstrap.js @@ -4,11 +4,11 @@ /*!***********************************!*\ !*** ../web_pkg/jsonpath_wasm.js ***! \***********************************/ -/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbg_error_c4abc40e0406628b, __wbindgen_object_drop_ref, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbindgen_json_parse, __wbindgen_json_serialize, __wbg_call_bf745b1758bb6693, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper107, __wbindgen_closure_wrapper109 */ +/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_object_drop_ref, __wbg_error_5b1e30d38c81c9fa, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbg_call_3fc07b7d5fc9022d, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper27, __wbindgen_closure_wrapper29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n/* harmony import */ var _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"compile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"select\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"deleteValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"replaceWith\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"Selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"SelectorMut\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_c4abc40e0406628b\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_error_c4abc40e0406628b\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_parse\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_serialize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_bf745b1758bb6693\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_bf745b1758bb6693\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_debug_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper107\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper107\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper109\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper109\"]; });\n\n\n\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n/* harmony import */ var _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"compile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"select\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"deleteValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"replaceWith\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"Selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"SelectorMut\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_parse\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_serialize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_5b1e30d38c81c9fa\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_error_5b1e30d38c81c9fa\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_3fc07b7d5fc9022d\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_3fc07b7d5fc9022d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_debug_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper27\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper27\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper29\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper29\"]; });\n\n\n\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm.js?"); /***/ }), @@ -16,11 +16,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jso /*!**************************************!*\ !*** ../web_pkg/jsonpath_wasm_bg.js ***! \**************************************/ -/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbg_error_c4abc40e0406628b, __wbindgen_object_drop_ref, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbindgen_json_parse, __wbindgen_json_serialize, __wbg_call_bf745b1758bb6693, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper107, __wbindgen_closure_wrapper109 */ +/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_object_drop_ref, __wbg_error_5b1e30d38c81c9fa, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbg_call_3fc07b7d5fc9022d, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper27, __wbindgen_closure_wrapper29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_c4abc40e0406628b\", function() { return __wbg_error_c4abc40e0406628b; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_bf745b1758bb6693\", function() { return __wbg_call_bf745b1758bb6693; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return __wbindgen_debug_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper107\", function() { return __wbindgen_closure_wrapper107; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper109\", function() { return __wbindgen_closure_wrapper109; });\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetInt32Memory0 = new Int32Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_export_2\"].get(state.dtor)(state.a, state.b);\n state.a = 0;\n\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_22(arg0, arg1, arg2) {\n var ptr0 = passStringToWasm0(arg2, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h46468b167eaaeb87\"](arg0, arg1, ptr0, len0);\n return takeObject(ret);\n}\n\nfunction __wbg_adapter_25(arg0, arg1, arg2) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4bcc2acf0fb4a8f0\"](arg0, arg1, addHeapObject(arg2));\n return takeObject(ret);\n}\n\n/**\n* @param {string} path\n* @returns {any}\n*/\nfunction compile(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value));\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @param {Function} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr0, len0, addHeapObject(fun));\n return takeObject(ret);\n}\n\nfunction handleError(f) {\n return function () {\n try {\n return f.apply(this, arguments);\n\n } catch (e) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n };\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n* lifetime 제약으로 Selector를 사용 할 수 없다.\n*/\nclass Selector {\n\n static __wrap(ptr) {\n const obj = Object.create(Selector.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n return Selector.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr);\n return takeObject(ret);\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*/\nclass SelectorMut {\n\n static __wrap(ptr) {\n const obj = Object.create(SelectorMut.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n return SelectorMut.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n */\n deleteValue() {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {Function} fun\n */\n replaceWith(fun) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr);\n return takeObject(ret);\n }\n}\n\nconst __wbg_error_c4abc40e0406628b = function(arg0, arg1) {\n console.error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbindgen_object_clone_ref = function(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_string_new = function(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_json_parse = function(arg0, arg1) {\n var ret = JSON.parse(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nconst __wbindgen_json_serialize = function(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = JSON.stringify(obj === undefined ? null : obj);\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbg_call_bf745b1758bb6693 = handleError(function(arg0, arg1, arg2) {\n var ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n});\n\nconst __wbindgen_is_string = function(arg0) {\n var ret = typeof(getObject(arg0)) === 'string';\n return ret;\n};\n\nconst __wbindgen_string_get = function(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbindgen_debug_string = function(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_rethrow = function(arg0) {\n throw takeObject(arg0);\n};\n\nconst __wbindgen_closure_wrapper107 = function(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 4, __wbg_adapter_22);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_closure_wrapper109 = function(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 6, __wbg_adapter_25);\n return addHeapObject(ret);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_5b1e30d38c81c9fa\", function() { return __wbg_error_5b1e30d38c81c9fa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_3fc07b7d5fc9022d\", function() { return __wbg_call_3fc07b7d5fc9022d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return __wbindgen_debug_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper27\", function() { return __wbindgen_closure_wrapper27; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper29\", function() { return __wbindgen_closure_wrapper29; });\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetInt32Memory0 = new Int32Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_export_2\"].get(state.dtor)(state.a, state.b);\n state.a = 0;\n\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_22(arg0, arg1, arg2) {\n var ptr0 = passStringToWasm0(arg2, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3f85b00bb5f43a73\"](arg0, arg1, ptr0, len0);\n return takeObject(ret);\n}\n\nfunction __wbg_adapter_25(arg0, arg1, arg2) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h38eddcbbb73fbf05\"](arg0, arg1, addHeapObject(arg2));\n return takeObject(ret);\n}\n\n/**\n* @param {string} path\n* @returns {any}\n*/\nfunction compile(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value));\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @param {Function} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr0, len0, addHeapObject(fun));\n return takeObject(ret);\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n* lifetime 제약으로 Selector를 사용 할 수 없다.\n*/\nclass Selector {\n\n static __wrap(ptr) {\n const obj = Object.create(Selector.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n return Selector.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr);\n return takeObject(ret);\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*/\nclass SelectorMut {\n\n static __wrap(ptr) {\n const obj = Object.create(SelectorMut.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n return SelectorMut.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n */\n deleteValue() {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {Function} fun\n */\n replaceWith(fun) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr);\n return takeObject(ret);\n }\n}\n\nfunction __wbindgen_json_parse(arg0, arg1) {\n var ret = JSON.parse(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_json_serialize(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = JSON.stringify(obj === undefined ? null : obj);\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nfunction __wbg_error_5b1e30d38c81c9fa(arg0, arg1) {\n console.error(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_object_clone_ref(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nfunction __wbg_call_3fc07b7d5fc9022d() { return handleError(function (arg0, arg1, arg2) {\n var ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbindgen_is_string(arg0) {\n var ret = typeof(getObject(arg0)) === 'string';\n return ret;\n};\n\nfunction __wbindgen_string_get(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_debug_string(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_rethrow(arg0) {\n throw takeObject(arg0);\n};\n\nfunction __wbindgen_closure_wrapper27(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 8, __wbg_adapter_22);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_closure_wrapper29(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 6, __wbg_adapter_25);\n return addHeapObject(ret);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.js?"); /***/ }), @@ -28,7 +28,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /*!****************************************!*\ !*** ../web_pkg/jsonpath_wasm_bg.wasm ***! \****************************************/ -/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, ffi_select, ffi_path_compile, ffi_select_with_compiled_path, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_export_2, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h46468b167eaaeb87, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4bcc2acf0fb4a8f0, __wbindgen_exn_store */ +/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, ffi_select, ffi_path_compile, ffi_select_with_compiled_path, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_export_2, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3f85b00bb5f43a73, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h38eddcbbb73fbf05, __wbindgen_exn_store */ /***/ (function(module, exports, __webpack_require__) { eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.wasm?"); diff --git a/docs/494668cdc2dc16eb1895.module.wasm b/docs/494668cdc2dc16eb1895.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..b7f60657f4a49e6f2ecbb74bbaed92cedca56d84 GIT binary patch literal 233350 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

trE zXi6_j2Tn|Vja3U%f6Z{KpTwq#P*sUc053NIvsqEQl1{#^Ro9EUUNmqkuzEHIay9#D zdoYlj{PQu^8UkxbNHCdt$w0$f0vt|G{iJTDPEyelf#kw_-LPg#KGM&a^}6AKU^36$ z_L7DQSJTPY3)@MRT{VthfjW=F^+R%KfHVeY=CZUm5^PSq zH^}8N65QS%lp6#Tr>i!OwOIKvw}idh9hw!RS(wT<{|x5U+m`cQh~1@_lR*;-_s#~@ zy`gzTn5XtRSBHi)ph1zC{kFF}CN0C`Y0G9^zCrL{i%5aTk`!795=!7$=xPkr&A@zs z!Pt$twgltEQN!?e#ciqf-b(G$^Zfec>uVVU}KbR*MKD5>LU6T-~Iap5$1RX9)W>xJh5{e*- zwT*KDTZXWs-E0IpUIbByB((mti;SqB%UA*Xxl!VTS`8V<$69F*H`cPi>@;0z3T~S2 zyEF?&)4@ctuFMcDtSi*B`DK_%Ib9c(GnQ=If&rb1r3 z-|4Jz^|@cK8cCI<&Zy;)J4l~K;2RS7eso?7I7WhZv`jmxaLwr?KdH@7WVM6^Jakg4 z26zL~2^5`3YMGwcA4zhhikwc6%JK`HfTD7)J^JXIP8djPQYeLH*e@qF^DSGV0cw$e zMT^ju_v55KtDeXv+votqz$V+_HdHP>q4O2qSB)$=)dGbN{0&anR{<#GU%+N zuq$voHA=(VH)i>I;jEzoC{>=BLod+tcSG)i}RZ>t^NcSs23JHr2OrcQ$*c2x& z$Xwex-(HT7BH1A~SHi-F70mI`(Zr<=pHoQsW73V*G6l@qf=^Hj8ZvsUt(%;+bzP6O zbwqZOF-rOvkD0Y~n8(c8nr5z%sR%wysIa#7na7)@W>`W#Agy9lD`5~veyv)7cYgt1 zKFn$~bA#>22?AE1-0<5;|CnE|%$B~_uj8+tnSYPZy8JBZAGL9LX8vCz@OrlVyM0HY zUU+_8vgIbJ#VV`oLQjO0xX~>LQw7slGSMr|XX^v$Q;ZeqP`XtJk#(GpWe?|LnZ)~O zfG*+lSRh)RXzsKlghkxKWD;83j)rGib2F$NwE00FMSz@_7AIMZ7*K#iQbT&NPa}D| z&{#n+yAbOhXNJH$4Q66N1RgqN=fI9|7Uux#ik<=!YAd|VM{qPM`3Qb4%zOk6@o<+d zX26YrK+uMD6Sb8&W5DW);7Or%%9sd?q4_zn`!``$c*+TyCrse@n5}nH;Y#nTsygfG zG*3Kxf(oqioPI5G0XH8EPa6r#sAHw)gZVBGi5kmYBbv}H^FBy6bcNQ=Y@JQg$1gZH zEzO!MAzBI#3{r%z`Ay7AWSWWb=S4qWx_P~q&=njK0WpK>w42m3Gd6x@bvEoQ&a*(( z@tUkvb_(pr3$U!S>U_S_0x}6)FlAD46e)r#r?z(tHuHNJoif`^rd?(x>>!_3oJo)b zFk>}|MnGUGi;B8Y-R+t6&K?wn(93R4eb#~S%CN$O?IAQsBnKllB>1v3-13afMb?~I zoIq#|gTy?#h_&pM3tD4AwfT?Yq`el$=J?MgG85~>Z6E@W>3bS_A_mUJF)5nN1*WIt z(bxsvz!%R8mQF@nh=-l--_Q;(@YMVK*TtfpceTxrmW8!;D}QXZ+xB=~(w=B1$$4*v zoz6>IcPHmv!;^oZw*+^Vf3d%~RRO(P=-t_eo=@zdK1rCntXL z?$OVE=#gX5meHw?{OPWTgNe~(+a9L=&CO}^?abRM*;AjZMOp@H2=-osDHbK?{Sf@E ziJy5~G!aV9qlPwMYbBN?=JBj~8pj847Lu>2#cXgHn7s|OW;W1L10cgS0F`?hS>oE* zt2x<>&d=INduAhTH3FJlBToFvJ;@ru9T=ul8bvWu47*_-nfY`GC-*tCFide4re4yw z!J)Hx?Go{2h^cigHHlU8N1C!nS>Z#e_aji$N~18JeKy?GyvYhu*HBg$afml%Rk$bB zz!TLobhIkG6Zs*;S>gbN6w@vdFnyR{WH}tPYdqDi9BxfxoJ2%~fF7 zbf|#b)mAJ{u=!)VnP}QS)@~&IW9>dEn?}-HOFTeh?YMaovH{B&C6?61!fZeIWjg<& zD`BQ8<6Z)m9spRIeG(Wv*20VkXhk%Wy0BHFb{9)%R zvaTnpCPN~RTIre4jD6B(TJ63>>*VeDa-faZ4qK$dfa#$^5~F0^70_Ww01XKvm2}xv z4aK2W9GWT_HErky*K$uq<1K&GYn|ti^zy(P?cb7|hro*2vJpIi%Ub6lKzWqWd3zM4 zBa0ZE0I4upQL`vnqZ-ydjsm~kCkTwg90Yw10?lsPu;YWawBlsrI{>3kU^t0|l>wtq zU_jr!4E%y%0XV2R2x<<3S_Z*maABB@Ti*c$H9^3Ffe=v>1T{fW)4~rA>8?1Fe#sYJ z?*)#w^7tlaVjyGULlrBQ=gx%rkYq)#g6`bMt6jN=sT+8Xi>LG|BzMj# zphHrpAm|Ztv=_py3*psDI`RgSu{msoqfSsL5_UnwhwF}N=cot@0 zbn=d|HWEyXvS`DsbS-@yIGMPglk;&}qsfZoyPBM>Kf@9%wfH3cgFvU#X^=d2@&NCWTOEm26W2I&C z$b_IE#6q9*c&Ie`dAY4Mmo=?j7eh*3@jhha;Ql? z%DK){9Xv2XUDaqM4Hed$U{-XvvBOM&6O+6b9Yomq1br^e$8>46Y?w447}N&=VlZd8 z^Wct>o<`pLlV&eJydWFI7fY)9McT#53)Uw6$>NhqwRE$M6k_YHLA*<6Gl(0Dn6Z%| z=LA?$&^#Iub?JoN*+3wuR~TkjXi#_Fk6;Kea{tJ%jnsP5!0Lwb5C@wqFOwsuZkZEP zcTTnQPeiT^u#9_IqL@uWF|9HQE!z}@4uWD`lh_iK61?SGqpa~dN+H#=j(*`20AWX@=H96O2ONEk}| z)3m0{!pzK=E~`??3lWtarFAF`gU*UUr{#8(wS4Y#Y`I>t<1!tBpw`WR8dTFVA_ra5 zgRbeptZ57=Yr6Ryn;ultEZvD*gW{$^4ZW-=F=xRj(I3n%!vu~Rs4qhCcaf`}e=~9w z-;B(IUGIu-_O6@geR)oMSA4TNX}iN7IMV7s*abr!xJc%I|3LcKt|H+9W{SNlIGOzFWXB49prcYt5n%@;G@MH4391oLFYiCdJnQs40 zB^}k{QJJ;r{Un&rB}}I<>}grkxYMij=x_8?dW?juQcXXD=Kn+i@q5bKUZpno`sh?X zAC#Li{cjeph8hU9BWYgtn2ep983^)H*Fkcuj5et<5Hz@K@zqP`sk zFByUl2hI1Z?jxG^34GW|4@WrQL!XZu0e(^p5(<2>9&-^>+L~)q+auzS{pywa)_jlP zafFzjoe=voff)(5g$*W2Mgd%e{~Ae~@m0fyqGFh*LD0(YC|JhYP3s!(LdoFK&{5KW z#wU83T=~Gh9#`UHQruhwu&Nine27BV6@*5GT#KSyle9yuQO3;r?Hf_Kh}{cml66jdN9 ztp21p1BZ6Ciz{k+UFVJB-=IyID;1x(Jf&#J<4O4nJsu(6Ll`#FPu}!w%A<{}vS@7`wT1+MC zhv}D#5aKS@fDO|DV+YE32)FljN@uKbmLX+Xc#LJg1L9NG(AYX|pgYQKjV2J*ohb2{4B*Jg>Kre#Mc?w9ehn< zVIqXE$Y|59qj15RMn6@SaEyD{t+$3L=+-O^{**)5Eyy|s0Cc6E8s-JU5no$;;)dXN zN-sX5_^1h#2a8?oqUTkaqxRj#+CP9W^%;i~`)Ar`2$RII@0ggtFT zK)J`L)o1KDi5YmXC1?|sXIS~lr40C-3e$LcBp*+upiYaU9`5C+109Y!g5ZgxtpD^| zy*BqZBU*{ZHD*pwP|i4zO8#sV>*!A@ULu-J>$ogkOgfWAw?XKPKiz1yBaa%OkxXYu zTWv$dJmIj$i=2B=kkUrItP8IYk|!ul6-&oxfbL>l>)ui0$P()w31+Zvss9b?I5F#H z)D!Ev@ys|RV_j(q2rn)Mzs4Rs+6Zf^?}*=6KthLC%^GpMx}83%%57nNDCgCn`SLok zlU?wr;=!^CYUZ3HgLA)3^4#D=E)sQnsxUZ@oaWHJ{gXYK_kI#Gi&^@%7+sGC8P%T( z(!R_(+h$SN_cLe{WI&`qCfi#2*9#7#$pj-z|Baw1rqU$?PvN;?`bRFsnf;dXNGC<+-lu`{ zIykX9;P6aq6ocFb?x{{cP;I#hGob>V|i1yoI#7z6y_Jc6}G?Phppb$osqjV|7@y8*Tl1&f1 zPoV$6#YH$O25f=_{B6cUaZ}y{_0mo>D)(~)t4SRyb$vOj-tI6RnMf*jga(K$Ia8nJKeysSpkzmBU;SrV>WieijCS^L|A@?1OX+ zFl7N8l{|oBAO5gBfTNP`Q=Z-c4hvk3SxHc|M$<)WSXRv9PPB$K?j_AU_~RzvVatJU zOS!^_0j366!LFqRbPe3Z@(+i&`uhp&;<1sAXa$qS0!?%H5DrLit0<#hYnTMi%y&9!|BF3RO_Yecy6-Ynb8$AfS`5YUA`SEiLrD0b&B>Uc7hd zG8)GTyI607&FN!D9&v|1#g{eMrIBa4s&O{3OlGho@k6a)09slGC{AJlwA27vnha01 z&lNB{CFcUj(heZ5T9{^lB@UXX(HTGK!((kr1yyiSUMg^ORmeq7>ef)Ic}=y|FBEBM z2Nl__CqsPD!LhdOtsp*nEn75V7P!bE_VIHr>es4EznF(^vbHC8Ix-FdSbRwzgluq+ z(&d)X3NIGOUK%9wg};0q>1^O}lr_ejbp_BO+8op{SmBKrC%!sH*QzZm!h%Je;a5b^^#<(7|7V2|Kk#2nMC3pk8E+8Jy z*8P_z^F*End=n=meQr7aGJ+l)rH#Pg8AcS>4X~iTNPn=CtyB$ZwSBg5r;LZ_3xaPv zq^&&)d^!~tf)w*JCJKlEOX^Su@&TWpoI`DOb3DQxVn4)%4+|Tpv3l8NT@ZgjGPpJY zTm(rg-6lw`8%PL(R8?o#{BWKmh4rr*@gMW47wfi`oTb0Ki_MdCQSOxI(8Z3FNP!Z3 zBGxPSbMg14pUHe!v4w}D&YBy4bki38=CLR@7bP{Z|Bky^Z`q>aV2PY()6Ky$IqS2N z6TNt<y zy5rjVDRC{qF6t&kkv}b&XGhB=oSQg53;%E(2DDP71>7zKIEAb6Su*vURINo=FuOKs z6BLLJl?$l;WPx`1AjJ&e4J|9r1B!;zpbarP>QYc(Vm$1RWoE)qGNg6%cuSIN`^f6HK7SD3qC3t(6Nty1QK?=ll)G!Bb41q`vMeUE zPsAc>LLUrtE`Gx4!fceo!=hatK2@=oG_i4-xe&|vv>j;MLF#YP$OvA-D{+tp#It}K zUbcpU)rS0j#aLu^Vt+EkR!&n=7!8wFfeW*!Di8)AyH#ls7X8%eZvgvmpu9F-5lNx& zj4aNA4X!VB8(dw$1#kQ1Ph`_-;4%wZWllM5$A-lz4OWbZjDl`#e7(SCm#H1FK= zfrGZc!<>`TdSvmN#m4E}IT_f|JjGg&lRa%F8BvEhod?NEwR@N#aXfdqhdp+ur_9~z zgP)R1v}iR>A11+Eq6P*va;60vTm+Vm1;~IK=lsyjwJEu?^WZow&C4h8>OQHsG3;IL z@04S6TG?%RKYKlmhsI}q+tp4{y_O=>cu}|8KX%A!W)4r^r9a8CEO;xmGjqmPaZSkO zgX-YD4ud@{ygb=WjW~TOqef9pcCh)}=-vKs7kUZ&AfXGrEJqlA<(=ihg*60gTDFZy zX!4t9xg0F;>7n7V-|9ib<0N#UVKd$6#zQ);lN20a#(SDeGa$(S-pT1?#rd-X zt+B|*$WH0}0kH9Rk-~w6p<`KhBCtbYJHl5-o#NKfsrT&Iu`fx&hepGDx4qi?x^U6= zO7B>)2myXLz8Oma2F|df)9bcpGTR{)8N~W!CPsVMLI!SgB3Q|gQ_0A>&9FNapP%86p}HuQ6U4l_hWZ0J>S3T6sE5gd^z^}jcv<6}@~bzLMSs9LaXg_wS!^Nr)>VwQ@q z$gGV7-uOC&Tqi0675tWISNv_dyyka?U(Pm_lWPpXb{CIN4A#>hJGnS|9FitmDdSqKF^ieE^#rO-J# z0*Q4`((rB@@M)5fcEp9om#b{m0S43{$&332yRiZSzFSyfcMA>VBi8p6DsU`d*LIWQ@|sNXQmiMePn> zvrbf#9~AY^V_lZa7!P`J3N?AY~DtNX4$+@9;rWcB>zg|Fb2=P+Q&!yhIRD;db z>D|6gy{PA+d$t0H(5iRtS1C`K_)dDg($A7i#y(buF~^Bo$r zrgVKOlVR|Zo)mfK}5ipA;Vo+tb6FKgO+r%jr471;8e7G1?SwpuJlt`v~ z+&)d(E2ZpGo@L>FJAEtE-5GhT4`aU5O`$aGPCNMkiWz7-yI11bTOJzVs2@2ltxIkN zl0KqrndGq&=hj0RYi&K$<>LPdQNO!a>UMz~N!|U1HAB4?gM}}o?of{Uo)!Im!@4BX z;i^OuUb!WGJbo@LLkKX9OdmS9084J;e2xo+^Qj~r+)!`22rW;4r&}n*&T_EowlXjQ z$@_Dz<5^r_%mFVDXfih|kkcqvuz+^qIx-2g=SC)5M$h0lp=8cYl;gcbdHMuIvF&}P zE@u#hSEo!Aj(XM7q3bz1)FJRWE0$dk^@#Ic5;Ae7sV*v4XA$QqvBPr^XW7VSTAU4A z&sCg}*)DO`!0d)E$HoQw&@GfgffeGN;B3x2DX=0rZ z)7eV66m>ROXD~VC9W*UAGuMgkU8$d%zdBfO_~c_?Q3IHnrKcr&A^O>Dz~J4iK|H&simyX!B3& z=k=sK!KPx5BAg|nQ+=??8!t|~UP$rNT~l@pfva9NvgY=?5f-VT0A zO75j<67qVcz3lxv-1}zF`>82E%P`?G)MjMJTiD_AG20H!DJsy~c^p>vR{} zEV9~|Mr=&??O|#2^Ub%>_b+%?Y5!9i;rC9baRh1{Z#V2r&7phPnq5zt_kt1~SFxpC z*XNR?p^rt$d0Qq}cpJ#`HnzBYXHRI+Doe%Jy>JWJCyIO%My8t1&}b#2eu|4NJ*0*& z_K~@<4e4t(J=8wy-u58T4lDvLq>niStt|y)q!$ejWDO*X1c43%9lEF7N*gF!TR6*5 z-DsU};J37x_{UkZ96Gd!@Q9(&$#;#uW?R2^|bwhiBW%| zJ(Qfq!68xlzR!DaKsuxJ2~R7DQQCK9i%p-kuk9_H3YDz09`zO+=hyE_g@{_~9x*};U?bCb3He?y5KKG@IU4pXo z4dj0D9pC8ji|;BDGQaq~A|dmOPZtT9U;J>9aGa;~qIB0c^GYB65((#~+lh`a?>kiZ zf|pLIfV|UKSi}ydyWU&Lz})e9;$Ys3EORtmm5s5<1jiN(B@6Cp)maaPt8xAJk7aJ)-=yM$LDF-$qMu2ZL{B)l4Cveo|wbO3JA@AYHgqa0OG#7UptmK#e2! z4aAJ$bq&~=&siSSz<@cX0(HI;T7m!w&qN|i@S&ccH1(!Is|)UF*RP>9_kxLx_T8eb z4Xs;{o`DJEmYjD3H8&0^rU?oxNGJu1&`?&JdH`mZ(4lj5qDY2#(9Sndx<$RD7{~{4 z^MG9i(5fJANW`g^5Em)xQAe+6guZ`u3#0+4@PyyX{Zr-|8%72CLbCK5$JE=?p9* ze?3|J=2Y9#2gD7o#8!hUPK zY~>x)}PQ+fB4Nwg;ThJ0nJBW%q*fjoYCdbyUnP|%e~9G6BUU0`sna&Y~GU5+ zLJ|YGi47*d=mIP~J7bv|FSX;BS$F27X^a4^3PRWi*z_x=jMAO5W5)43v`leDR0`rtARA~^a|%?KiNCGR%^zTHM8hG<1-44Z#y0rY&dh`iMy<~)147U2T4@FK#kPg^lT!*#?-CCSr*y`Io5VpILuiJcXY;|0< zJ>OqxlZleF0IAOI1B@Nnm-8QsW8RV799s6o}e=b1>OoE6l zFm_K=&0Z#HVkg5ic@q`5fbUzamEF8PDo%hv953H8p1elk2|ma(eNx7ubkZwwk<)%z zw>o70`Mf1I35&PbFpLY$$g|a#Tkg<|8=dEpqT@Z7e!7F{Lm8&c2aiINNI5yVCd2r( z*@o5v;VDJv4^Wtf7e;dx^{6m<#E=0zC6prqhH~8wjG_siP{u>7x?7&3`gW9JuzT~1 zbd)WqbW@*C_-lxGwYSZOO_GoK*icYf8)?VVmq=9^VptcHARJR&pcc)YQ%g0I-OeLl zX!W}_8qys(kGl+ZP<*_NI9+|GoPLM3YM9`EIp1h$} zn0f;(bgWZ3)*^LqV7~f-eCBv6fuP|>U69O+1#L7kg=(M!ODD71!vn+#kWUWkxxnHBy4@TyW}9X3mNU!Gxevi4*&`N3A!gNeu1--U z8ujx_b=WaTV4p54ZW4SON$WY=zyX?Hof1i-?GiAxl_3r@=0zL?D}Vuw|B^a=18Ai| z)7$t&IWWF3Iu@(n_{B-n%FBFWNF^h*P!RE$Y7NwuF7&j>vKV1sVsaC|nLxuk*`vSKB zi)kEi#3^#{KiExo(NCQ@8(rjGr){i;0Yr|2jNw>g7KbB|yv!{*d$g>_#vqUT!D^9C zY%)pRyEPf=u!+d#uIe$;zo>^z9BY7g$0oKS-MOj<_;#R3+4>{Xz-~)`C>G2h+K<46 z3_Q>TDjEym+L3)I)}xR1?Wj73a^(O1!r`Y3`?3tj$sm5)8koL}Iy^Te;7ix_K!U|$ zHn!m~C8xol!*leyo9EQCK6p-_@Sb|F!N6_V;_(U7MetS5hvs{Q#WUJPcnJe~Gp!29 zf81xR;qz$)Q-Us&HV~aj*R-UIE%=cR6y!e)t;>4orhR3bT=8nk@j4mA>txrF<&pYrO9~(MiTyul%Eq9f71vD!>D!yzoV$i z=*ksU54t#@+WV@S%TSjqEun6j+DZ4Mz(Aw8;cKjJYX9DsP7kZ-E81aHcME+5R%z5J zGHTBiSs(+4R=-3E5ul{S42c;=HH7x4vA}p`7kDu(ruZgzayCeIB8DOq#t|}2;!V#Z zU+}jny&dRK8x~VE4_dDi=jX;c3XEh2XGgY#a=s}v8v+@4rC=c9ThSXqJ`!%vM?&=v zvAxc)$Z+e1A2r07_ZZo1AuMvS69dN^e$^r-d(OsXe%L34J3v4NIHc zq=CsD%3dTBGJYmRw>!HTydx7D5&&z)B8EV9zpOd9d1{=t*D$e-nNH&!i_^bmYO0$3 zi@e3MSy&ui3~JHkX1JYovW8jaiqn6wDR7+r1M^*-7ypl0rRt(O=%>H=m(w1{ul^zT znO(--tO9uYAJwf6&6RZ;-naQ=t{iu!`ew@Y8z3$K$KhawB;GVao#1wdPuJLkoyMR{ zcUv4>7NkEFyvkq9Ck)c$*s`v|dsR3xNM{tL9a=1v#UAZ6?4tAh)N9@;a~1|>%0c`3 za=)mQfua_(nO`vil1VNZt#4h;OE>Lcw4bzn`=UBX^iNi?na7%Y1*cH4oT=%;%sn-u z7rd*FHGh2Wj_6DQt?G&QWp6X=>k+l79@BSIA7S$oHpQsp?B)f7Gn2FImaz-4iX^N- z%DfmZ*AqG>^KTGtP>>05(fClcAbU4ze$jAtRKpUbkNE@Wl2sd7n{wq{X`r^VCBc_XSH&ki;7O%u z?bx41#BE}po>azr@I?$DbEjA2HR?c1QOUK<%M|^ov&+F~^IJGvn6rSoOdybP7pa(! z<-C?0gS6&X1BXC~B}r_nSe&_HoB-wWt{Oy~!<6}*z{QQ5vx7=9&EQ$%Moju}P z1R-Z;0BPfIb1ntWlMn*5>y#N86q70o*a|B2S3rpFn-nAtYYuYEJ2=x2p@QsHbTQmn zpUst&y{3MSPyu_|$Qe>GxMpu@p?jE_H2>Zdt){xpV}ZqN&B5m2i1{;JP>aWX&2_)t zV1e9DMVw~L3z_S}gewC4U<`RSSO!Rk4}Lm(A=s6mbM&5uIYMb4cc(>|9?<+m2x5U| zC8rPacKXvAi1(^C0!J@uJOBQv0`WMX`YSyY}$$pN~UsDidxXAqV=`##<^GTeVI>^(~ zx{feY*ZD6%e@u-%sKc}xI>;PU?aMHzo(p}VrInEPDNHXg(&SZ$27dFC*4uqPFylTv zI~7w~wK6z#DkKce&3fz@PvcfxKYJkMlqGgArKnf{O4;|yQB`R_9}8Fy=41Xq$|2)A z5r*TN8N1mY8oRTA3eeLRHP2V=Y@D}N9#kvVn)6}u_^{MrgOWPywA1Oded3ZBD%eCY zUWMJrI(#Urg>i+oYHBel66Wr)PA{d;|4H#D4#Sr>>aH;cSBK!g_6_y8zy}>x7G|Vq z*eaza2`;0n54XG3mo|;;j%ry}Mz7vFhg_W(WOdf<02{Ymp#vkAMY%fXmFmp0E}vQF zd{^hCS)JKYC|WHl1NwR@{eg1F`y75&Z|DHI5Ts#d5wF)%_*x1-l32E!e%!HIMb(0ZMH_jRmg8o22tzuJ zZ8r<#^w+Yvoe{J7F3r%@Ucr0K|5J>C*hHvT)LU$UQ<9w)`J}c@@eG(QQY^+E@utda zX1$2~sNQmY|2eA<1&p=PC5C8Tr^T$e$sk&1mn74{vr9K=O2;^559Cd4ZR2w);xK2y zL!=4)8GohsD-`2v{Z0lTzN!|!R_-h^e1sX11uiBGEW0oV4boB#A1R7VyBgBK)}cyS zeznLlv)Mc)t7iV4X>}6=g29q81BE7Ed+ig`(&b}MYW4H(c%y!RD9^<@Rt|_;;6sBKQ^KI zIlk87zP`RnU$rKyTysl$V7^Jhtu$?D{)J68YjMIbt-0n{+BUzU<#y97tjkj`{kUyf z^}CD9&^xupFP^1w#TuMi>Dnx%(Hf^%+D?S+fgE-_#nKjA(^FdJ@u@+swMr0XJ4U^CXE!iMFfkfybtv4mY7mr}l-Je&25oyf_}B zM@ZH}h~|%QKR`CWVM|&ITL=bLVaw+whX7zBYTX^yYJMoPwO0+ET}76+udCiyyLwkyy$esj-fv{}GCFqEd#S5;`CRqRf@Ooa zY4LEvZ93%;8fftEs{cY)|A^H;8$O^41F;<@gt$*>BBX`52hiSk3OJ1%J9*|eoZsmpBe=`J=}6f0E(|4=g27*uZJhwU3Wn(9k6_@?D-~KaGTSBrWa-QlA=jw{#t$}6d<-hAgj0wgLQ|&nqiR1 zgX=d%#r-M(t(f)v&;Fo38BFNRErtS{^`sAcKvR{($zkt*%?;7b8wk7!Jy{_*O_~65 zfu{cMMO>+NZp!lpBj596`+F%KC{x#F!?Q5s&bxK@)iS8bDM);Wr7}XI@bxch{(D3x zC@n<-DpLQBS9(77kw9~;YJ%Z=+Vq|^BBc&Wn%@cu@)L6O#DJMsLfGO*Uh8E)H>kR5 zsk$wl?T7|4O1>yb_wkclu6Fflphz)5W52mXQ+L;i6~U!|Fk-$TrqqNxv@{|*v-JWH zCNbciRQ_M;zG={2MQM2`&F%hbzJ&OQ9HX0I&c45Q8RM#v8gITwjlACimeh!*r{AMS zICB&R0yVgk5!z7dCjx19_qtSfLi>in=6`WaZudBMG7GCYlI2lyC0%B#tt&%!h0ux6 zBQuyYrZE6?7IqGl`6}?>8sEuRhbcC)62fWMr}U4WqT%!-hn(s5 zpPzQK^i_F3A$8lQ_qc%-PYX~Z9Hga~VqWx*t+DvdnA2)><`VpF_hXq1#yTV+-%yx~ z(o%Qu71b_5l1W6~n(q`ScINV+Kv~WD z79X#cTSZ8tI|w-Gp2_kCq|!JAdP+IVKQB+$-T3Un-2V1A|y3}|KdJ~ME- zi{d3;8Je{#L;Gh9xhKFm2ClY|WLB-Bg7{v>d?;feV5N)n*oS4Ub|@-rSbX;OlCO;vEp-s7$GT;s1L|^}DN4uRmRldfDvybodPD(|gZ^ zKKiYCqJD^d6Ekblsh3ayjM58_{W8is}`n*d0o~YFC3p=$Y6D~7Xu{O+7 zwY4k~8H#1dUIeVy|4?_hdl`@o$so16jV`@S=weBXH{l<&_K%2&3M?7a)I2M&BVv-d_y2JDG5 z%u?=or3$*9SE}C=rF!`L!A||2D%Hs~-wlO&d!x~QJ>eSJ^t(OcVFsn_xp7PqW{0WJeAM)ZJLiKxioXvYEZ73PH|OAA+NS5wS>ZrO2G?e0ZV1{Z^ zZkn)r(WrF>)ZovY2{m{|4A6TDHF#13^cPQS#opyU$%_3iKEGoBd=S+4EC}ksfuK4W zYm>pznw=fP(O*oiK9e03s>4E`_3pV^+dtjWp?t62!!fMcQL?qIr2F@d{)gq{U{Sta z$`OXo4sB{zxo?oI3avrXvg}V&S-YXl3n{U^$E5z~Nj5R^bB$L3Tg6T3@4@!?!SqZ?`Qv;Xd0 z$p#i8*uenDUFbheM|Y-YiAqddHW1amg$4epDWGcy%@_09-TxbCdcz%?x@C{D`${#i zjkY;YoWzkYmb|TWstU(5OmQB|K6#Kh1;pQ9WAn3vjB`J<^RkCR>isEDNWtpB^ROM$ zM07Db6uGTdp{dK?(1>UYlKhB3)efbt;I+gDM9#aL_xGW}aaw&#d%$lXPM z$i1O$`+_;ikM9I`T4b|v)lTCcaS@v>xfsyhh{stqWF*db1L3a)r|l-%wN+7kew13p z?v3gMMw%_yQNVZ!`UNIbI_&Ejn!%=y5v^^S)Ahk>m3SR`s3T1TN02C_I;%eeLfBI< zsP$6lW!!tcViU50?(eIkEt`gDgS4J43@x*F~GsO741@RIT<)UW9`KG|M(J z;hSA$4@>BbHQ8aN-CxFJ&8zu5TC2sz6(Hoz7z&mz&gSB1gSUQRMuGKXZb{5-wt3R+bVdq#X743!r9Xi1?LjC zuAPE9#!=IHFwOHwn*(%oj%~XFJ92aK;?3#ex3l2sT@kShh)fk7h7y}v!Yw+vw5@%U=_K1ab@rLXP;(x- zREJKoy^yY`lj1>QtXpQzdfF-O;bIaWLTlSKSG1+QG}@Bdmz45ZnzB};G5}N9vVny2 zsXWwJ2U~%#WyWTZV++Mieq9(0wq_~du%%oMTa|8Xsh$j5h=^e;5Vjzw?e}SL@1zTt zql2JY8+5#M3rRe)A(UHM(g{6JaYCmMjyNVdzmvf6Zm!F?OKg*~*XxygMQ{Z<73iH2 z#O-9(9x>2*DW|GW`8pvkRH**7#C)q+ED&qbc-5y5WMT&MU#O6H@oXp1wf3#FgXbsE z8`>gb>3NxT_ATG_GowsVWuE^hP-^a)6$REC?Fp>c`2jEvr!$HdP%akmMX0?UBU=ur z*B;|psPC|q9r-uQd+GmDvSTh;{&ctiE$^^xk-C;Kz-Ai;nLBgQqW`s_Q|SJp$R$QK zLb-kTKuiZvhr~zflt}kV=Nd6uT0p;o?Xyi2UCvY0b<{Q^eZ6W&Fi5rF{fky3uEFYX zHTtJwf|?zK+ozEqv0|S=yP~5$62`2|tWx@hb|2(bA;;I%^d;JrT1|i7Tf_gq_ttP2 zk#CDW;~&Om|A0f!1bH2SP8PhRM@SKw3A13I6()4t`I zP^MDz8IDeb9B{TU8=B-B&$ds| z`iK?~I?Kd{tqjd$B6d~13L(V+hf!6=wL_f)7a+RR5V{jr<&$wyx?xA9ppGHmOmaKx z)^2rUu(bnOa~cavB2pKft>QABp=eHL83A+;U_^b5qZN*@r2V9-q=S$9+6fLx}0U%N|pXZ_6%`)lr-rg3NJl?@^sp z*F30s0H@mVe`j&*pH-j(H(g~`LMI(7Dx7~&Gj8!<$!JrPNu4KT#|ITB;Lz>neaJF} z+*ynce(u}SCbQ-)Mm){Ftapn~w|9%bTfLK%yPmiXX2$}TJIH(WJ+G+j@2g2DI93I^Z_n-s`CvZ2fDsFtY@;&*^X}3{umxGTxOgT3~Z`i^f zqz}@`{(`gHaEzu0C*tkZcqCjkoY6R=o1YFL3MV-k+lxsvPd9Q&QF2v`LgskT3Jxa`D8aT|&is-SYZ%Y#oPV+s2tbjfkf! zUE%a`P@3-IU-O^cxlcV@T4GX9Osc95>loz38~E?lAfBwqnbox0lXw-Z)kS7MHqLnK z7oMc8QvAd1K5i9i`AMIAR1I_2xC2oFTuWFMcPUShdYX3kQPm^IqK)Z%4$w=(*KJ@P z6m3rT{;z2?1S7--ES5j}=pS=;(1JV1(tjsWS24);YW|Gh>Q5>&0MJ;0?!Y~c8wxiKSxN%?S>Q}EEe^o?UDXzquu9LF?J>uw``jjJ@kV+ay9 z4YWc=?-(JijrLEqeOXLX+>-)2HLV*UUw^9)sn5oEawh}ez22_vN$=daW)rO8FwTTM zmNV-zrmRW-o}^zD^(m7ajD3(%H1u67))@C{aWGr3S{ee&fSPO6Y_IxN4%;xy>Dg6# z-yYab(B`%K>?-bWcS^ddFaymx?9+le#?&2nOJQc%xAvo(9I$N;bGs6tI1+{&@tP#s zwCRrVth;P`s*OJ3(F?GmPoV{ra5s?Jg8|Ih7=S11ud)Er1Ctxa(wAO202&O+nl7iI zk~c+@o$mN;;RpFKpleAV&R)wTHl;S#HGtzFGFe*nA01bPa10JxcOVYN*h3RC>UDVu z#~l1#U+#>a;&8X<0^LKwRPejvjINv^XLN-V7CX-9iaDbzqa|lFo5qvMtNeHHfiL=Y z=ZbzS-|$3V#|KyF{8y-TVm~zMgE>nzLRa9-{GgUo^+L;`H@6qMA}_RU zeSejo2^Bzshnmg=5*EpvN)aPEXYvd3pO~A4J?9j#kcn zrl5QkX?$FWyQG@*=Pq75^Fkw8$;JCxb4y!&MOB&WI3qL7EzDZ57aO|>|{#a!k{x+bjlGL z4qf6-zqq_wx=y0D2JKAoANIR*YfHjI?_O;<7I?% zZ0MA_;Hnnw9snHc$@}a`tIQKE7IXgg#p>VE=0EweNjTq{S+-8)Kx%CU;tQ?9o95Q$ z(u=c#bsZn_1`dDDz?N^%=OkIYD_MV#C!LHUUxb4pU1_Hi<>0}aMb81%<&lw{^?V9{ zu_Kqd!=W6_CrX{c4mIa)4i5*qvRtL!=o$*(km84zGH`9@^&7ZIj|^T0sL#~XC{61? z@?I4%>0=VkA#@_N5cLb;K-+f*D(WjQ@!#YbRo`l{H#c(uEIwepbNHXx!5$6}fdIjH zhN|jym>hPri{3UzwIODAIHXN{<-QqZnv|1 ztdC>-OfT%qeJEDxeVM?Cn^tK^kvk-PY%9~BY+|hGV`s+rfb4GP4dGS@e$5*qM+51{ zB#V3XG;I^~o%BibHkXjiiZQ*Mn?taZPe^2#a|eDyEjN44YLNVqovW+3{-*h1if|b= zGkiHUO{|R>1JqCY#Oc7yWd0;DOUXI-obw`4)0)hez_w|hsfgxhW5q|gZi`q?0%U&H zumG0K*y+Li=enb^OX46});u*fTLy=xjCp3vM;v-l`~47nui$j256fz#4p8qB58XehVb6XcU?;u+;HToX_8 zjqgtgPID0;K77Bw2!$x=+&d6>~P-?eg1&it24!cc=u;A0w%7JOxXjDl(o@vQYyZWzGp<`|}K0fr;wh zxU=LqI8K;55fk;g`%WspxclZns`bqLcpWAx{CJ{p4-<8O75@(;=vQ~%C}uFsBwv{s zGKIH=ZufXwe!k|%cAW&v%P|HF3Ux(Lm+__fTFh+H=Yj%O>#!Ystp`jo5eQcY{Ne=h zuVP`-V{*sJDHrm+o^Mr*c{Gf!231^$t!t1IzeojBpW$4msB#sxjtP(DUE|oN^x<#I zUSFJ=a$>;gdg;vc#i_?(c}vx>HO_c>Wn0%&5O!j!GznRK0;=G$#7}}XmdJy`B*2A1 zxcUkkO?0V}bucM1+wiL;8tfoyUW)=L3jIjKxPt!Jx_}N)WvFMts>O;qlXVbJZ9q~T zmhl?P-qJ(_WXj-7KV@PTr;l}>@x-%+&ui=Va-M#gOs}V&SoWORU_377=^9JaL4H@; zldjmh!rDx^eXgjyw;|Oh00fJjIUA2guFaj#2-kDAd0o+_Yh6~MYh6={D>OrZ3vhyf zX{~L;eF18zMuM239cm%H;@oJET2odgH)0Ezi1o7;bYZac$278FYH7VwR;HHY$W+mq zI0vG;lIc++2i^vY01$W47Sv&piJ?ghD#E!D>NT6-DXn@dSU^q&#bF)K=-HRnNzE!? z@|bW09IL!CSXGWy+`e@FW>%q(dz%tZRgBXMw`guG1JhohzEba$t(wb=!n3WKK}CCVgyaT2+Er*+#i&wt68ke{fr;9K32yAq&O> z+^24L%lo=b-p{gd*E{#O$GS~ECW+hRIn8dE%b=(1$KCYK`**na+$P`keoD8=TLlv? z1GmZdWXN0KHhHxW&B&15CeMYt#jE@_`FM`|-(e?r|9f#CI?Aqd8T?>=!TS&Zai6uj zBi-(RZ*FPN!-7u+`PUvynp{skNEXFP4iN{rrL7ke$-FFu@)8^Y53Zg71uTMANq94#FXd~uO zLpUju_#w(AgUwr603Cul+(AC?9?l^3&B@YY#9~?4)gV=#^leCp^lWR@xm8Eu_!@OW zaGb=qw)$al?t>zd0qXQ`+`veON*m)Q@#WkvOx_99OMF`V(oJQc^MEqsW!g@ z3iKj`R-0%?4x<_qnYqN=Z#8MPnatm2=YM+^2tglwMF~ZAQ8?$P(#0)Y`fWXuTZNmv z;gAd(JoHw*g)Nj}0uM>kFk(8CDs?S4|F{WWLtB0=_x%N>G!NXZZ`p(>Odrm_9jf{R zoK~)LokQU&p#RKG+YM)rqwYBkT4MlDj2Rk4gfr)aK;15s5!|-mOy3>gj!i??Ly^{n ziJ<4@^tU)IT;s0;#asvM>O|2qX6XJJ;-autppmWnRkPuxA6q0CW90xP??x0|EkPU$ zBLMYV5nM!8nHv${2|%R?3jx^};#vcQq7_c?bP&W@A#5iho65U}lYWgo(3L?YsgGxa z3YG&V5{xEOsV2`%4Xn#yr3f&Zi8YX7O1+M6)-|dY!_cN%6~XaoaV4&k)GlbvN32d- zDc3uS5HyjYpD34n*psD}jgd0m^o*GkYw?U*2(t(?b6mb=lkyhhV`$@J))CN%WL$>K zRm|`L{cwB|T!n}z+(+i2Grm~QQK#|M4l{Pj3%~45yr?&1uVl zPZYRlekWZP>GdR@v>Ib|*THJq!`yFN{^JYU#rlWq06!2?Gtcu(=6pqHkZ$4M_I5E? zVj4_mhTGr84xCG$>(94!^KR9WS+ z2}H)O@G;>_s8xmiphK)s9UblL!8+BLJ;=fs9M58BAZ0*keh!qS3$R?a9f8|bEihI( zqEJ`ONt7Fl@OPFNNExAYX3}8Esgx6KBX;~ zP(WNBnp^Ec?@IHBytJN}k5;Es$t9x~(Vu(!1}n1&{7Xd+gP@%>1a4d zDRyZK73oVFEI{jw>M8<=6u3EdPG^x^L_~v>$ZWxo{i-b^B=jm1l2Upnu`e3bwI}^j z8%A6|eLN%XZ}j=Td zA>|wYm*1QA(*EZE(BxZjSMpNG%TpgqkMgSdDO8@`XofoD4Od86B@cgwN@{afqI<8@ z-Y1kboIC46m-RQ5HJCf=0+;op%Gx(~*7+{$1Ijvghq?C3V7*^iPtq-}wN$sZpF&nh ztgP==)_87Mb%7;W-+2mIbzLP{|K$L+4$WPwuB0UESCzFncUG(=Wj(5_b5o0aJ=}4S zLgE{{)sjjcQzi8|+nb{jyAsk*f9E@@gpo?!`J^g23F=XH%DP)w2j>J@b3JAKu(DR? z&WeUr)(4@F^pwvOX(upPQf>nU(e5m340MBV+TB zw1vf-e6bqzPlmN!wVKX&Q~nmx0MK{~;@x8dlxJgFy@}DMN`dGf<-Dn4F;> zD*h#wTM_NF!Axh1X~Hw2isH@WjyJPhJ&r|7#Li|nv5~>gw>zzxss5|TtiWMey%gZ= ze$*U|QQ|ztDT0*L3}YveAgJ`1n=S3%+F@$O0l$F+ZH~j#xsqOlS#TKjV{fObA0GxI zQKw>UK2gOF*}luI#0X)MUrA$b)ciDMCk}x&jZt&X(hHEH_R6F#Zw-T63moC+Dd1)PTY3#@dEk1?S;RVi466ZX-5^ z=?VW(kWgTeXs88g|CZ=SKqRzuvKxy&4z zoU5xY?B@iTniAfiNnP0Qq#E`^C4>EPGIhjC2K(h?)uNrdz*Jzro?~B##|h^P@$jXd zKsUsI{T|eNS;+%v%#jSh^u9n}&+nejMyWBa zCGUsZd9_sFimIQhB*N!lLElW6G~Ns)$2!Z^y2noJKr+Ts%huw&v*q}~r^{hv1~{18 zT-fkuSQMiS4*aeJ6WwPEcx&CP}Fx}$I?q~FT= zhi*P*PHP z!VbwX6w@%pm}mf3#Z(GK?iRa(70DVYK(sEqLn}r`I2_%O?~d4NB58~@Cp zD8lDrE%{>Q)r*tu+^Zk!xpqaJ8Uw!IO4LqhsR?~lkM6o&Yx#gKu{GYtuP{T0M2>Ci zAfl9@dxc;u8eOw^}rz&zup$+c#i+*Z!4^o?d7jLyRI$6dm#tv$p8K93@c5tg~64Uz&Z zb$fcY^ab(S{%ry}Ri#iTff-L#Z5TeZlfRf-6V6ld*5YMxYP9e;9LqMxoZml%V@9O6 z;yL5pL?4zFVHnK1&`jtyMzg(v3q~y{OzQqw#Um=k;-L%FolxsAs2pBHLS;3BtKcNu z4yqC`n7`nwunQcBM+vnujk#ykqTCc}-Rygz7KL%m0KmK}iYxe9!Pk?{94+c6I6$+>j(UiD2oQj~x{;);XOtDWqZ)ZGD2 z{E7jW_H1<yw*)2@yY&Hxyry4hv&SDuc#M|us)KntQp-j_ z!ORG#ncUcPOd|w1x*8y_1#&swfruV~K@NoMBo!zLXMuGi`4qX-hPA3Xj)bxB0U{05 zq&1JP#-|2(DdpiB;U8w&#VBlt|6*C=A|rx)EX3DxF(UUScfK46_;UxX$6YEBOZ z2=`z`A!IP~!1fiqy#E%F+e^7RW6HtiRaDmZatN1*?cl(LJi(o?p-R50-fY&CqhUjR z4*X`3z`O4*^A-LzXBFXdA#RT*sYK^SURsMqly~BfhvXqX_skI%q;QYUa@aHS$gHwy z$H|(!KWUU{NV1`d+1q~EV%FTe$4tAE^T-}*Sm4nCj2CG_Xnipc@lB!s)CfgZRt0fS z{E=VKztv`BiA4~(>Ba;RF`Q5_ad?1ymp_IqoK*lD^9Rv=a2TOhmfW6xWGZE7z3PwS zsZ0z)Ev9rqKFF%|LUDDbsfa?|PKjthEl9fZEDP9r6#C;qpI3da^WJD^S}C+B&n~n0 zmukUlEuk|331k|23=%fcvRus*eMPb{$+{H14?BYOE0)b;M86HX_dKykZL2%-hr~o$1 zF`SsWt>vYHllmQ_>8JziVhkx{93AGUw)CfiloT9#I8xb>vNBMMa6PtWDRD-u1)Rg9 zT~y`Fk4D)+DQltB!9_l2Q$s!#jRvi7W+lKvR%mXyaXnaYt&}HzhMRl&V-~z2x+Vz| zEbYPYu8t*_MD9>>amBeEG9?>gTG*~X=T`6NX_4p}c}o~pIBw9<=Bc}=?<6sTsOZLo zq=f*7n=k!ny{B7ttI($XR(7`5ds>@ZcuyzaSU3#idzF9?@%Pr)v|XKOW?}xQXddV` zZC9|)rhTg`^B3V+iX7H%+EG#KWKGwo2v)mUvIBm4tJ-OgzZ8fVYr2yjW_UMu@zqZx zJw?%of)~y1qLrTwjc?*9%tlmb(&%u@y%f#IxU{TcK-{k)!4R%Y+@2=GoF_%phYkj>qf_ZnJY{W`E-eU7VaSb&-A6?Z}zAC!-!~rngU%EFv!_ zcZ*pn)wwXUk?Nk!7=}ex+f@0z?cVGmwtMrD2Fc$1a8!f1Xi0o>kfv)6*rsAO?-A@O z-C;5Xp#AJ0Z1;FiA=>E|3NZoVv^O8AWyr@-T4rx2h67LVaRB0?lg8 zK^& zd+9X0h!-kybc5OpDfwSfh+;quD03;}w|=O1%c{5!z120DMuH01dq}f~2!~BjgiTYa zY0ImR=Cn-Lk#6lOOtveUZ*W~@Qz@Fydzse8+l-H5fn@)|SJ@?m_Ap_T`wO&JS$1~z zGdVpYaHD??r76Fa0%vD)Jk*-m%KNkRg0{hH)O4A_MYoIPW})d-zt$g>K$4znA*#SBjXMLZIX0yk!!pir=8Um{qK)O+v-yt~*V!_|t??_tNTenAkS z440Y!7rG<>|8fI9p8`C+4az|vh=4VyzRu32ZB$_{{{1tnmheWWQboLbDr4o$0Qk|I zVq6QyY~g1VFL)*>E)~nT?egQ3i&Y!p^6Zd$ArE$bm6}XDmB9mGTlnbkb_7W6ycAi;nRH(uATijw3uo0>~BB&*t1Xe$R{!T9vZ#@ z;6M%9Ya(JQdY*$Uml{sYg|L^^Dz%*bgxY&!YVYzi8wlY9Pyc2o6yKb5Uho=l$Utz- z(mmX%a)XBrr5EQ!sG>TeG8O~(l2(NM+uu+Z$Vymz2SJAYkBpm~) zjE8-xxD^Y;mg6ax1Y%dGy)^}{HEZ2gVI>7YBjvj4Wm}JrpnLQj9KyN8GD$p!mht4g z4I*%>(?V07Bw&|TYr+7m0H4SM6s`835g1D2=njJ-g$R|Rzf&N%rDZP+g56^ftR)bj zo|*)~%_^at-P566HEE}Kmh>!1J0*F`MMbAuIEjz5f`-525TUM%YN-toO1mn<^S){< zc$D|rSCM@u^h!@~$Gt;?kUf){l1;m@%v&}LvfWpYG|cS|Vo^1Fw6AU$re)q1%b4Ph zt5wh2$e=Nvv9C`6IT4>Dwaku=!Qx0Q8^DhNTjLmbVDTU}g=ktdNa3^mVS%JMSQ0j! zp72YLJqK-IP{4R9Yl%PJuxnByXy%~84mC6A4$Ig9q?UE}b?a41EX4~S&w7>q>agn- z{={(Ht6#Prbb8FAdEw(*uP|nUWw3yP4AaHmZoN|748}0_6ai*eexRqPaCP(?JaaH%Lt-D&BPd|CH!Qd!V*3fRA9CZslzQ{02t^Kpo=A} zF-?sSE!E*xtX8U4ELy6G6`Q)#YN^tS?X*-_Em&id>&9piv{^9Fs$<2XE7DxU=sLBQ zXPtZXGp$%@snBn4T(L<@WlURB&%9z8=#-YqEA}ughkooxEqlcZW?r$HN(uDcidE(= zPor0?x*9ve)QZ((uh>>g6$m_~rHYj?tx=xXL%M~!o|ICz&J>%jEtFMgFFddpYNPAw z&wGpWv3Gm_mOziVU)XD;*-C~VCb}oyMeZX64zQgUyB5V}pnup@EW@LbQpWGZuPIl+ z0JgRyUVv}Op`#!(djojaBQpj7r^3yM;pEDLVL?l%|4Bl9$tvLsGj}eYxRNba7)8rk zX|IvN-Aq}ZAZu)&(1HH<71`DGfWP&L*IYfSet?S#IgGdgx2P=#j}Ijmar;UrI+{^q z1rMuzqX8brs2b(1^4%{&8#K=c3{N?4vGMac-O`}vzzy>1P{1bOsV> zNbMD;-+}4?G$f!S-4_iAa1-|OP!}K-NJP>^@)v5EU}BMlba2*8HMjdMgG)Oo&A|UA z1qzx0eF~HFdwg|9b}5-2XwhY=&r42E-?#I3dzvwKRt{|RwE6#pk>zsC=^gnfR}}); zex!)w8KK9=66wYz55+UG$3T|o3s@gHD?C~fmUz6Q!C^-1G#xCYqWO{s2fl0z#Gjb; zISm_dr&_Z>16n1E&}5yrCXJes{2oBv9KGrK60l_hbjPF01W5puKq=@R5tI-Iy1G={ z!BE8=WFc*{wB_o-1WY|}(PdB2@{a1gplwrw!UV(Ha!vlUZXRmEr~z z8*E1eB7T+e74D0qJG|oibCunQ_iANuHgYMBdn}do?-&_l`na*vpLI_v4B_N7EyK^~ zB`XekjrtCd3-7{CPqIAu(T4sExJ{|gNVqcCH<56KUC%1XoY6w{L-#CZI(>GM%pS^X zEaSs%vJ2fNCpPO`+cKxtq(HF}gK!$BK=DdiqwBf_a`ddiaFLc|Zz4g9JKrG~1EFd@ z>=v(vMye7K%dSrg%p`qcvu6VC>iQ%|Fx)O}itivAT3mVomqb6d@i9MVDomv>WV9Z~ z>ZBIL(o3_o6tW&AwpzHsm4YA5yYKOmk_*`QFqcA4=2hTI)oVAQ9jg2Ls#jU zOp!G77JCmp^6P*dWJ#T%#twEKq1Ke~f($Mm9E9u}c|Fe2f+pO$le=fw$P|H6D~cZ+ zFPi@%^A(^bGtz*GD_5JVch*jNKr~0WTx|FU^qsmFB#->~GZEuNAfGxu7_OkiTU%or z@df)@)BtU}>%WmF@r;bL>qYw1n#IWXDjxWsEZ@Ae72q5ryI`_Yx!M%;$vMuR7Fb_+skV zP-=Z#>K~}=Z}JN$@qY3yOccC)Q(v8(qq7JQjN>JNo*rey?ZKvjaEBcc7`kCZqCL&c zfTy1oMIr4N+8Q=p#VT&2Zjs7yH@Unye+hjEfs4Mu=$#Oyiw*sRa&~=803A0Exp9c$ zCfo%)m@*Bf-*zyS0G=_u2Q*olXXaNPowEufE_ZI~o1P3vkO83-ri{cSvce>HWJG{o z_tU$t+6i5eofNzy$7h6o3UcX_)4`DJLL3I=93U5OMevHYC17>Eg)Jy4z_AOxG1dW# z=;HcB7ujIoLVI`auIF~2U9>88`{?R>U?UV%Phv}A6M^v9rta+|8@_EOKOvFsc14&u z<>Ul=&r7;t^NDO$48$hW9-J``u_R{9E6lRvi&=9$*f!7*!Rlm&Fm+cu?Oc&INWLWC z9a*6Ouo8usVLbFzaT6Z;#J4KYjwac#1ZjYqm}ix;1rv#jIU=HP2fg7(=MK<8?QnSI zv&gxSg;^frayF6I{0#LGXWO~s>wt^S9bfaZ$bWqpU2&VI&+cq-7wSV+@F*q;{uEnt~Y68UczjefzK1!3w4fAGwxi>zRhxlP;; zWR&ra;=F+}jtTJ=;pycHml;L7<$z-jsM*>t=Mhu@RNY3@%OWBn98t9gfLK6arQ~_- zKyFA(B496+#-9@QIo6pw%m=HAb}rfky#=F4%tO_E;Tj5us7%jwEQ~81j4Kt>()GTV zqGRN<*27PM88lLnJ&vw`7oa-%<7%ZDArJ7YM?(o(y&&`=e|Nke)@z?wFDVFAjAf?? zOV%?e;?boJrLM&J4IUqi&*b==G5|jg$?Wt+U4iJ)Ul9ku9x!!R`gdOKt_UhMev(6Z zRg3SvY1|)R^j6(jT2_tsws+@c{_i0195vmfu7#D~DSl*AmR@8EnO<1=y;uJqre{!E zR4ZCHlbTM>9~Bb0t}$%f#6JfNmc-(T9fd**qF z)Y7GFcm)p4$ZVbU8gd38>L zgAw$h^?vOG^tZtdO;fI!V=|&+hz33`30kR4BxQ5M^&cQ= z8(PXBz>aTcJDXYJ*BKSOk~x;4`Xw}EmUQ|MyUG>nwmFcc1+nOv5I>_?6qaeA^aZf9_|w{>!1S-}9*}R-3#2{CU1Pc>VT^ zb`HPR*Gd7IWPX?2zBt#M!4@uF25f1b=cF4U(X;vPBt;T$!7Ngh%(6b_n%>SJ&=CM2 z9Auj8TJc^$!A=fgDOW0s`rD zH=^$oB8l0Mx+C?1$4WRdbCChVsvM86%_ridBM+AOASDr)J1r}g>+F11z~y3#;93zB zF3=xz_X7Bf*e)%g!}$xokaRtoYxdvw0TftlWiZCgUEIK|Y6WSpyo!Q?4^lVj=opWc zfQ&pmhNXeaG>xjG{f5d^kWY~lgz21lr;h{Mc!OLar6ihy@aa(*rh`~r@PKpdSe;xp zbeFqgCy|oE1#Msy(!8oi*bUqx6EoOYry^Mf2Cg6z9VkOx$PaZ{9-%G?Q6LH<#D{!m zUGgbRy1L*FxheIU>KEM*cq1Av*{R$qe%YlLp^gK_Qo0jqpzUo&uhnHsE8OTS?O6$I z;_D1CLy=?@7^2zjKhwv6W+$?3!2!=$L9fYY;D|ca2gGlqXVZ)7MudhlvQy7z&qE!% zh3VqwB$g9Dq>~aa05n9_4GT`E2>Jspk~HGHCOB0I(bY9CCO$~5F=@SvfT5&KmPnt3 z!y17YKrl7S&dLCQ9GL{#=%75NX`7Qi^|LVA#P=ohF%tENBvfu@6ig;3A6kbr*s-{o zVuIFYON^k$e03RiI@QaO3@7Xx4LLcLajKIe`0iCYkdy(V1(EF@OeqDZ#-bZsrvxL6 zOK^pAJ7I#RJ}|-Nu!dJQ<&|*sDiOI{oNh-xQ>k(lkcX9|2CdK?S5USQ@5LSL;;{Ly zD@TR6NAie();lFJ2wpt0vW5E*I(p`PqO8K-sb``rOVKtA4Nr_c_o~!%19Vf(sy96r z6c}JZa6A=BHU+&*`o@o)S{9T*HjMWoRl;3;9Ck*QTD>Xu{+L3obm3V^N}S8MoF%^t z#TRhVSL&W^VF`=Yg+U?`pb3%M*Iv<}nVI!b8~^aFZwxM%yxG9#(M_hlv~}(cGjMx( z$arfDt#30~?7t|cuG$4fA|)M4+UB`GIYLpHUlEz*pqXL_%@^X7H;-PvdO~uN9eBBK zZVRKGU!pg-UXlw8G=Hbw>QP?(7yf_w$;RcQS0*+;l}is2Vs8#WX*>MFC+sGaKne#AJS^|#W>r-xF!)|5e%aVV*`_=JKEAp zN*~d&_9ND6=*y&)Ia0@J=%qIn2|wx_3ys2DX_9q$NN1ewtbHEsjVx?51^c5u1rV4g zt$+nLRbCZIzoy!%-$%q@p6+DM5&2p;{?zq#@%+4MetVYF0?)j0_xmLfHT!MRVvJK5 z!wbz+heT0Icm_jJy*|iZ!{Nr!;>LomYtubDRAxj*3%J(F?`hf{?hT*qdj6V0^Q+VK%*%ljqrK=YtJ znD9gW-$Vuk=P0lMmS z=p=znm_22i5o-}`+9U*vnDRY70JXwU)n#I*(XCiOle;J8)KZh$dafN474RuKKudge zphJa++=NDDR9I4-Jlp6nqz>w_AxWE_;c(siY>&Yb=>D_+4n}Q5_p7ickz3WmN34s>km3z8(V}nxnMS}-56&sT>bv=E8w_Or4 z8O0}SoqBoFhL?LbHp%Xkntb@EO&;i)OaSn{WT>v|!)}l%CtBCn2R42<#&)7p&ht(fRLb9tqn;??Sxv-f0Y?pSlP|8b4 z83t?Qrf=tb4Wl5tQgP>EwQmSPgjBL_#LwGvt!EDb60nMy?5*s^h_{Y^4`Ii3|4t=7 zs&=1UZjlfsPd>iujnJ*gLyv3tWOgi^`sz7u#5RUS5A#p8Z*d;>U569%GpIMc1Xr&) z^5>xZkaPwYY`-)T5ZMTbz~~D?7bJ)H`U>h%j&&H@3Q|Yb|X`>?1qO@7!28R6SA;%s9tpJ+utLCQ8}JmmeuRHN5Dk zWe6deB&QShNn)6dO;OA{EVCsBKN9xC)z_Q(8t|HHu71vwwh(hSONtG|pxE_Ut;8Lw zAgHL|O?(rX>l7cOi5kHZWe8H*iIGGiz!Mr=pCAt}5+Q4&_eN!EU}m%DJ5LY_OX3uAyU;$ydK8V+3s( z9cRznZ1hVV=z672s#iJ)lP;tV(f%gdobD9@eCieJ zg+A5uNADHTK~o92gwWJv4PHS5*Af`d!S`i)(i<|1VuRG_=q>ZJ`n>>O6sDaZ5EiAp zu$zKuilkuhEOiAnOH54K|IZ!%Rj=rcQ42WWO*KX*S;|0Z3H8M_Ae1brG{FBL6q8Di zV3W#~zK_%TLoPPirMVlZP~FCC&rz8-*xSRN81{cqXU{Hce(>F__`#ENi60i_ z7ENbSTm!7r{1s{b=u$#aLF?1zlC#v+VxYH#+p zzYW&o0R%4TT~AVWuT$f?8u8f{>Qne1+K7|~O~oz=e!lP)*c`yKCfvA?Ec4aY%k?&2 zLS8wRF%AiAqH=Ld8D4!BllJ9yZa5u)~h z>XB>`4up3U3cpL$6c4(fT68KT^@^g&DG-Rj4OD+2{eqs#v(8S4WZyzZc1d$Wc-1o6 z>bJzsEfFO(%Cz)!V)|kZQsZxufy#OHHufM!?1z`8tOQiIhk8FkbxVL(A1X2{#rN(- zHIY?crSJN?SCHpk z4Fw61SHG%P;c2=i;YKDk_L=H$WlqD%&X8jU*sis_ThNiws5$u7bsa2X=rnKrWo{l5 zlBV;WHRBz~-q_2A@9F1rQXZfzw(h`unz%B^**V!#U51*ecXo+TFFdJv!w({|eyWhO z1S_&H1e9%z5z8hvsI^jIRKj@%?;${!STTy2B_w$@(?6i-qGwlb=riWypio#U5Y*fg zZlF9xW`c)K7Jz_(i{P2_L*@ziz3{$}Y*%E3`Rj6*oHT|s*!+&pL8`fg9pPJ>+N_$@ z!AC4q`9g?^@!PIOkK)i8#h9iV#g}$9+A#tp%&F7}YqbS3XJbIQ3s!+rzz(KMU!Ry| zit3OlWu6U-aof|pC#)2U2LB7dTrqcSxqM4Dj9`PUhBytT+UdWYBtjE01^@6w(Xo>W z{t3kJF^8Fk99UuqSS(7mYqqM9nvUK|wB$w|){3OVPJE#bi`_%tOyA^DM+NSpx~s2~ zrBV+k`^vV9nNIEJDbFFsj>l~iMrh@{HeTJzWq39lm?Vt~MesJM23W{? zmx!)}EgXOK=S=Cj_bz?@>Hj3#RvqGW~ykL!rO7k>X+Vq%-(-Rlr^-?ms>Dg$` zTregtRi;%Ju4%TaA-%?<>OBxK$N{xipRm1#-534}BEi^Lk`H8;vDCMZ26y5&^;I1Y z#)tAv7$E!ZfH=%z^O{LEFV#s2dODC8%L&|280eGyByFJ5q1>5$s#Fs3jmR$c0LaB~ z<-0h1$x^P)pq2?NzR;sd^B1+Xb}oEKMTNTBlld!+t@PL+L{JLGHZev?#PAPO&Xo?xPevS@4D*?pC-152g6xo2LSF=2K+~zbTu`+Yuc`}M< zpFw3jX-?}k-#(%_?Fq?H^9m|U+9Rltw^e4y0t=f|h0v=oMWiN8G+4I0LsG#BJZ&X~ zGD!+@a`J)5?BUYzmEMn7qblWmFM0=oEKaR7t9>?YO8`<6})8vV-=oZRrsbx}*v{LWp-09ML4vLXRZg zt1i$%B8VO>!xrh0ruPIr632*&<1PJyMXCkEF^4=A)a6O4jd_c-EFw(Ol*f?1uh?Gw zwX|St`+8OV1}lxq`C|yWW;)KjffD!ZCt^itKUzj9Lr<5~vg-Joe8g7bof@{~Vje1M zrWdGAF;a7>lyI%tf7?3g|C_zP4!V8L-kj?8#R?sCL9k!8U5VF#Re~3RL*hX&jwqWn zS9H+OgI!d7pPxZ2Jwus>V{l7qlv0QTD^ubT9nR;ubSUqWAJ(P z38oKq1?PfbLGg?I?F$@Z&&gilW{ACU7CDVlT#Ry)xg(fAUJ1Mj+0;(|7|71Bik~kkhL-lzhRgh;`yL54{j^{d`VlG-s!lSQ5|J zgQ5hr)~fon>I=}%IG%-*(AX8K5B20o;sLQat>k#hwt%7g>WY}*LdFec%6T4YgIIG(KXwZkCg5omuT%?jC-$m(SW;R;&x22|&l8#`Ay< zm;bqj3U(|GOI%Wbt-QhH!Z0iM6uZd4CeTS>VuTfW@{EBduA>5e?HPsZ+9!*7dGg3im zr0iqFCf+(+gv*gUqclQ+i1FzQ1WYk3f|JHq=knu<@p;d3NqR}6JL)-MkNn?E1Lb)J zkXHGShURwEc--{m=YsLUJEGjV0KD|Zo)z_y7n&~tTepZ65fmnPGkUEPYS#|up=tCQ zvBsqbxxtaf9`0o^8fp_LE>|i(wV>)GVhK3m(gi7KUTx2-fC}T63I_;i&8gx{Udl5l z*f~zZa1kV=EU){fsTRxw?5!V}!Q*dh(q>T=z!?5XFV6Z6R?nT;u5~#o8|l1iNdOpB z805B*wjCnMO4Jk*ePIR~d|+ZdPyeO+|Ig~?xxAR4FEh^XvAuBq0{QTUu%;@hjf$l4 zRD%~lo&d1$K1pZsKJFAJX8Rx!purQlCM_YLwt!?OQ~)}uR?#fp`7t12MyhZ1aP4*- z9AuBVCYt5fB6Ry9a}yyqNjR)NjNg@_07EZ$tVE^+yAw(`!TcNHkvqIIumuQ zIqna)0u%zoP_Y#+!V|JqIVbKishwMEzWi~htli9tKwCi-Ly=}XM8;y3Vxat&Fmo<9 za>boTVB!d{1}44X#MVN!o z&k8JI#}?pCV5=VkPgFo4HJ_=T*cUjb-|}^mTa_voM5W*9e1X*zSagw$v4~RPjy%si zsAsu)C03J-uo(WgUcN~xK^!SSEq zq!Qwgl}3b_u|jWiJv*yZT-aLV$q4+EUa@ZYT;&BzBha#!N=GI5o9q&7uV;|9b3=Jm;?BK2DREMUsyvp<4+U3zw zq(vFGRHz6L&)mLB?tm8&$Yg>SQ_DVyD=1B`s!qk=qS5rjO?r5G7KgM0=5aMhE<1Qf zXI$A_^W_YGJ23BU*AjeN%+Ai1;&wbl^_zmtqwPTFnh}cbX77FL*h%0ZVFXWxfHuFz z1JI^g0ddR^8I2ecWabu-psEpVH)iKUzOmwdd(w$ zb>DU6S(!}qLr(5%_9VcblReXqdRI<7Iw^)JY`_;npwh%(_OZV_q7-L75~$KVNVrzB z)O<{%QYgsR(mokJJar*fL2CAg;`kI1E>Cs(dp9Hy34rl3ssxlm7Fw643K)+59^2QW0V}+k$}NYJt5d9;QyWw>{gk0 zT#0WLcQPcQ3cRv={p_YhB?d>K=j}Jo_1!bBB((l;-*i>B<)1BksIXbO2KoSxD^F{F z$eN5Lx4O$WvuyY@1fWqENkPLnyu$$BS$&=h?yPSZ3(*BliME;ZJsnW;UVF-A@5R7? zu}&=k$@^JNtrBgSV4#InQe*|=B4zy+at!dyrFh=EwPt`$LE+iH16J#X0%w0x9}!+` zxXh7Ap@4t$?Grs)`*8NY9b)S-;8Llv;csR(7DI1$5NyWW& zj_iZr-4pIEr5BTjk@mJeq-QkOJnKab+{&)z7uMDYKD!*sBZ7${(R>|z=0$J|{79*& zjhBEE%6P%Dj!`UYaY>2rI+z)8YOyr=(cpb zD)F=p##?}SWF(!V3`SIozQRm!p^#iDNf?m!(QaIV3qW~>>NzY(U^=3~>g_-o?hAs? zH<3D>Zy=-rImjC{AAwS43n-hIaoTO^nK(C?0ju1SRG<&4BQ`8nAUfyd42SESrqeM% zAD33wwuOWE1Y#d+r;*;m&daQbZ8WC?g;ZJAJt4;xQaVBBm&}TDak?_IC1*fXv?}6$3Mwf8>fZM!KyR+Vo%z(I*xDKXFqq=Z3b9QO{r1rs59rpC_M`<{4 z?c3*0J0Dh0t(tjMA^C*LG%go~KN)N4rspLlHxU$d(HP1~s;Q(<;rArx+@ssnrG0j)(1HXax+(#P7vz7zWc8c9yq5$6 zC{|qtcZOT{m^%w7C})LyC)v+i?o2-8=FUJtY5prXGLm(y-Ordre`pMejq7q*B`9<1 zs-!;l@nEa?g`W~%)$vpM9)7Ag1(re6&5UW^Z+V^P_-@Qk>D@FxC3$`Fi|6`o%uQ|h zqN}iN0d7ibH>EmZ?Tc`W1c;X^#Y^cKJ);@MhdMuuU3zK+R=8mr(NssC?YoYlp#??b zH^tDr^hWrJCd>NMeF<*x6h`bS=3cA-1&Wwu}1I-!;XuGT7RgLbk z;mtK)`}DenIjQl43G8yL$XVnRm{|n6TA9l@Q&_=}k7T0jb3xvtu!@qLNVuuRs36Gd zZRLV6T%DLxwM@D4Q805C;W`}K9IFc2tuSo^M{5O>rf<56Rg1rcbJn-`5aadX&~9?Z zc`*T_rtwpvB{+xsZpMJNYWCKTC-I>nUCnBhWQ6B&4v>6zV{g#!0?8RznIQw<-^mo2V*zpvY5C8w+N&HD5yasN+_b(B^BmG!h2S1Ufo- zTv~x(*4FY>!DU3{w69YLy~7&<9}ft~hp!Cm5e$;+VdnkGN)B}xGh9mJsBKI1ABfm{ zt=Z2g8`24L}7*FxDeLg2BscEQR~w3U|DaVEZ~cB=X~e1ns9|I`&2y*6|S> zIQnf!CjQQ+RsrErYpY9o0@2DO8OPqogSGr3aqUtYINJMP^aiHF{|xj7zts;Xv}J^? z$=xk@?AHIV+5MsWvcj_}!*q^WnJL#Jh!I^FHp_NSfQ@=`(rC z-7m-8kh{5IvuFH{1SMaMF{va<$4BDsS=^ygd?@ZP7a<=ue;9Xj-1TTF?&i5eNqKwR zsTNd~Z{`j~e6v~hj)D{75}{P?D{I5#BvLeQgTfKxBJz1Ux8Ho=KB&}^iS8C}q9VWA zowwIHSGYjDqg-?#J(};Z5+I>9Cn05U91P|~Jw{LY*n{_F;Ty$0+SUWy6Il@l$~-*2 zDOPS#xDuxn(F=LRikGLeGBa{@+G_JFiNKf9!+V*dNYK2O7aECZVWfVQ*}~M3XX>+T zC|#eukw@AJh%Bi`Z6|_c;9qT*!!(>x(kb(UuAs&UD|dhbGdEm1>S>QvXRds+gduaR z7=|MlvO0U;Xs(TR9$XKLF}HHGFN>S_Fslmw2ulF z$L4b(1FK%>x-nn^B|P^>gX+IS8tdK*>C~XvMkqC5Wny#Tvsrbk&2JuX+eN4Cv!@b< zGOJ>NZqt*RU%hSiKjN~KkRF&v7<@@t+`z)_h-)db@{&Wj;IDL?6#4*{f(;ME{BhL%7M2199u@Ws7 z%j18w(8x~Q>NYa0O+}Ird?OD%>?S4o)SVK3z`|kT=mSq+D&Tk%JEAQ1*ggvVP$s@2 zGpl4tDZPcZyg;5Ig<=D36qDa5Q>r8glD~@WFxMzx$9L|Vn&U%qJK$F+ZXGbIX!ys= zs1semn9M7z7q}wWEGYXG_BwqxxN?;9WucNV_yVy@we~Ej#Y3bU0Y^bftx~9liDN+O zY=MDZ-y?ERKO>*rWdTnfk5|fVfafZznb7DR*COdkLspllT4E00x%;AUF$(sFVpBkTUF=?Kzp;8Se zRqw_nq>y%M(4f)~siXrMQuP@*i)fNJ4C9BC(M0jk;i@5{p4b6lmdK7ZsyuKKUdTv;ovn(GVPfIzuVWC;@LRCrPZF@@Ek#!U)QM@d81hr|ZroI{y<4 zasIL$%{HvX+NHFiGhPs?g-VlAc>mwu7ycAQ({Bzi=*X~YXc!ln+z#YM0^04rcT zY2)Ho#AHv8w2D}|4q%J`Vc=}o?@p4wO6nanhHV_UDZvbowvQlZD>r-M2xess zxDd?r>Tc-{MlB;sJp(Yn*%@ZtHT0k>S~s*LUn~1%bET7=v9Djov^q`+zaqG)qPn#l z&8tlk-?RPkbFo%U9K@V#5qf8~V2N&+H>&5gW!o?ArCvEN)ylC4Q7P9UK~-Rx6+~P& zb|*S$oM#OKWy*^;&~E9&e`D1&+b)AAwf+TCx1}L$q9+x(id4SD9!Wd<{X zX0Sb-+oy%b>D>P&%AB6W6CcifDs}CC-8y)w3=7YjI-Gk+Ly|-CS;b3zDV_a=zEWll z9d1onQm?s%?|r&x=KWZE3tdd-PkaBFIDcA*aKILXPn7xQWI+%jfI}o_hEBv9spX?% z;<0#wISz4fOxi#>*?`>%!h6)9`T^Qr24&hiS?)v%SAXEtodPoV&=jr~R9xzJ(-!Ec zwC|%$)d9$=+MlOpE*8k*K>L(um)V+_V zm#TO>z$Z*YZa^qak-`Z#|N0;O@%5j)-1)K=*6ICX*)8VCJ^EfF3C~-b-RO zi{>M+_BoGr-W2denYtacB-{eH^JftR)(@--X)%~w+YZ5Bps=$2M)F0FazT;qM6(kJ ze*-v5!Uu9cI07Fx?i+aHtPo^_AU+-$QStG*?4suDd4B1?I(S}iZ; zj7)9U$^P&pT9@-V2l~i1F<_HIm<+ayO(`yDVr#k7*?+XI=mSe!`|T9gBZ>~B>n`*!PD$&?symuO3RGJ#JvP{?cKquX#LfLYwDS+M>C2Vl5{OV zfPK*Njw8jk9-F#_c$hR-CAm6Hr^p)U!*i2A5HKY{7TZM6$_+h>3Q(q~is;V@y9YA~ z4@RF>);{pb=Re7AnY&TN8~akZFU>ar1n!mFVXvDy9_{`Vk9zTFJ&R|z=-D8it>y7- zzn*PQ&m6x&kiVXt!ZW7|NXh_P(U{4xYJmP6@!i8yMBEmBFog3mO~fOJE{OQ-Mk0>d zLd1G@BM~nV7@#dC;&U5`xOWFq0E&7$(^BLZnA=FiCCQ3g5`j*1+mFhQZuf*x1RRQP z&zn})0}PK09E`qG>K@>OW>^!7aq#3%c52*r5J?E?_^d!;- zxnW+agF&lvD8dh-vetqqD#8LT z&d8P`Sz+m9g{ql0lX{}3_-&^5I_(8`nz-ThsfLLGXFlafL}PbJO5%4vR9#}3YG2g1 zuBO@ACR{{9B5#DGBiAAe<%Vkk*= zBLAc+pqf-L3(b_^Sp9|lqfCE9;G~%02LQuUyi!(snmYX3t9Z*h?Qr5*^~xb2f3_E<#RF|*tPD*Yc4r5<9KA~QaW6hEK)5fG3Rw`U zxqkUs#ar__7bkWXzhln?5+>*#7lgBldv&FT8?udtNj}#}^K6jD)?94E{VEg*GS>aA zL>(QpuIHpn@LBU{3s}DBNEid|2_=_g#o;fD)^eBN$p`6-N`1=Q?A5R6I(q*udBag# zW|ufh%db^^R7Fk(E*_u*?eb}xE@KGpCo+LpR{bG+2LvLzPhtmy2Y&$&^E6l(Y1-JI z)lVeYAXv?I5?o?BM2ZK2{Ms*?dv~vcMHPm+sz;qAHGrO_Qj^yn!SkOO$kdv0Bi9QkaM-jli#^Tv4zi zMakU9hx|`YAog-Vr4{`YblFCzahF9_Cc7-}HchEdF@v#m=h}6OmB%VOwh~rotgHlL zXpgLjqJK=H5B$m(H9W?WY_Yy(xNqVl8-~tQs~YKPjMW852X?+mJ&LfRW8V$rlUx7-KnD5hPr>?gb1Cv18UEKu;A>`cva z$Tdr1ZYMl*mn=gIyPd=&#GQJSDG&rN-wzNO;8z>5DAug+H#)SouAUAsf7DwT|Ibr(WAfUZbQ2*9GC+QFn` zFeumnrN93I!B|@8@$&PzGsRDLNMA!z5T!VOqjjsDLIW1~zwF)r-1hF_y`2<=J%RZ& zCXF>=$Vo@mgdr>)Rui`67@9DY7Se=S1!jdC!pD>*%zPPWUJ<`0S;;!CZAa8`Rn~FY zeMBKX=^o~V9Y?#G9Sm?WHj&QjTw03xYb3`~7`;lr|n6b zF#ZeLop84hgQ{KKd$@L*2(*AgLlj3jYUYSd;OQrGA}(JU$94E+Gf zMrPj~rINZ)2p*_s#nHQBX`MEKq0k+k2}sx;uGD{G2!= zl&!Ou0FulC7$0!|>gh*-mxNI(`Hej1@5^-e>U!o9dmFJ$!l#K|iv_y>%gNfsH)u32 z0anU2HT&w3zW7m@sI{?*vx5Qf38W5-U$(YrPQ1{ZhKo8vvB*yCw`oy7+R(orJ)zp! zq?IoFH$`oUBU=WS)XVpp2Yj7$uBY6R07`Lf^F5M3GM)AGJ$%4xpiE_P_>*s=bhB-! zb*&>j5b;)Z8j5g@+v+D#>(%9pIoYX3>ELG7Q;9Zp5k>)n;A1TaeD`Q~*8v!;nP6=~ zu>E(r7*)&wT`qE)`XrIv&L&(v4ud2ujP*11qNa6uN2r$ia-UO@@<2j`KKvG?kM6M~HcL0GC_mDSG- z#I_zuCOnh++2Ix_8F|B0NH7EqQ_pAwMns7_q-~b1O5q!_RO!?&(2dFTpxt3gaLa%+OBiMX*=&vB^c7)- z6QOB5GTh0dp~*3MiH*bAPf7rG6O7;<`%$_vJy~6Dyx7AJAmx<8s)_EO)%K0mWw&<)YUHL?p)Ar)B=oI7IkQx zU(n8Nsg2*7Q1QjWvx=`DD!#r|e93Ze6<;6T(vsqYichBBgPn>GeCSksT%+P6cwfVg z%32j)Kh$pVloXK6##O2Z^;%y-El~5a=5DOTqdsf#_-(a#sU9VUWPX#j4hqS8YwY^g z*tzWx!-WFvL#gY+*U1H}Av0NWf%GcK7vIQ@#{7G~`5H9Wo$b2GR`i%=24aP#?r{rz zQBKP?hB8qGecj`9L_z=+q14ogYG787GPlH}O(^dAO(^cxB1RJ|U=?m@z8k`xyk(rT z1B2|>STv}TIz5k3Pgpq02>sps+@-6?yp)cy) zax>r7e3B(6%aF{~oYrt9Nh$!;{6(kK+3F#+Rl7xOh`^dzx%O(ebHeppukqijuHP+~ zeQTOn+mivI#kSfsUj}`iyn$t5Q zar;=cesSVFv93A3O6B8`x~fA)ii>a!(j@WU><>F^W}<_sD(%?j=9tA|`_y}qf|6NqSg0fDNI#DwlgqSl3fg1}_ps6m z#x_ayMe{82NN^&T$Le5$>*OdLjf2A-&G)|@0|%2L}Ohf=Cjvgd^1I)`4g z#_Qwg%xCC~f+(auc0@?(%!O@d_C#k|K*_-+5oDmWwU||$To3S-)z^8|8noXvJ_U7v z3Le&=&NW4Fo#s8P64Z_j_(yZF5;5g~88$J1(O5PDGt~gq1{b7iLm;DT^AbdGHacoOsYL}>)AZ2Y zO*PC@0}Sp&-E{uLzx3N*%r55QL0!CnWizjH94#%WA5fo{*0a^Sylm*hWlHX&0Ms#O zsWPy4_#*jaAr9Q(KkSD1>|rX*E+l4~`ZKwf^)9@^`M5;wC(7X~n98Y$3cv7*Q-;+? z0LuXUMsfE3vX}`1+T}s>gqbVGCqtmYDKbFQI~s_Q%LNqpN3BvZMxJg@alhFXT+d4^ z1UGZCO5yEzlxjgMwxWm~2tGETtu$odhe5cKRS()-tIuTKiNDYF78#ZCnOTzCCLQ7x zP(bt^&1#;I_g8NH?JsIp9{jFLxY31geuz1mZD!IOp@#?lbJbf4@K{=PSWj?EOfiHF z1WxE>Gh^?0y(giVLHsDO5VR~I5=0Qi9h#-fNY=pT)2jLO{jzo%Q_sJw<_V>M}E*-fM zNfa}EK>BFyb4*Z|mio=|^l>r~?RBsztPp@mLP8;iJ^Or+VcMk-X15mST4?w3fotZF zFil>mtw@-t^bph{_GW2>-cn~tFiq(x55$aUgX9Nc^p~t8!+}7$6_rGFGO@$C9;Tg- zluks+NY&=ZQ>ADXyvuzarW&9ZlDW_2hda~^3jfQ&k2VbnF1#w`Zek^(E^PKiPfl(A za*3wdVZo1zOEeR-!_RqM2CVHEi8eQ;A%>`~Sw8S+ZfwN^u_$R~m@x4Q8g%u}^!sO? zB7gE%XacR<(i)fjRcV8ccg(*)Uj0+%}1`N-uA&kW)R!u-W63 zR*&d?ROh{G8mN_sU(=V9b{ybtec7F`Z9`E5j|}yW#^e!okO6HcN41y-EJ_VebxQk) zlJwZaLf^;0WCN3m6zmu~l`-r1=xG)TWqJxrfFI!CIOVH^@MIH5$MKro zgzC^bD0EJk0%_uB4ycvY{$fKf>Eg^}t72)pF5-62st~5Bi)>Yg6gI))l{+{y?jRdF zZEonC88r7NITcf@6sH^x;M{Y)4# zxF)yeb5!*V=AMV{<3rSS@L3{M;8uPop2moyV&7-?5lndP#dcyGsC@2{^+2MOtp6eo zng(vASK`OV(Sf}AAx3RmXbUajN?hHfn+jCuBRnQ)BL)!QNZ*X}64nqGm1+duahLcTzh{0V(LVMO^mQjTw*v~N zgbzzNdcvrgSRC@Q3mW~!fjTaY8h_LjLAWdwxFmiU1N?sIG7E@2tl2Mydni!H3f4D2 zJt&rC@)hUJPoJ$!@DHVIPmYa_=tPaTrMXLbM96Kc5pi&hQIz@8Muk7kv-ml4wRz$z zNo|a)U%^IBECnx~1!53N1+&lI$WOI6&-0lxvih7%x@8|J2D^H8S?jsCt}XsjGKH7{ zZ$Cx#sU}$7!&l*f*J%zbnEM z@FDz)yp@a3krc{)!rzltD?Ev8-(gcDuqF0wMqB#)u+Xu!rBUt21KF@P9!5-s@fLOx zSwMj}$gAR=^K@Qv^PmhK3O1qVEk~d{?)Ph(XFFNfFB4JPIc83Y$b6P@$f>2|)Z0`f zJe2lwDV73OfK2pUN@;Nx`bDm8c1wFvH@sH2s3qkmM+biK3T1z3IE#r_?Nl6Byod@_0p1jO>s|

Q_(3OySU2%z?9`PIrN(+mI6I(6ihEM(z{NhSjxi(|`?me5yZi>y+qso?)<@zJlUEJt;Mxb!`t0T!23af}Xk_uF;fo>8KXbS+Y~02p;ryVN_pO@P#{cfjs0-z3j& z$P+h1gybP1^j{RlD4-j7mZ9-iyUnA!*W;vj$dWckNWOLJg;xJ*Jcz|#3sm+_yi`|e zD%4X4p=$+0jFX)_6+CiKkYzJywHGxN@t7n>3<@PbX*qQdpS++M(a54>8`G)ui^?OQkkE)+9MLR7T1ot+atW9_bN|^AXf=Jc$Rui zSQDD$)N4KVc~pFz(j3*RVgG1}QDV%YfhIAG0!>DmlX?%wJZ#{gVyk^DrldJq zPSTvfV8S?&6mdyO5$T?!xoEZKfi#F(r~GV`=BSSJG#Za=cfxk`ZG6eHkq-h|NYz6H z5EN7{A;_8ivCJlpSwtvgHc{yj0v#ie3~HIp)hy96c-^bcQ3J~w;)KMO32~Mtl4n^( zDb;&g@-2o3JT(>xY5ol%&Eq;$NNY8VUpj>TC({2fR9^`6)KUFEEwEG#Pc~X-=&k*c%=Ct z7_DvMnOCBr1j>EhDTKPVaf{A5B7Ukj=#(=iO_G{sw(I3Hk&k-0ws|K$e>3!95>H`4J0h zZyuSreQxu3d-oTUK!!z9j`qU?`J3xc5s-cMK^{PUreSQ41_FQXOD!A;#wbCxMKI%C zXEwmNdww_=KNGk-^QaKMNj*4D2s5EA5b4u1rvTg=1Na}v^dG*~+d3Xx%Sq`9Y^Gp8 z$Y5?qGl_T0vi~GGpF<0IaDegsZS#MfZ}Z2@J6YF_PIT&>!Zu!mDC~peM?l4cTBU)t zm3F``;<~no4rvL20EXZ+;h{dvO?{BH4@n&?<)g~CC14TYsKwc#a-_M#Wev_{cuEX4 z8x--fmSvEL)kQc?e~61W6qgLZFyHXgiy6qRc8cmovE%I06UAC)UdjT|GRQ!l$k7I(;N(yj&J5%Aofgo3QB>9AT0I{Mbl zP!k}54V8(hY%noNy%r_uNwhMIW@uFXOwFi1b+4o}E=h-N6A3A5XxpL%nt{@~LANE) z7CL-vadriY#{bCf*fDn3gWba~gaRwnC}x$J0!Kb+Z)2yqm+W_7i#;cWPvWBsvEEon z+m|v#!j$nqHrvzqg^3qVv^*Y@#Qh;AVzEu9;h6V__hnomZd{}YfGSwTx)s`~*J0VS z1#=;caBM}AK1Tzo8c||`=I@datHKr$6x1dR5~6DdFz2amJ(Jyockuv) zi*_jdNwG3C3$fs=)6=yVT&{ND=`_jXc9@KN$m18=Tkz(g75T#=&y|+qU}xaC|Deh( z2}-=@5*5>oh|RlL#*PV-{nD|m4m9xR-tdj_einvYbqHf%0G#^q96%BJ5o4o}}+ zx2@lDq}JV!ntqVfL|uv`Ai9!zj3IIr84N=$^j2b-t55Z^;ltv<0A#2-0wJaM3&h}n zXNV-OwxB$zkuVgnumm=<9t;)THw?QEi4*x~>4ScmNS~J_2uq7V6(Cw6CZItz%hrB^ z_y$$0c@P7HQrPRvfmh^OxtQgcj3EBTE6@DgSfLAwc*2u56V^c3Vl3cC`U>kz+6jTK z3c=Ds0ylgmVvWPg z`d&1&KD+&+VB_Q^jQGOpl0ABtKwdbD?)~~vl`nhwn(;zmE^-h!S}#HZum~6r@k6)_$sxrt8m4Y zKtcUFsg5gyg|?h!S|nT4*!S`B)Id9YaCn35+Idb8ys5(VKp~-_{2>+en_yj(h#I4{Ir7lT+t?V3nt&ty{Q!#C$aPe3-k5dEWmwP-F~c0d+5knHC%(L{ zHl_3j=2H5HRY2EC=?`aREn(fq4Cl^U_b+*3vh#G0iqIev06MM|SnzZNu{?sBKPKj! zY=*gzYF6h7Xqvl3ub&a5KA1JPeHF5y{M^4$6giw1Bw5NfrF@kKu@rUL2m{PYapQVl$ehYq zmpG&COXeZmMXn{8O=?04xwdxJA=PbHZPCE1q5*>HCmL|Q$jw{JS~|)Z+bXCyy1a&J zf4;o|{byvTP=%D-TCU|vw=*L>n`-1Mb=fuYc9}P!7W+u2lw3=e5o1>-d=+ujys%oG ze}jq;P1o{8-cp4&eGy{KJM>y4&Rw0h4p^ueZS@%|Ydz4w@huP;q z)$6b!n(-wx_-jld_@SEC@;cj5{h&9hlqBTIHh%VTwGA@CULUD#rSD+<<<%`9U`emM zkE5KZqnqM(>9Rub_}L*DP%L!;S&~XiozLk!+gNnp>P>f@Ko)ka zp6k&eI{1f(j)~X3>4~(mi910(mRMm(7yJM4FHJA6W?xB8VFj>J=O7e8=CF-f^(O{c zEmv#aaqZTwM{JG@Fq#rBOkAteI=fjLR~eH-&0;HMvMc+!q{UL!H2&72>Grd-!69}k z-^&h6rV9CyEvY1ShyPvs{gQMD+Kji!mWkBd8+IBW%kt`JbJOpyXHDreuHi_2Mz$4e zt8JI5_!HL(vXp&&Th`%3$v7FFmNE}!0EEHz-;9T)H;BoHde&~~6s$2gn!r9}JK1_c zFrEGGP+G}_;=Aq2nXQoF^JRjxJ&T#vzB17ef@D7#>QRBU(X4*1dG$Vgf}HyE(d;Kc zseD)SIVkpOO4;5ck+sG1M>CRwy4;2mDUo%y^6mRR`TQTPXBRUoc5sjBHJ{IvmOW0Z zb}!iPd5$dBwb*NpR5Q{Y1?S>KP9;f9HT0Mp;1+90=U{iwr+dbV2DNpBa06-v2%7Ik zms9;9w^loSpm2_|hLf&n43=%>2Y-g7d$sc2wNMnLVQT32Rd0IfpE})a4-hpqc%rq8EB}-gx^H96Y$gLf*^dy7qtVr@IC7GQmIxhn^T$yR( zlTjjzDk8ld>F7BV>=n&8R_0F zhW2@jH(1;KCTr71Fj)-cw3BYygja`r(N)-%-_-b^2gC`dyJCuUIGpEE=Yr|E zuk;UG!163r#Ux%&AS)z@SHkaVy3j!QRe#T?thwUP$p1 z?CXD)^mVbrFiM|6kC1GE2O$|}QC*`{%j9OxrCsUJ#f7>t663VK14WmGJKFs|%$ zNIYtdaLgyR#!>T#f!OD8$0tZYIxY4Wx#l?sI=hJ2s-B|2q`B#;O^(U-m_6OSWWT0j zHR#19Sue@-GtDi3iIPKlJMlzo^klTRI~#LKz? zbQ`3_Y1#-XtW5}y?@KUCc&N!WpUG^aFkcet$a3MiuK~LvII1sV2moQ5K=)Bk{(;6v zrW$8X`N-TREa0kA#D+A6nl`D;ds-=^i9Kjx(WT;e zQ|(O~Hy4|Oq%!NFGGlf`#?Z7uAi7XRXIU4si(P7~FsDbvcJle^$vf>8dh&Y3P+rQn z$|fy|L|@3n^D2H1P`=lElQINP+IJVx4KBc0B63+GmZB86R95eh61M;|DRF7|sHiGR zppa{p?B%V%DmRes^Xki{Pdvk!PGulih=oZ|L0^WMyjA?Vm&GgG%MJBJq*!bZqIE_p zEOY5FN&sVhB)@C_%bd-Ptw$R#HA3ipB@;&7pj2urWHZ#G z8yItBTEL`0U*JCEnoBAqC1oxl>_rA z@j`k7=YGP*U!XHLM>v`l&WTTiFT~vq*>wlSN=mrQob+U)dAUp2MmSoCSY;g+PfVT& z1s8`qC5Z@+ax%=doDOqcaG0w$LMmY8Gt#fve|^5GFXtFFowzf8^^@|QQ}lHj0fS}R z1&Rt}9i~85&7=?NkX1!c>$g$EhwUKPH*P@j$l^M{z59xABS_{%0V4hx4XwZ`N~w5Y z6hJnIvCG%C^%KS)n<)Ec&ug@2h~(AI#Lfl!u5gMiFeAlLDBvvih2$YDWYO-nAr0Z{ z`|NXmfvFB8$eTZ+?q;FV3rQ9vY1M;g#Din@?Di+$Gn8LbJtG`ejMik&w05oX!XkT5 z+A{>gZtFc2{DJ~);Rj-M66htg8}-3IB`1e5glUR{V(eH2o#j2H*%i)>Z^!%Y#qegM zJc4{(3b^q-*3Sw?K}0~BJta)bEqYRq3{TV-dmbAFp9MWUlovRO*}0hN7DQVaSKY;U5i<`DVPN?&^rw1nyjtZ z2+Xv!iW)Q;c2p7FTA1!=Dbn}9sXIDgDD|gQe_qCux4u#Rc_~*E5#cNCUyW*rD|vlf z>MNsU?Mn?>q)|jm$m#eX`nvXuW^6=jm|tc&jTDTQwGe3x}JWg zz&tQLj^hO8$;Srf?l&DjFmIx)^L)gNKFz?~-}Ur61?KwnIF1vT&p9?QAMLt$Y|MOo zx)V<`FmJxKo%Zh(n0u*d0x6CYn5P~anD=*GJT@>NobJTa49tUFPrp-OuKm(K2AI!2 zHZX6a;^U^7)17#lf%#C^)9)0R2d2kyoS0c38<@M_eEh(?iLw*R<7o!w{;sFrDKOWk z$8ns%eD1M<`DoY0V=wc^r#ta91M}v$wA22b0&_1lO(4Z_0(0@$z`Vcf;<17G;B+UB z518+q;4@`np2+oj?*J6gGq!BayN*KIC`Z2Msh1>)z zYeZZnH7N|d@Sz$OvVybMH(Sf)vq^HLuVD}ETq$XR(J2UA!`5R*URJBs>7;IDG9}3-y+h!v>gaMBnXk! zK^pCGK8ZTLRNC1B(WG(OWps(?7B922ztS?)>K)UBN`s4fwYt4%P!n+-_8vei-GZv_ zrmsdA3L%{of!R-l+R!;^JP&9kr1Jz2cIdbE4@HRpW0mwd>nT4ros4myUwKx<}6qhi%hfK%(lvP_$sM!$~PQXc7#vtOgi_Iok{ct8{>Z)hcSO z?4Te4AfUh;7z!3cT7_PM0VeDO0tc`s9gOV%k;7;6qB>y&j#mW66fz#*s@zdyYpvZRsoc@)qT3HHyty3nn0|Nmc zk<940fb+{o#T;Vegr-^#fjzkXqrKUHJqsJKXA*ZJ81N{#V>A}-EId`Xv+xw+&Qk%N zEl&w}wmenf+42;EXHU}qj+1Sm(SdS9c%;A4)eM_}QUl`ftStRjn+rcdD?O4YvNL)F zZNdUr51>t$4ABnhn3|3PoAfxNkGIayQAk}ZU5Tni0V9$S>RcT>rKQ1hDR@oL^^*mu z$->|%#h?kV)N_g`6mfKLND39fs3?r*99B00nJ#Skv36<@L`LBa!}}F<=Va`yF5Gdz zxS(M6I$0k}(X4KcdZ=of&gq_Q2@BJf<~})-Yb%-ZT=$oDKWFb!8lG~}?;iTsdfW3N z((v#^e)qB#0d7j15q|gR(h1-a`8m6+_1p%QP$b#!o{ngT#PG+i6uEXz7R0(_J6tEf zd#11LwjJ*OK*@IcO18r`cFKk^C~1BGFV#ELF?g9l!X5=Fqt)=KAHH`36k8agB?b}> zT{s#HQ|Q7!7Z?H;0vDzrxe)Y$Y5-+4TM6Of{Lj>wJfbP@lcvcYHE>(9EwV6X=!R@ zNvTO`sfnd!`hS1E*L6R;H^x!g|MmY5w)=FQukZCeU*C(x1u%&0m1#?Y8@|FV-Y(5z z6sxFwFf>6`P*RLbkt+x^%b;yrvK^q2NJw_ul2ug&tlPpNM;DF^3!Q<==<2YvWl0-D zEj}r}afI>Gasphs>`pQ`mp=$qnZmZTJBc@15^|0$uChBxZP`(6F_wyD)Y+U^-|#Z% zxjC*8$=pLRs=6=F0*@BqZ5j%`)u@Sh#E*R(jz@zc?M48qI;e{O?oWPnT{o0a#Gg#|HleNLbuAd{1ypIe0L+E*Lje|azM#A@6_uxb##p^9$Bu2EUBX_jc|^x z=I<(B;f> zMO`Ionb(}<9{KLO5+&INCfO1{zhv1Wy}*FQgkjxynnx4i9kPnq#ixJ50C@Vz7oNMy zM0@_gj!^9|{)dVBrGM zKa=Ae5|5Zf`UXN#uNV(?sZu3HDv3%v9$Ug|=PqC+vaUGeV=hCcUEIVPk$p|rDxA)q zQX-wOzlyEFNuMT6vuDm^RTkp+aZR8Gp;#dr76fAnzR}=1eo14-5D59Ouz{;G9hPIQ z!t0Sp_^vs!f^jEPAb5{xB+vo(WUV!(i>}8Pi*_+k^g{@U!3bQ|$WU})WysFvqR}ex zY}M2VX2toHc^2l7Xsen+MVTpcQD!W1v*MCgVel>H)1(n@&XzO{Fe3vpk!9q9AQZLS zhlJsj-nN!46jp|onbS;Fh&O~unUN}Vst*yW1E%X}5DP@(3vqE}M7)VBW3f@$lt9=D zP_VVuH^61hcSe$lR09>Etm#h7SWijW2RWy**vS%g%;O*;l0uC_|S(!;36P*fkqTM3I5w%LYJ z2eId{hg)?TP=iZA%)RsY;1qpM7QUWIoSd(x{yuB+`d@h3A$|I#p0-b) z9@UeK?pDfOdfGaDTG-|3%X->8{WibL(?9;4{kEdZ)35YYD)T-)mD=*36+G>qmicEr z^-Z51(bItR=|_4h)qaznN@Xt4(~hJpTppo4aWmi+WaPsE3+2kXuMHOoN0<=hBX97; zf)^SAShP^91T)z8b5N%u7y~dUhVB3$A|$b7temno5|_2%)57@;z@!l_-ppj3hDkfo z*d^A*fYvA3BfM9Bmw^xu!F^bizM0L z$YRB=x#%Gx%V={YEL!Iw?#Ug`ED4gGllQpTF5gQuA~-#*BJ_$ccS3J|iuKY3#TObg z7r>}SvZRlaz`~TsOU1m5;3*>zHouD2LqfM7TPS}Ok(agKP2`oRi(WJ%^1|mCE2>M7 zioAvg4a6PZaE-;g6)bH#?`TSQ;a4n=0@|u))qz0(T@XIYIaK{l*vTt`w%GJc>nVt{ z&_>I*hl4&~qc)ji=dssrdpz&#>@VC1NF=RQSX98Tq8%xPHUNC5;LMZ~j^tbJpcXv% z^CKChKAh_Zk^rJ08bDhDeiex6EOz{hOo;H&{pVCwKz+1hucE}Wov;l0mk4Ey9HucF^p(}ltc3rdkBpj?(x+}8@x7BUv@Qt4dduK<(2VfZa-sp-kG#IChQDDADndJyyvVaKAl ztJ#gI;zPhBw?CUS`l32aRJhVROEM0U5~L~AAC4ttjSFos0#4|oJT_uFc|~)K3SE4{ z04@@KluLXcU3vnD(22NsaGNWc#!lPqM6;{FBSpoz!NHqq#H28wNf@tyArsf)hl2&6 z0hVA;o%1eVqM8c-%orj%nm|Ebadr$pLvMFQzN8LbAA|Qy6F( zlfteBkUaWorlm}3p<$m|oTWS+5uvn*(BV;V5Pw0KSYU#nv`DcLjI~`Jc!^R2C>OjH zulWHSs!mc-HG@eLlS>&ibv!~pDjF(3?bFR!GNxXKmm z^0zxQ?uf53PL#<)l5qyOy+~f5>SP&zEbI#}WnN>sCKrc7O`2{GVmA8eYj#Yy*g_1x z8LpE5rKvPR!G36Q(*A}QXH*23gSPOt^E@AOpc=>^+4z1}vyOM68Mv0)e$@FTy?lwx zM4&p+3u#le&Y&2pv*#=;*|lKxSvGxccIGC@Nx2eH(K=-rnmW}iS!xDbdK`UWQF?u< zlm?I&Gh@+VKuH-ri81ABu!;d^S!%>G3l4O^$u2;lFqnV@I-b5WbOrF3v|v;!$07jF zp8K&zVOXkoU++N}wo%4lSXR@%p+oS^$axxik-$qu=t3EDi78+fsgExwT4N$!DWg7? zp4AYKz#k`S4ldD11400^_9e`dHi+{k!3dUINgnATiHmR)94rX2j$PS9 z$Angl4qsQ=7+*pv#cI{?bCZ@51l0=#u#YjrMZ zuNY-ZWZtYJU^Q%uM2cl_*c`!|7jD$buHkMeSM7!{i?-Vl5heS3#8WdRSwTvR)74`+ zx29oKrDQk1qJX2vMcU5q<(H;dqoXreFF@>MNarCe^Qka3m9wJc^z3(dFs0$5+Pn{BNSip^P=PAM z&dES!V$5{5eT$0$3+i1YZ8i?Jia}Xsnx%aFVV)WC8rMYUu*8?bgXxV^cED^)#SH#q z$lUN-@6q}KIy8r7v%MTFNI|Sk01SN%Cqy=CP!H)(8Z7c|YHSVsD=ba1I1Td0jp!D& z3gIraX<{wh1&BW7E*z09^P4UPQ8)5d%3Jij=|YRl_$ALmK3s}wgfTanQBCJRHK2lV;9~J{)gBj+1C7zH z(q)t-j|2zt_tiiLh8N)X;Yk(XGKcn75W}R4-UadXh#X`W-UFrS-qS8Ag}Nr4QA(+~ z=#~-|TA*Rd;aX^KEn?K!)qQHiW06fF$2{fkeZVw1(&n_!J>MNJVQWzkBhH_KHEfpT$Fvn!i6BNHy}%w;f(&x?{?0jVP(_W=WbFZ?U zTvRTbfDtG8dTna3O+ANbgx&6_Oz@ofJ zRO8$s_M{anZm90Fn!_5#QAK&OnMZigfrm_GY)AC<_@0rZK-wb239Jz|Ca8Jb89GTfyMvW#!ah*(CM&Rz%nN+Au-QI|zaR?i?yaCHo_#>Bd7bRx+z$fB|^ z$S-#VZ4cD~@BfeB`fuu_LuR=eP1WE4RSTvq&Xi?Pqhzzuo1siA5+(bc_k!sFag?Ca z=0(C0nMMJM7zN12Vx7*>IWh;4kztB|>G;e6)gXRRZoLr>W9p05*+k4*yt!TvP_Sf@ ztR;<=A6ofAa`gg`<>sg&vn5(tR0|gK4Y4{3g^MC*GlOXpE~mqeiLN#Uj@p3!Pbb+X z9A*mz>fCVT4|HY2kqA>U5;up&Bf0-xadT37yvS8_J%VeK*2M_`+IlG@!r`*ZNeZ(k zB3x;P8PB6gfg!)05)Zldx^#A|>XN&M4;6gB8M@Pa zKxny?SJME5eW7m#(P&|q*j8c*zbHvjHlbLp1gN;6*kk=iZRkm>Lh2dlwR8dOr#qVn zT`|q3)6#4l&?rzR=+hLO1s%d4|`dz2#fX$}+%KK9jTw9xK&Lgvs6M zM@c&{Z2FAkM+0LdAxTr#>gsSjx-t4 zuOQ|uQ|(XYji*4ZVKp%R27hAxsiDTetY%6VHz1)xxpsEJ^C z*t!?!mZ6jNI=$7$lX$bm@IbrvsJ4+yx?de^JDG5KcNS$^ za*S`c2%Qgi204@eNyIAThLIE+2c!kr3^d!;9jf;Hx}RhLiS#};&rG1S@C=9(LgL?x zUbsk@blBvxbO$CYU=h=84jm==3#5gCH(V(Mmc659W^r!ZJ!c9 z0}z;VttzB*0E44RniR030e}d#;KiRRR_2N_(?%gINYDro^F}nKaIw40h?a9kG%j{PvN;J@VOdLBq?Knq%UaU3 z?69Os(ps%0P3N!U+MTtD@w^%f8A=A*3=5JrdgV~DCRr$0kp$C?*kQ7QT@YU2V1TqO zTTHYmq2AC236xMg3)(YZKFEGir1VmrORjNwguF#)mhtRmj_$=johJ26`5j%7ib9o2 zU7RNM?D;iH>ZBw}?V>qb=#x@Cq7WT1EWW}oYeu9Du(tp>VLUHnOcePB7?8o=I6|?A z2%5~bI8AeSkGintCS>%B#l6Er(Zo#>_b zpLHr6W1QJ{ph(7jItu3Y+yfM}k#h6N!XGp6pA8DgR)(>WJ6Gklsko%2mRFl|qN@Os zWabpt-RUA{W=UR zA4dCETEtK$Ctthy0%amwS-fKLBe>nvB&;cvLObMYXroj*tN@f6JGfSZ%48?Ogqd?1 zE}>uI~XC=9TT6??Ty|(RYmpTx3t4khy_2ntRnn5|GUX<@%d-FOF&)!YXIr z9iA5Q%HvqT#AKbWg`K(wJBO1{bRIO$TrpoWLAk-s?-~%5t=3Y&tMs$EGly%|s%AJ@ z@V5?CxFwLHNzZs(bMHN_(MkdRV7cV(ca{XnuE{H0%o_nXlQ`K~h$-0v>HEvIbtj~` z-dUInEptQh6RleyRH|=u0jLGweDkeN5pJv{@4;rgCkvnDTA6;gs=lxDJfcDWUk6lBvwPFG@@o6&MLD0fLP@as_ns6|y3 zXdanKfiC|uuFg>?#1C8=lzUdRvWi9-w=5nF4$oYj?VbI}6PK2gi5!z4USDM@nN)$S zb@G_5Q^m?jYaPy8u!9z0jcAMG47=3I+J zVY9;`Ylzj{*;)0~^b}PL;;tyrFp@vWnt)|t8F|dI0K8I-x@%%zd(;Kn+DL^8VnzuT zYgnU)9|gRTmbY6-68jt_osyX8%@C?hFQB0vc!G%JD@!_`&T(E8B=;U2ouFabfCp|5v_$OgC zhh~@3o&sfh??(DPFj;sLL$1RLwDh$WZgMdzt#C%Q^eEs|(NL%I2jk0frnJ^-rubin z4E<BySzJAu^co8HXa+EPk<%Wb6oo1=3KDIVlH}UsDeew$5JPK@G#?Lc0 zH{-~)89Xn#zWBPlbbYyGxj9<*Dg4=M0(xP=|6f?`RR;ThssAWzq7wgTWSQx*L+jlV z7XL0H%L2|T5;_WSX=1f%rJX2~m7%<7%Sz5mZ?-9TII?L48bjklGX2uyC?A84y!|FiKqsq%wUi0rxgBaG zjNn)rp^Y~l=}_h7qmwK*O#&g@w&P3R$v`?Q?hLlNwG5~v+-qf^ zR(#cr<-PxW>vWOM2qS+-Nz_J6?d{yhb2OHQ3ibI;SAu=M-#$A#yp9G!`y>u1wZhYr zVxUJuL!HL;DqhnVpuuD=+g+ARe&P)5;g&A+c`kWSFX#d<)EvnwhBktO3oy9341=qg zFjxt+WEuW-C8+eQlagY#HB8BM`bJ$<*7#K`>gy^>@hD{T*B&H68>}SX7aOBFlR2L| zfF}^}G8jm@&VUbG&#HrM&b*;%Wm`r&d`VGOkM}5PSKzfWpow5;HtpR)IVupjYQA8ed z^Fl;Ew?8DPJr~kx-g}*lAQ~&$Sl#J9NQ;;Y!){Ka%Zg&zrrKMvd790%oyN8pCP}@S zj3IH*nOE%0T@$}@sC9I7|k6c3U2=&;$?cc| zVo&j`RbW5uN%Vk7!2(1su_-iZ8Gsm44I5xpsn&%SfrG~Qp0dINA+n;KqRGhHE*u6R zs&W4umOWkvzpZkHW*#Z6w%xIPLL#PhVALS-nm~~wX0YqQmM)JJK^#uWVVZpulR~}_ zmd{#SCGHWoQEZu@1ws>3E^}aKS>i`fMQlEKm0*^fUo4wnc*-xGkIOCz2QfelkC&M8 zE#`|OXyC)fkcSMAy4BLx)gmDCOwk9Lk2J(ZD3K`svi2hB;3xSom!<~1hsH6;McAtD zxS=CRipkSloUpuHFZw4RlwLf2Juj+~m0Vnk`AV^4vM^1-;DdF7coC2}Bpiq(0EN#k zxngy$#9bdF{BMiAb}p1%Y%nQgpdm*;jZ~Pj#B!;aYmBlE1#>AXIAxmrLJP%QnourX zos4tgX^}C*_0$hM=0*fT2b;QHO6n0~c+k)CCGH$uJ32Ras~uBnTfh1w5*o08u$^8J zHz5+)0!(92W*c{lWrb?cela?LfT6#Ulck>FkB2Y;hWn6`eEM$NDnb zr{%^w(LQKsGE67QGhtePo&pvM?}R9glP#-4dLxNp-iP1${U5eGfyTvEp}qO~cm8tw z%c0(E;oq#7cjxc7)r-yDiw7TnXa0?mUTo%GTzBQSFWpJcm@ZYuQ@?$9rF}QrQv1ctibR%nY{%g5+euT`k+!f6#K|vhYqo&Kac=wpB@JVuPS$oCZGvScB zz&ML7LlJ7T^5pOk^wg}9*J^{ziloVMt-eEu`Vr%8NT#ci1fLYJPkYrj;pD3Y2A40yW~YMC1)fQDnvI(6=Z# zgHD=WLyIeZih^JUtXzTtb07x=W3a3a;&+*&_-R#y9hB$Wf$jJgdS0$)O{b%wg~Ah_ zpOnE4h7t~u#=|!LEz-1!gEK9j@syI!coytSFpiLf6xG7ak4{KYUSkCHHhw--O-Z?n zk03_Ea0j2%UyG@aI-P^4NW|>Wo760aG@cen1XH(R$0_b}$TDJa&He@q%I)T+KXkZF zP*1ynNt$P{k*LlEa;$Ok&2iOHe_pXYFMZYC-Vq#EozvTj?A!MC@VM%{Ugx{Mj*qJ@ z)9a|~Yn4*Ydup0{e(eDZE|9Rqt`0T|-E4{6tB?G}^U=1>n9QVw+HHd&Rt?00S6(xNGSws1Fn@ z)rCjapPWacqm@R`-kA(@sFInjqAW$#TeyV9$t8k7t(8t2ViZGJiYhq=9J1*sWKX%T zcbF@1Xu%CZL?1|H%IYPhXjYzvI~h7&k&9}?q!Rc5W=mUXWdf+`15gNL7?nPFP#E@> zL}(0c4Cci6+Iaql4rvmTh zpPEu_Q7sOCs{sLu{=_;*D`dNw2%_mMXe*x{dVWZIHP@fqa@09<V7fRHK*|F1Viy+b6O#B7YVNp=e)?5n1imSp_mjXTA%}m(~Vd1_obuU9E z2_;Z^RAytrGIbh3!Chw0SHyBP(M$8gng$ znMkkzS(P!%tlDx+cOo5k3!K2rzYfJX=>iZB2@T=WwkcJ85?CsJ^R6=n6zp7nqR&BK zy`TS+t%T_8#lZC`=B6Ordbj`b$on2bu5_EG$7zF;LF6EmlQ<}khw@+Ma#D|4t5a)L< z0~qCSFe7|pqo+-RrU?bX6#GasStvXf1~%|fMno_cL(&`H5M&unhs|_^pu{y`(fE%+ zL1=b$8%upuQmYfd0}DFWl^#>0-CQ-bri77UF)3_ez`tvr$Bd`V?lhQk_`P3mFszqe z+~!|A7&i|L`Ht`ZFyuC{cz69Mp?C0#E=@;gl)vcGB{`Za8^bdM>)Zf{NO+UAHM}6f+Z2E%U zZTh<#vFYdcZqxs<5u1K-?>7CP8?ou_z1#HnHe%D??_CV@{zh#2e|op+|JsO6Kd*NI z=HDB!>HqBAQU72gHvOaCZTf#UV$(0`U4Z#;BQ||r?>7CTjo9=Ldlz8ZC9z2!+XzhW zCA~Z9=WfKNf2ntye%?lG`USn)^m!Yx>HqFsSf9TUoBm$!HvRmK*z|w(ZqqN=h)tj0 zyRd%YhBp0C85*+jzH`YfDE{I%aAcM`9{q)L!P5Z==*`ebhYFnr}l2paAbN)dL+WPKa&pBXF}?1aJc~*dy=-()b zOtgrc?GYw}Jo#0Ml*iQ;3lnvp-^12-R z+NHs!byL%rFveS>X-%zWZE5`bNS7*YEsH|qFTFEKWQEqSw#)}~T;EhwHddAdT$6zz1zGR~%T%2F$c&=G)DrCF1A0PxJu>LG7= zrqym&IO9QTLewPD%&H)&vB;YB#Jph%aRw*XS}|ds{&{=8I?eS^rWr~I-#z*9Bg7*N@DwCIjkC+K?9%2dVv4K zBH0n58XE(wSAqth1jVk!zuZN>CFtqhtTN`(>eC`n5f&eVdCOtP#48#NRw|3_AiPsv z>~jbWEkA?+q6`^1fi_ow4xx1p(mD2G88j=0EKE^$k7IJ%MGp~4)opW>>E@nJgIV4i z%$QIG9iR`CC4{5U?+&cXgheP3^M}l=xP)L1(e@$Wf!%|5mTC0to-Mssl~ohPkQV^2 z8l!<%l;#{hX=Wic2MkOn?pznQ$5!KDAt_xj3L8}n3GY74*bhjqS?b~YnlSRA_E5EB zq+}eJp?3WIwP2Vx1)js=4{k2%4!Xd0W|_wErz{5XZ4qlt(;yZ407Ves4xdW7Z7MmT zE_C#*;Fv%C;-E@Z@b;pzT4zBQrQrdWPA1umkHtWqYQ<=N;a0!;yj9y8}_`=fVhEWa%#(s2B1(IfK%df$8MWmt5BFDGE;ke0-D4sc&Eu85mYMuF; znnhDDsX=JT{WBea3v$E6Tf_^r0uU)df-qwQ%K8D45&~0+AzUNV;5IEeduc@6 z4a26)xFA7wagiy_uPK{Kfy0$*Eg-;FK`uhfgJmBTf1)Vs>=0yAGduEShL4g>w4sm+ zyL)m3$tPzfk>acCqiwFIOx}f){X6-Ji0!n(>4JCZ=;9F)x;(kb!bG-j9ZUq{%RtI> zF7hl;OXh0g83*$b)=!5X-(Q!d!22>y+uaOU1euJZ$R^DZtEgLZ5wO6M4l7v3 z%-%XFv!GPkUZ*}m?Nx-2kYKCItv9uyR3Fe;_;Q#!@Hp;|%E3LAIJv?q!^Xpc$fe5m zPr(Crcd0U2LOhGod$%VB@(`V-7tT~b2|yE*{AfRuYD&O6FCd6b2}bv~BxlLL#W*{g zTR1fBh*x{WShyg73fmx9R{-=-1!k+V{+%n8 z+nB>Dl^2T!udFj#T3IPtnxKniJRC%xg%|F zf{hj~=3kfc#C-YX%%Z>pfpjKv6sZcL8p;;`NmV9<0t}N?NdD$z3+>h&+QLjckMBz^ z+4PY9=4Zp_D#p7uzo43Z5XY$AAURh-G`O~h$W|;Fz5hEc`=$pn>1mt*2pA1CCluqM#nk7BH%5W&FLEPkeMHRKImM>0H-zx68KD;i2dkuz2}vtV(zr7E*k8`TnbS0T(+Al=yRGB|EY zF0f*}9f;&oq~oe7{;p`iP;+OC9G7&J@K;o$f7TB3kMmoOwHz4+W91cCBGj08DGh9f z8=HlF^$CQwjF02GW!~M&rPG2vXgM1t_A&NZERy#Cei9_?aIy!ZVSU}hQa@g-MVm|4 z#?HTPj}RMK`b2h^NuYV7f%6u30J_A~tYmYvUM$v&GQF_Condl^UR3A>^()1#dZ93! z7Mhb6*XqS)dI77a6kpSeK6>H!*JOcSY_1o++Vk~-y^&zzY?zxbbGE zwtdYIhQoF}ZC&%yg)l7ht}TiALnOfq0lKYDo|)NNY#HN^K1$57CSLqd;Znam7G~Y! zAO-?0=0~{@ZcJDkrDDa4nY5OdAYrN&mj>PdBSsfA2}BZ4e8&=Jf*TO{3aiUdGc<7 z4L1|RwBYw|c*UJx7ZgJsJj9-*a2||euC~4X1CCFF@6fHCMFi2TZ9iw8$bjalw*AB0 zJm#Tn{(SbSiM??C;Y?7tvDOPFNVK+cGf)<)ctJx>u z{nDwf{oM2B&*F3ichf4U67OTLVN%SAx3mio04j!)ApXgY)2F~*IQ^iAlbCJFW_^ns z0mR~Vl8=B4qTsSwR@5kO)F|JL8qvC$E?}2P5DkSOxp0;3t0hPjP11xaMU!%RKnnqA zo4#`0+XD&u?=|OokGl|?4A%>HGu|(OB7|mABxb{=y?9aNuvhT8T*W>LfTIj1HZLHL zB7Ql%0}lXR&wjrp{cdPz)$dpP?}BRNr)8oDCX-xJT7BNC!C2Nz0cm`Z8|jvkT|{Oi z@CaJfASFm%!Wmb59&$f$C8)sZ9?gx2(2l%cdY{&q9hz#5#bm)-1w+I=mOFe*za)92 z#-bXg)(F7dEq@@$jgAO|pvr}(AxLEz%yOha7*HOl`N0}IX^q2U<$9M+7oEF4 z<-vox4QU*M23lQHsT;M80_}oTOt1iMTP}qxFTJ%;b^)=0V3Q=4eWIlz4@lBYw$A2O$~4 zuI>*~lBo-<g3=sWObp#Rwq)7Mt8O zS$d18g-=O<1+$=mSF@z7GRo}dYOd3AbrVq`y}6`|(8;4zKE{=~kX_PJF*f2CP__U} z3|C}(*7b#Lk9uhd6w}KAj$#0Gl}s-dtT>SM7M~a{)H8o2y&dqWrZWiYYsfBq`2B@6 z(DjB+f!6EB9D3jYdCw9~xOxNGZs5-#CVl8;6JKY$Wq9I}5k4rVW z7v`4q`ZP&PjUlHoBU7?wXJdAwBfy-|5eBjw9pR07;+A9&g{^;+L=L-kY{Q$>Q(+sW zNgt1@b?cv}X&-aqHoQqaK!I=41tB^ER)w&vL9U^mDM>Vwokf_(<7dhS1_4V~ON?Ll zTpbGim%@rDV24ml=GB?JLS*6)Tvs^DPqGX69`>KZXI~W3q0&ky3OKHS_AYe?KoGL# zfbHzi6w}BWr84$Kngh|5&7y>MCGE?WIJ&bLC_q?KfJ}S21O@3y9fkud8k$IMdUA>D zsIU_asEAjFkSo*PfZH9K4wK7!Om?0|3(PdspIRdYnKoo6L*t+8Ko3Jk1Kni+7m#bw zA+EfXs2D43=f1;?bUyx?@Y+BL3K_hH@JkrWA_JscnvhE3Qt~iVloX0(*pW6k&R>=) zIvZR6`&Dt#K8=YR)W8K9$_h#Ws{8p01H=UL$)tej_q`;~loUY%T4{lBrH? zU?f3NUN)pb-AF>IEZ3lqH9!+Lq&=(Q+9z&=_DtA_?U}F<+Ec#~+f(n_GsodyuTPNf zi-iwbw5xR2hC70Ig_a50Uocd^oUJ&AG?2P);}a-DZUTYf4MV@Imt3_D7?wWvJXyG< z_8IB)hEf!uH=JvWNqmOI90}q(!0<9(2%*av36LEs%$CL&(P?5dju<0)c?K)p)-8zG zVvLYnF-8LItCr=8<0S)hnu;+JD#l3AHO5Gx#V=-TElD8#kd}xU^1vBU{0p_lXbWhX zexNt8Ls`8V!$n<&etPE;xBXSmZu_e!D|w6nGI7}OF@l_6$SbN*D8tHgs&f`>iYzxn zcNHW?UuX#CI+^^XUK)<;8N0KQb4v6&yz(9dNG0d>F1vkOvW`&8cM!ly>jW?Yh1MPbk<0W*QSQTxsA>2$4P--GUyAAt!~n z7wD7e&ebddqI)Ofqs8mAkwnJx78<56zE)hB=0|{0hI(1iupsLEnT&!=kxnR#sRsb% z`L@Np>M|Y^ZdUXtrQkYGe7c=DC^)dubvn9WPexUWj78^Em(j+XVIsBkX;v9QP-O9>d~8r* zQPv8U=M+MnaY7Hs#J?7<^KgUUPqLisOj{5s;{;YBwUO036*{dFo{8(d!lRj;D;$o! zt2vET9i$O_(K+D3qIE*dQg1zr8~~Zw%^;5SvYrX}QtO%KqRKP}&U$7T!whD^=sjA` zW-^uPUgsiDmvqj2m8`_Xd`1~KX^@;Gx#>Z~BLc>~{)mxwej{Snm^o`Z7~#s_u!1#l z%sQr2)`Y=(VV(p99t>@n*+zy|y`VxDHxn=+M4!BU%Z3L#Dq}H^&05RCk^v_==2@7J zNQR7#EgZsb`hu`fV7I7fY^}xtsg)F6;%lOMF4Tv4t)(bk2_X9PmPH|y76DDw(K&)n zryXMLRHG)kU`{m#B(;~0AGZkTFF&U?m?Q8y&YUx)N}4~1#ZpmdGpb}!B6^P$&Zg4! z)4e1phN2pJ;59IAX)(bX&OA=lULRfp2u-P{Acn%c1IKhJY|wSFKA3+UXJ-~06+F6s za$!4mCfJdgHE;yUT=TK1f^ZnT5c&mF1pQ)IWn!0~DdSEFb8ztXDla)x8W0JVM7oUa zps!tQD6}%JpgYFND3T`gFXZdsQWR8>gn>lhh)rBQL4u;;pj!kytwvUoffe^GCkItr zRIdhw#p!VJOuv!^yXh&J)hJ&LO3}RLY9QKfH$+A1p0bJaZ$f`($B@g>owL-Ob+#fY zwj>;+DZ)t^Y9kZyRJWZEvN@!F0%heAt6bW!?^>JDnag%-)GU4do3qD{qJKPO}(7jE*?On>8;QH4to7 zK%b>Kt!9d}YC#U_MVS_CYEHz5P8hyeZh8k!QY2ku=dW-c0_Q1EmQSh#^rTQ|%~D@x zm(hv8fxa0SG3Q>j115)w*|Fqp`XsWR&2$=Ef1!0(uqBkLBVnwmR+OJov3EANs8`Rj zY=)Cm5{K2cG~!0hGa0$Va&r;y z=%w~Tp}}#TSy?I&b(Y}|b&5DnczWco(f#AUn1!lR1*D2DM1vj_U2=9n2}$<&8;Dj; zYMSDtmpe*6rZB8QdSsIG5{MT@@+6VY21dQ}SSB(2UEYNUCp4lqoOe`zzU6e_5xU-d za)*5WP)s+Kw5izIyun8@p*1T^-nz2Gx#ZdleBZn@s?NNlZ}P=MkU@@+8;2R+@Ywi( zPwtRSUXd#m8cYxEgm1ZlAT*#h@f)|rh$orNH$f8VBsslC<`vH_KMQ0ZFVTuC|OqM2+sJTJ>OsFZM!Ag&8$mTlJwDPJ_t=<-~);^H7 z&7>k5`S@KEc6M4%!tiZY~fs%8I5~C?6xpFzPr;RyhxuHW0QWV$rDSN^fV` z{xPqR;bHPJzRAyELsb4`=`WYasCcoqfr5DKxV$8=! zXhWb`bA%^(jdwximgN+QZ3T;smKPVcC7ReS9S?CdB=Kj;(9R&)djRvY!dSP0mItYa z0TFBg%uJM51-%uzPOT9|XO|d7$&vZ=f5~)gWbq#P+DXQzdo}Es^TqU3Ryux z&JW*)Mpg_u=^M=10SWcrF)Ulo!_0s5~8I#tO zJ3O;5Hcg=Idk|%N>uKrAfGqnkz~G?s;7KW%2I`&jLBaHN(=R}Izs_f?^vWuYY-r1Y zOIoF3BKRspZMBe^YB@!y%FtICa_6elovV^N+nU7GChx6UrJ-Fj7-K4i( zHkSt0V9`~{YSnNmynuIf@9bqxDpmz}zxyp$WzP3fuI{dv+-X$xLY*yg1&KxP&h+M*Yuf$4p zT;z=V&i(a3uV~#F>s5X`i+nvRINmMClr(f(jz$Yg!)_Enw8772N*grnT6wnY;*0Ph zJZ-(2edwB6-NT@CWBRV_#**=@nQ*f)I0%xD&Gdb>TMaya+!{tQ?!Jwfz>QmmOo6S9 zWJQ~ah?y6Qy)s{y(D}M}q9yuMIJq=?4u4Cc5!LX#L22g14^U8P=BUW8Lzz61%ir!0 zEt4T9U5^{70a`wzy?&>h_(sDuKPK7_8e?l&W!*&iEQJ55g9Xk2M}y?bBAv8 zFPa=bh#2C=NSQQ78>!WA{A`t0Z={lM`^PFJvjWe7fyv>wIh`?pAxjRJzGy*JSR1$_ z5ah+dv;=ru=*tCk-jY=37t9xzQ_L^$km0Q9kqqXifuMH3-ChQ_tpm8>s84w~+8#wHZH4)BWSCY_?~MU;aufNu#r815rI<|ilLQp*LfqGSF(f#PP&zvg10QFbW110h+1TKr!*lpO5RZ}UwS8}h~t+X zYN4^O4mAb-2oe14jG(da$HY_snaCAlx0M4Og-sWu?-(l+;ZJgHhrl>?DT@DYC-pdo zI0BP|Ibg?WRfL66soehnLiv4oEwi+%R7dGN^<4ZL@#>Oo3TrO7vayGPpDYz@ds{-{ zu~cI?1}w4#`$=52#q_nBX0OuTH%i40b?rTB{fd>BL=VNjSSof+!?60+mi1ih2c=@| zRJTwbm#YrKiCwrPp;kY;A5Ri0oKgY@KpD%qrq`_Y;D{XzGI=3fFFX?0+uyG{IT&-g zob3ys4A6-dESbf1d!LilkHoN^=k0^Prf}B%2%s!DoLX9Z9)Pv@;2hQ~ei02u@Z1a7 zg+{UTa&GBu#IpBZP1&Vo4T_U=*BJ+bxLb+?amfW8e3Ewdvu+oBEHhcTBq z1#UC1A7iM!=7MD?b#0AM3yM$kUIs+ox`o_%uaPxbhR#`ola+k3P0(^~AnAMpi&;`0 z-Iiv<9~)f$0?PYumVfoeDF0V%thT5X3<14o8cXA|oKM;Izon$B#-cc}v{G&S-3&l& zrX-=fnkW{Cz5~#(d67S)u!P7BT4Q@HU8I;AgC4mR8?SRrsoavp0l2tAS=sTTP~0?A zoo?JM70K&Tkxu0BMS9-GVeF`;v#Izi(=MosKsf%PDT#c^g4R;W0@$>%j=cDi*J%*G zzy5=;PUYVDUn=+Z^)GiFNBHUg(g;8DUu*G;|D_f`y8bOb3c13t9JU*a+#1S(nk8Xu z5L`!S&g_cHrndmE|0L&n7THMIG_r2ep4O&jJP}LzI&zV(qeJ?(HqF;j3mLPXM-*Bb zBt#|0y10$bc)}Gq!sVrI1%v3c0--Gy8%PABG{hu+-}YcwAV?_OwV8GzwLNLcxwnu< zgfBSGF&(U96{>#6KP;0MohXapf2fd)lv-I0zLEQ+(A%=_bfkyANnA+P5oYvBS$&Tj zx^o;xv{H^E9tW2Ao7X7Yr3Y@qv!6$o(3sc)2FUr~A)4S^se$88V+s1v&|M0gK~3YA zNJ$dg!r~+nS024TmJ*$j$8Vgu$}BuYX$#}qLA*L}mqA#s%`hI%WI|jqWJ0f-fo1)C zSc9I{TvSWR<7bi2Hg$K354Q;dC6=Nm`rZ%qRt0qxc|M*C~BF@ogvbW5C{x^U1V(@w&D9a6uUmP@(M_ZUN=u8#NnD znQ)4B$>6eEI`vpvw`eZ*idHN@wpU89tgXHk2D8q{U210~?Zl4Ztmj&{^p0{3GQ9Sb zn&{_4xhm#2@d3Q3Kx|ntEF5BzzgoyjaURlJtmqilEMOlFW*H3i<(-OtH!le}b9aDzrI+8dLbZmI{Z z9vNCgYms)6$fRyNq|^k#0npYdrkG7udB8{jwZ_^|n?@$8abdc_z*Rtl+b8BisL3+G z;#YwI1-|f@bnGAkEjd^!EYC_V1bZ~}qcj)lCf@D3(0hlQLYap{JHdc9SJGOCfmpXC zWg4i86As*5*i6tgVP5Q2iX`R-plHmQhF!9&?V;g8PSk#bpZG*du{dpNCF8N7JWnNZY$6~KrTd^dt zVh?s0&qYYH@uYr#d^zo?3PoQy`9c63#+S+Y!cwJ{UAB>l@B;6GP=A`J)`?qaZY-#S`!3`}hF3h&(A_3I3-T zXh-8fo-8yld|WWu?QukUUEEQAw>j$4#X$#MShc_v`RuIXphG1&YS-w} z0B$FN^N}M47iVrD`T=oxEXtg1PluIuDG>WR(J@p#y5W4HSnYVGfhCm5EB`u38;hI|rI*BFEME#aw(%i7P+2 zH2)@fDkFYjh(b)0;tlAAvxRKtG-D<`c>A1*C0>JpiRYYR@BnaDP3}JPj)I5I6$%H^MK@r!Zg4&hjR|*y#ddld zH*+sGHq-_6K(q5Vnk-cTFGghKh0b1jGcXQ?1RAxzYH>*x$ouudNGz66Xdph?jWzl& z$Gi7+Q6^|ILOG+7bQog|tS0;KML1G`LmDzhANz#y@yW83vpxVLchNwKDlQC(Fo2)A ze3%6TJ!vJ_SzBDNKZWiTQb0@3S$j(WyksCVWsDl28p@foU=eN*6?7Y+w@qx)O{tVM)_Y8_f@QSN#f=z5U z-$cMdBD|^i$fI$yHkdXF%|gOD^v-KZg5b(8PiGXYOVWp(`{+-+rkE1SH80(NOnzbB7nV# zd^I*Yeq`E`h{$TI8=IiVu}Ok1xWc*aL?J&p+047Gfu0<;M`-!X0grq+uZWt++~*K{ zjX*Xd0{eMOXf2$A(szgCmW3Tb(m(0A9{JBXoj*_;&Uw(SL52%ZU~B~`fVy9H(SO2QzMFu>0o!WI+DPIZA zQd8Vdlc5YZgKMFfP_WlPDe*Hh^P0YP4-FJR(G5Dh--Q%u22chQshfq(>6$Y6?F*~P z>D&bvBPj-@ijd2I02bIYm_YNsig!R^w2=~Z`+@3Q?H&tmPCg>ec$EC?tjTUqhKp}w z6f7lf74wBoFR1;{k;N_M!R?@aDx6+Yv6+EFDmLRDE+=pynxnU#@My&KQRhr0{!=^C z<&{dBNVBVC<}-|6Kr6JGF)edWGJ)b`i9p(zrd}JX%S5Q7Fb7VIKMcv#&B4Kex#{Zc z96*)^AfMS226^Zb$%VyP7^E2o!^hV}76VM6L`ME;ADHw15$x2k>8dc4#1YlY^^2ir z(tMa2!$C}*589*oQ*4^TP|^wfNgUr^Cc?_iPhds3+>t&%sAqk6C12RhL2ik-J3QzZJB1zRU#FzW?7uyPsEk6?MYXIc3Oc& zvqBKkbB+gn4qewRM~Ba$Yxf+3*P#oYqq{foFEF~~Zyln-x4hYrQsIQi)Rj!E=VyeW zdCGaS#2$KJNm$?+I&A(=;1Yxl0$S^vPd{>au!)0`eBm}>`z)5F0I)tZQqReH5q)2rLK|8kXfL2 zbz7i!+X6NHdoij#;KJ%0QO3^acJA?H1MGJd_?OoAYO^Px6(v^#Q&!V#1tnG!?^4@4 zQskl;wZ?{p-3_h`p!Em2b+pJh5PK=9cp-}I=_bHM4+{eV2emd_RQt9GWLkUiyKsN5 z<9l|642_K(YHYwF3tX#0(>w7b-v^-&VggoO-6hVT>+1dtRk-<0ks}SHXELz}jlzo< zrd(Y*`TMzawq6PYS5w~d0C%`-!qpWhcgJ-}S6NE8<_7j#$8>Vn%htQPj=+g_O$c!D z&oJRSpsYgYYIpLX&?&R-zyg?YRxttWADGK^PyGx)wPtvE%dEkI7bm@?@FM6 zyx{L5dzWhaQtE;JOn9mofE}1A!WskSU;~OKwx(mTWMtJkwl7YLM0O>V$k(Y#Vl*us zMQP^U`jJ?w2P;YtrVyTmOu7^yxz*7<-KVK0+19u!ZEt>$SX-0PCur7^?UFm5gY(rE z=^aT%En?0Lxn8By5mmLwmWHtByR7w%%O)xk)S(rT(qwpzeT3tz2PC4bQEe$N_TGLdlLz+(qh3&1)#hiqB zTMO}m{78a277Cl%n3s~_OgSSB6+WM=d6AY)0F>Y*$iWcZ=yZds?aI&Erfc%;Ts z;U=Y4NNJ!|x05A^ABd{ujKX*6+T^Daleh2*UI>E)$u&B$1gTvthU7irL7PC;pAAs& zD^NW7()VoG_Uw19y$mDLmGS6rALHNTsyn@Y@B$K#Un;meWLUSUcn9m1$#d!zz`+V3_aUa0hGsviG^&rk=4fIncBHSb>iT*Mms)+c6_zHu zy=$`c^&MSbZ%1xNjO^l-GC{#%cG{hbe~>Tu%%c8Q8$>StNv_A&5A^)H!@X9oIpN-_ z@#DXZYk!xr2N$+>Z-pw{{xrlo*QR)9I{HT5R*lR{V3q6;+{c3ITgps>Wh4?{Zo*5N zeO*+Dxw8r4B88N_$Vy0sEqwvX?z)^c$&=84u#nU;WuJlx#&WQyc%|NPa(gD+KvfD50 z`uuXPu(>LtNcK#?zWSW7|5L0;vcaYCH+`azDa;QGW5rV}j4hK7xR{Pf1(9%vTuo&F z-qs@=O~R~7rYi8L`Hk-mJB#9RTA|YABiZG-%)ER*+%?3X`e9~cQW(GAmxOqRvyT1y{x&3x#Hx{l?2kqw@eFgXRmO*L>y`y(C5 z>UP4%=0WmJJv|lJV`mR;$+iZ?jwpqJ-!&SCTm~#>gDfUdc&_D-&YUM{^-_==UsQxojVqC zL1@1~Tj7rTqg^Smy(1|6B0s*dxphWMeX*fwX7iN#3B{KB@iSUl8)nuw&Mr2$6erZT zwzV|R=0ja$OMTsh*=M)4%&4DO*VtO$G^4Tci|d;`m=?r=e(H)N8d|3{*3B+9Or6$P zKefK8t*))1xrqj}&1h*-g-yl!mKNGDqp5z@wEFRF^%ELr4>`WIzNK}@l)5Q(&11*a zHBA|^Ys-w*wi(lgv^6(3j-OQ5(9}AlwXJSkWBuS+!}c1x*B*oGrcwUj33V-JH8c%r zY#2908FX!J8E^M`*;3asdq`blWAk`>O{W{0&fK-7HMpJjPNTgqRbVLQI-W!{?u;X+ zskOt0&uBWUrEc25UCt=d_PXL3M>IFppHZAy*Epj-*g_rU2N#84BOr0t|XbaKT;r^<&R!Xq!|VtZAuhY?x3y^w=YhC^nCq%rFcuUQV6?tEQb;*U(sO zYc8sZML#jai=?}s^gFMbKApSH5${sn@ZuZf8%jR#zFirDU@QN-HP^oU4&ztvxADJV z=2zweSz*YzXS(@zZq+$EeD;vZt<6o->e?o`;jV9_V?(AkPtcgOMX?RXt~pnH`aG29 zov3Cze)Xf_?8oo+{O-VSe}41+cSo*D`w4zO$*+F8r?1TYzXgh;Y43)DqQFZ(DJW{3 z^pk>QMUX7UO}6mBe(O71!}4ynwxu)y1nYA`y<54%i<@p5%;LKi&IMdmnx*1X}2v7oNv@ZzB23i4`BKI9s$p^Sx{Wq@bfvV{bL%41t?Yb)a+${61aVjSN# zwzH6?8B=M=G|JE_U0WHibuU9$j0w4${6aQq-_vV426=#L)wk7+hzNO?7#!a99%JXM=)&eb&^7;ujhSMryBOX)gXSYIIiVjwT;1b>o zC!}Sx0HA{Z^m&$luAe%sZFW&Bv)Iyb=A^dt`-OZLAxfX;^DGLGN#9sMv90v|%5Lee z@abFXn$D~*w$6t4n3ZkcfKA-|rRCpB`fU52@Xs@v#IdZJe?qtXzv!0#7604@%hjaC z3db^j%JAY%uUX?tEL|ICKghPJU*Lb1MiVz8V%VmQ*Y={3z$CTa>U z6eakG{HJnFpHoVkKBts6rI2e|yLFVEG&UYyC(iYDbzTy{2i~ z`PNiVo4JniY11~RY13<(=X{sP%Ad2A@)wZy%r;m4E$dkRr7n+^|KeK8zg%g3`ztED zj(OVd^qRK+t1gd~|35xYnkK!bX|E=2qi_GDbu9l{m&eM#W-a9}R9fHuW$Re}w_P49 z|AV!Ze+y~rnkLu;4BRXZ%6VSf{4Vl&RKXaZCmomcnvTyMq(y)+_*p>OEX=2A(`%aN z9+$`3f4|R@rb(}9+QpImj-`@)|%vB8TCOE-^$LFADz^*Mf1$q7yXQ4Vsnh2y2tbfQ1PQ_=1(&;Bn-=BNYfb@9)_lIPjHRdDvP0LVu;B{Yl5X_?fZ8GV1=YA)CUAp>~ z2IRailo)5|Kk3Cor1fdOlz#1F;`rVndLt5(2nrN*Kf&=3?_yX-4 z3xA=RnATE1b8HXoY@IQ#skvopT_b7IJcp4-W4F3IU#M?sPSYMvS_!zTOWV*iv7xD< ztv*eEDCsqit4q(gmD(}dw|(L?2zAk1{qnsx!A~<*I&ZcNwxO|u7cmRuK#ea z^~cPEdsZtt#6X#F}5@;!%d8;8{amA?6Zrd_h}vCV}+L*nkLlGva}PM zXEaUdVeZG%)aD^A^=CE!*0XKy&O}QwW8ALeo2L%mt$zIYy>{Pcp9$mksUJUV_s&Iz<@ zF2BMVt5&*ZZN^DkyY;6sj^+1ip7rzpiURC;+B=Q*rV23OIQ;-NU6fkKHczcThm!?UtY1-Lo+OduGbu;T*pCoz)TxF?8EC=UG_F)6g`Q^b<(GrgnWVo1QjZxt8=lRC>}aC7s|WZF71}+y0=^jf0`7 zuWNdPwBkw9H0d=>`xxJ(zy4HROH1ACvD0TXx7Ckzy4qmJ?VR2x&68f!ysxVsmk(*J zrR_M+h4i9#>G-7Aw2t#i z>EUD6(ub>*)+-$H+dH{BEib*M<=&{Y5*}HYLrJ@)xw?b2n+&$ZF!uErLXZQ?SqnVCr25td>b#u%(qE+c(rcRkZnY16=Y$3s9mcBi;A!$~v4%Vk zr+p$#eup*VnBOR^)GT9R#z;Su^lO@jzh~1sz9u+>JZox?l#o^jMD(OcyPn0+m97(w;oyy8XM`hlB zn)~CW^Wl1Q=KV3;A0u57*JCs9kK_LM%<~D{A7t8VM_Y&^^e!y!$_)Hh;7n^~WXYi(|v(N=$COVTvqU{umf?U5}br^5mI zr^6cB+8X(8@7%)?&29E%e|)`M44>-Cl-tib(^n(RvKiL5h>tpH$JpdhjiKfrU=VIcUr>%9d^@y}rh?AUoremjb9HIy-DEoF>bLm8*@P5eU#W#~s&UInKg)r`{5!QUA?r*I&? z3eY)m5^_rGG|Y!K^XZKCFxegqy26Id{ILkjjrB*1GENBUGIa>nMl{dBwBbGiiwA0@ z9o31*js&q~9*>>Y*wA)h^VF$zN6)~FOtX_#AhDr!ie)rFR~EZT+D0_DrGPswQ?Gc$ z@tJ3}L-UmOU2AS)=J`zSVG&E;tGP#p`@bU2dKNR->XUIWi*|?xZ_hP-<`@~XTBgr? z@+`PapNI1-nSWhr@v3Wc*YWEow3+qJOi+kzLwDV44{x8fB^<1zAE(oveISt1zo*Z; z!E{M)ls@mvvvf{pS9kFiIQ5Hz#Rej0rvU0o~n3P6goVas^% z*(t^S_A3tUp+g(b+~1=HqOS4G<`$&dslr*06yx9=+Bb=LDC0VrU;XeHOyReYU(w6e zz5lN^AD-KLDu4G_*;cm|qnK)4BeH zj)=~uo&e~s*2xLv(AE>=;4p9(@{Xx?Jof~y8W*ig{m4C}IIY=0w>V8RYz@=&m3&N! zGg|A5%@gJ7;d~qLH)%6ZkK$RA8pcm5p4B{~aY7N+-tx|9YOR}Ck0(k)T`Op+h($@o zb9-a0^Sz?xfQm*8Y~t+~uy7d-5)li#yz`}|##fS;$g8gJM6&tGNN z`k(zw*W%cPQ7zXMGe_;M>kU`#FqLb~tJe&@f$Qa;SbG0+T=)3&yHhF;4BD6PJ^SJ0 zz+mAE=byO8%magEN1Qoz$@dNn_PgSYS5ErFfi;)hGi#^Yw;6HNn}2-nl^sTp`0}p~ zFMsN-_7VR$^be0kgYOw}_qD&Cec-IWjJP5iIOww%7f0@y+x)@ z$aA;)x?pgemgRc4M zLDesRXW2oyIWPR>n@@ju(0PYH)>2pd`Ga3B&VK6sttK7Zzv09K7jO5igYUe4+s{7p z^Ismk)1lX_yzsm}qrN@n;kS1gzu&0Ww%=jzf1TDcs&3)(rL*4s&ZybT`u*d%AG|o~ zu(O{!`O!DGJmgzr4t(oJQw}=h(a#_E#<$Do95QC%-FJOv{+)-kF1vo=Zm+(2$YsMH zuQ=!Q{)c{J!a0v@-v8)BJO1;#nZK+%|Indlf3@$y_uhNx{!PDYY`pueLx29$z6&n= z!+_Dr2is5n^Y*8V{_cK9{c*RWE+4)1;jf&s|AeKZPdww=w+}!2{n1kw=bNs7amZmK z-g)SiSN=Tyux;*mXQ$I&x%#mF*G&8NjGdl3?25XH7dEuy4uALk1OA*la@gT5?_Kut z(s50PAN=oqHoxybHypnG7nc2Emj|9d{JN`$AJlf+W=Bl8?v?K?ySVm<{T}<>bNB9g z))AHaeD#usf8BP(%?JMOpXcuQ$0M$|^4S?T+_>$L_x$*ftuH?8up_tZyZIZ>-G1(o z+kSn^o1g6e!y`}q=vPlac*E;Qe*MAo|M;VkRY%Po@|oZ6eAV$sjs5pqN5A>OmyYUx z?OtEm=Jy>(jT@1F?;G2^d(;SvFhdi=v%{$bV`M=$&A9w%&n)s;toVb3Ms zd+Gk49^JU)q$lueJm#^tcm2u#_TS@}eZGJ1)RyXoV;(zsmrb^qa@{dIz3}7uKi}}o zF$0bm_~4BfR~);j?(g5f#;|US+wG`_ijFR{9P}MoAHm|9s7xC zkDa#3y;~i(^I`kkbMd5ukK6US3vc*-?b*kj{qU7LFFNE0$BkL}ep9~}|8!jI^u=HL z#8-Aae#Jp|ZTrq|k3Rl}erLS+<}nu>|M(|nJ@dWS?mPZ~tv@&6iD_>izxfM$?)Tx7 zJD;%C5%ZqhujbSfo``>W-KQ(AIN`%9A3b>Jp^u!f-|)pJ-+#@&PMA1g>&5S0KlH@* zzi#*G*2gEDxO~O6Z*K9Qub+6yoe#ac%l=QF_~vP!Z@v5Q{7F;x3@)##+vlW5YJ-&x zKW;whzFpdf{qdO_Px|a03m^T>vKLO;GZ{5&%YScv@{)mrU;oRP15bXt<-Kq3yvMAQ z7hN`Uiy_JPPkwUyTN@r&@yC-7SlD;z8#ios%8|>qfA{8#4?ku1orba6olIcLC} zz58$Tqf@>$_|&p-zj@=7^FBD~z_Tl=PrY&9Ay;1Wr4vrQWYc|reBj_qPQB_+OOHMD znkA?1SN!3MF}Z)7diX6bSMM?Zb7O`c^7F4Q+`VqhoZlw*jhg$_F{d80)n9ga>G3hM zTSxzL+7rQPCm!|t^20yed(`M{&&#)8QpFM4>x<8gr zUAW2V-l5@s>=C0vyzPjCAW8WUT$&{CV_uAOM{^*I3C;n=uGgcmR z-Nh$-`B-gd-=td4=hPpp36jOeP9=g-{p?`J&xLG#YfKJ@9jmH&QX*Na-m z)Xh5kfCu(mc17KDV=fzX;P6N5D)+eSpU*7&cin}-(_ff>+HT{%8_fUut9RFrdp3CW zqfbYc=Vxn+78@%#DrOQ4Lzps$k`K4SbqP+lfQQRguN>F zTK>-mUY>B^We2`6V^P2QzOBa{@yrWH)W7lA%6R_4^XgZ;zuPwT+b^!Kn|019Kl$X} z>h~*L_TF>PR8Oq@`44{hBRT%xbJT-jeBU~uxls(<*I-GW8wuP z%3eMD-a%(Rd+4Wb|KF8$XI`|^8>jqW`q$2UeZb9ce`50|&)oW~iW8q%5Kemj%Et#) zyuRn8&4&MH@5k$>Od2)f!*SpGmu zU!6O-;-xpQ)&*3qs96EH8sPAzgAy4xIUyO%g<$Z#n$Zd~z8FIPq-k&_MFH!e) zRqXUM!fQxNrl0aWYjR<;r7^|x?O4z&Ihp&OFV1tYc5bbC8hkFu_1Y5mdiw1^5p{=+ z*SW75=X%|;ysD&sd_u-G;(cD1-21Vg>5$a4f_J2$7e)JJ7w;jTZvMvCMcx!A z0;}Gh8ugAVGrq+2iQWg_^X;XluZ9nMkk8415nrDx*~9N64_EovZgT^fJgt-*TV&yVoao9Oqxqgy&PVf*>~lJ^##;xRDv zlho~5nsq$q*J>SfX6jytA0afkc=z)aztee=Nq&RE{vOdk#SPJx{(>^?d3c+P{3a&&$^wrC`O|gFy$JNEPITBP#0DiBi%0CCJrv|# zqhyts6dYvlvNJ?Mu`Ve5uox#r>}-&Q$=Z&CbHw1uEEV|=gZjZEYUjx3(6PaX&hL(% z(rgLVQTka&e|9<8k}BxRK&(K>w|MqL`^!y2ei#m(Jx7xkq9l61tBUSHNcUIoW+TS+ zknf+<9IEvtL-%A6@19M!4W(1tQA_2Y9jcQoV%C!}5L&yIqrAz54$JdJC8*9QhM_N_ zDv!Q&4VyMq*Vd~n4x8{A;(BX17M7MuF~cd!7~b+c%I&zy{&11BosVXF{K92@s#SS| ztHTR>KE$r{zX^vZ#6T1aMv4D0O8(z6Yk_1B&?p{-x+#W1Spq+w3|Rvu;ZA^Aev2Ol zSn4<24KOsuC8h5JSnfBhLXOA_$o`818lh?oO_FG_FF>H18ZkxjKmUs&BS%wEQc=^; z{>no~&%nsU{O=3+uj2oG&i^Yh(8LcC)BP%Dbps1v5ZDVU^@8J9Eu<>#8b?_pgKYbLW=<#(1da=z=8rgHu+>@SN z7LnThzp}z>46fG$JSfr%Zz>2w2lNo3JAr)Y_%&?@QW_U$S7#qS`v6;edpmo(KlL;C z>;ahy%;%i|lfd2^2psHvynsLlnyUj=v=<;D0OgH8|AIt=E?|imp5Q}?fF_EUyCV=+ zLsR=d3jwQPe6C=k&u0TB|Gzjj5c}K99q2ib%HgW-Q5uhSLo&7@$Ntp5vQQ*meYP9wN zKB#tZ+b+JYZhYX`lG<#uJhJk05BN|g3`kqy@* zkOca|Z#W%<|1QA*fg8 zdfMrIV^fMd&Ru$X=+G(?+Yj#}{RihP=L@S2j0~H5;mqS0gH+WVO696Y8ufakx$CZs zW!Pr%95>&&Kb@f{kL}*kz?V@|VH2TxxlDBRZ*fl5rZ&UbcA}SNE!Z%8$~*?k(~;$` z8<#YX-^8ik5@)|As5fxpSo*0meHS-}zR{>qz56p7cWep5x(L zWm^`fIZhOc$h+4H$i)?Oe%LyC1V72Kl=j7hJMBui(>eQ5WsIdrZ9Vt>pE_AGfRmEuEj~@%b3We5c;=-l{LlOhMn9N;8Rj z*;-VBirP$1dr632jL{_Y9sDWLLwt1OdP-8_{(Lm{AZ>bG+1iVn+A{%_`9GC7DT*}i zeMk>ob&D21Str>|K-W7up7XVPa4OH(Ur5jeJF-|hKAGU^`n7A<7kahVoRd309Ac%u zlXzc=NBHWd4y#t<$q}r}mRp|HQ3E~cF)UN!r$#-NtU4>lgR$&UNnE8x9pAl}tA&WS z&nVWAjk5CS=2&%l8Qp$kby7@VKoghA+W8pGW4tOq(8}WaR)xE&3aEXuSBvf*m-I{2 zvtctjC+AN7x~=sj%gO^ch6dcZijQ?e{oU!Gc$%MT2Q6_^w-~3W(>di4itT+ToBGSmlSL@jsqP3p_xNQPnQOB)8ngD&3|h~6{ha%$yY zH8+_FSB$hK-j;1N#_TP$L}2Rd9p?y<%sZ%Sk`Ue#hW!?JQNkd@A=l0&6kh za3AxzmG@`0FL=%HRbds|JOgwln>7zra>lrl9ptjKz1KBL=tfhX)I#66oX^Vf?(x}! zuap!N{i&U|uCw9pX|NtDw!LR`>Xa8#R^1n_0mrK0NG`IeK$cZcT#7JT>EcO^0am$i z>lbPFn8xF9ZikKJLk0Nk$-C#BW|B*|cPR&~NpVNKCv&;Y$351_7V|@FeWf<1Rc@#C zF}CXOIOVm&!Uno#mWE1BgfG>nc_hT1-1emp4L@LIplOmq;dv1t|^4< zab*!4S@%jlSD$h-mFe^PZUS$!hD7RBYEduYGWxIGZ7T)tDPr`&okj%U=2Dr<)2 z+nN+DN2f*JnAGx*QGutt-z`s5!v%=F*|61C&oq& zGek^$rgUe@iFtk$v-;F23XgiAH#+n7YvC%6xZD3DS!Is%b8HjW+O4%oeA~lBvIP86 zjZb>*L$mc87%|#cPGuiMv<%-zxMv98A__d6F=#e^q=Gqlxxrjc;lIJ0#HBU8ooZjRh(?6I87p+*UtU{zy|Xy>6%%r`_kgW;bx1 z9_w~WU$35-XOHUAL;dk2)$-4Q-uu!R*n4|FD^3K`K8pR?-6^B4#xlA8UB|c1ifisI z3|E>QdU)REw)F2FG}s}S=@BM&qL4jGE7Rkg*EM4EOF{c(pIa>Xz6nI;7~i#I$-Ol5 z@v*#Y7KOoH3KuNt1hc6Y3luq~W;iaHeplys7ITPlIa~~{^ZszvjV{z1j3VW5a?Vc7 z;g|ak>XbMR%nLlLKb$(kK~>kEKl<*(IB(O-`vqPVcqJjaqX(BJ13ARPoH;tD;(n&B7TdYC^myK3;3!HM(os=o&%d{2Qr zBQGm?kfwz*OL7#yjV<%{tDPG4a+P2WOn!A>yZre2g_WBDtL=BNDK(oTTl=^=xfYvF z^V`~SjVIdemyxX{V_UW)G&D4VmoqvyrPGA0+GOr!+JoJ=t7v6QHi~Zp)ty&2h);3c z(Rt!J)y@`P?YUf!jvUy}miIPs^qe94>gF^n4YhMFu8Xp&o!RjGlH}RX4C6izxhc=` zZ+ZER-AU%Z=W$4Mn2n-Mw@>&XZhKVM@%-6VMwY_$&;Xx3$NL1r#)EN|Aw0*dx7I~^ z8EKoOYc@2(ZQ1D}`!aSs9V>h&B=AVCKZ?bFAi!|&c88-ogX@7EHHy6Jp5iY{Gx~W= zJQ4?w8LzW?>FbkYzD6JjtZ<4@^wf%DEwgU z-0V*02;ep&68nXkEq+#!^||=st!6@kuhSY_WbbWrEM7Lp

H+tlj^C=c`Y~zBBWZ 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 literal 0 HcmV?d00001 diff --git a/docs/bench/0.bootstrap.js b/docs/bench/0.bootstrap.js index 411b9247..0677a00a 100644 --- a/docs/bench/0.bootstrap.js +++ b/docs/bench/0.bootstrap.js @@ -4,11 +4,11 @@ /*!***********************************!*\ !*** ../web_pkg/jsonpath_wasm.js ***! \***********************************/ -/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbg_error_c4abc40e0406628b, __wbindgen_object_drop_ref, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbindgen_json_parse, __wbindgen_json_serialize, __wbg_call_bf745b1758bb6693, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper107, __wbindgen_closure_wrapper109 */ +/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_object_drop_ref, __wbg_error_5b1e30d38c81c9fa, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbg_call_3fc07b7d5fc9022d, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper27, __wbindgen_closure_wrapper29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n/* harmony import */ var _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"compile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"select\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"deleteValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"replaceWith\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"Selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"SelectorMut\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_c4abc40e0406628b\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_error_c4abc40e0406628b\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_parse\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_serialize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_bf745b1758bb6693\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_bf745b1758bb6693\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_debug_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper107\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper107\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper109\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper109\"]; });\n\n\n\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n/* harmony import */ var _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"compile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"select\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"deleteValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"replaceWith\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"Selector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"SelectorMut\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_parse\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_serialize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_5b1e30d38c81c9fa\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_error_5b1e30d38c81c9fa\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_3fc07b7d5fc9022d\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_3fc07b7d5fc9022d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_debug_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper27\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper27\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper29\", function() { return _jsonpath_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper29\"]; });\n\n\n\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm.js?"); /***/ }), @@ -16,11 +16,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jso /*!**************************************!*\ !*** ../web_pkg/jsonpath_wasm_bg.js ***! \**************************************/ -/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbg_error_c4abc40e0406628b, __wbindgen_object_drop_ref, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbindgen_json_parse, __wbindgen_json_serialize, __wbg_call_bf745b1758bb6693, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper107, __wbindgen_closure_wrapper109 */ +/*! exports provided: compile, selector, select, deleteValue, replaceWith, Selector, SelectorMut, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_object_drop_ref, __wbg_error_5b1e30d38c81c9fa, __wbindgen_object_clone_ref, __wbindgen_string_new, __wbg_call_3fc07b7d5fc9022d, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_closure_wrapper27, __wbindgen_closure_wrapper29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_c4abc40e0406628b\", function() { return __wbg_error_c4abc40e0406628b; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_bf745b1758bb6693\", function() { return __wbg_call_bf745b1758bb6693; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return __wbindgen_debug_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper107\", function() { return __wbindgen_closure_wrapper107; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper109\", function() { return __wbindgen_closure_wrapper109; });\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetInt32Memory0 = new Int32Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_export_2\"].get(state.dtor)(state.a, state.b);\n state.a = 0;\n\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_22(arg0, arg1, arg2) {\n var ptr0 = passStringToWasm0(arg2, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h46468b167eaaeb87\"](arg0, arg1, ptr0, len0);\n return takeObject(ret);\n}\n\nfunction __wbg_adapter_25(arg0, arg1, arg2) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4bcc2acf0fb4a8f0\"](arg0, arg1, addHeapObject(arg2));\n return takeObject(ret);\n}\n\n/**\n* @param {string} path\n* @returns {any}\n*/\nfunction compile(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value));\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @param {Function} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr0, len0, addHeapObject(fun));\n return takeObject(ret);\n}\n\nfunction handleError(f) {\n return function () {\n try {\n return f.apply(this, arguments);\n\n } catch (e) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n };\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n* lifetime 제약으로 Selector를 사용 할 수 없다.\n*/\nclass Selector {\n\n static __wrap(ptr) {\n const obj = Object.create(Selector.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n return Selector.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr);\n return takeObject(ret);\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*/\nclass SelectorMut {\n\n static __wrap(ptr) {\n const obj = Object.create(SelectorMut.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n return SelectorMut.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n */\n deleteValue() {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {Function} fun\n */\n replaceWith(fun) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr);\n return takeObject(ret);\n }\n}\n\nconst __wbg_error_c4abc40e0406628b = function(arg0, arg1) {\n console.error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbindgen_object_clone_ref = function(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_string_new = function(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_json_parse = function(arg0, arg1) {\n var ret = JSON.parse(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nconst __wbindgen_json_serialize = function(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = JSON.stringify(obj === undefined ? null : obj);\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbg_call_bf745b1758bb6693 = handleError(function(arg0, arg1, arg2) {\n var ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n});\n\nconst __wbindgen_is_string = function(arg0) {\n var ret = typeof(getObject(arg0)) === 'string';\n return ret;\n};\n\nconst __wbindgen_string_get = function(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbindgen_debug_string = function(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_rethrow = function(arg0) {\n throw takeObject(arg0);\n};\n\nconst __wbindgen_closure_wrapper107 = function(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 4, __wbg_adapter_22);\n return addHeapObject(ret);\n};\n\nconst __wbindgen_closure_wrapper109 = function(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 6, __wbg_adapter_25);\n return addHeapObject(ret);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www_bench/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_5b1e30d38c81c9fa\", function() { return __wbg_error_5b1e30d38c81c9fa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_3fc07b7d5fc9022d\", function() { return __wbg_call_3fc07b7d5fc9022d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return __wbindgen_debug_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper27\", function() { return __wbindgen_closure_wrapper27; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper29\", function() { return __wbindgen_closure_wrapper29; });\n/* harmony import */ var _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg.wasm */ \"../web_pkg/jsonpath_wasm_bg.wasm\");\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetInt32Memory0 = new Int32Array(_jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_export_2\"].get(state.dtor)(state.a, state.b);\n state.a = 0;\n\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_22(arg0, arg1, arg2) {\n var ptr0 = passStringToWasm0(arg2, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3f85b00bb5f43a73\"](arg0, arg1, ptr0, len0);\n return takeObject(ret);\n}\n\nfunction __wbg_adapter_25(arg0, arg1, arg2) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"_dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h38eddcbbb73fbf05\"](arg0, arg1, addHeapObject(arg2));\n return takeObject(ret);\n}\n\n/**\n* @param {string} path\n* @returns {any}\n*/\nfunction compile(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value));\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), ptr0, len0);\n return takeObject(ret);\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @param {Function} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr0, len0, addHeapObject(fun));\n return takeObject(ret);\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n* lifetime 제약으로 Selector를 사용 할 수 없다.\n*/\nclass Selector {\n\n static __wrap(ptr) {\n const obj = Object.create(Selector.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n return Selector.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr);\n return takeObject(ret);\n }\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*/\nclass SelectorMut {\n\n static __wrap(ptr) {\n const obj = Object.create(SelectorMut.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n }\n /**\n */\n constructor() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n return SelectorMut.__wrap(ret);\n }\n /**\n * @param {string} path\n */\n path(path) {\n var ptr0 = passStringToWasm0(path, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_path\"](this.ptr, ptr0, len0);\n }\n /**\n * @param {any} value\n */\n value(value) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n */\n deleteValue() {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {Function} fun\n */\n replaceWith(fun) {\n _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n var ret = _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr);\n return takeObject(ret);\n }\n}\n\nfunction __wbindgen_json_parse(arg0, arg1) {\n var ret = JSON.parse(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_json_serialize(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = JSON.stringify(obj === undefined ? null : obj);\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nfunction __wbg_error_5b1e30d38c81c9fa(arg0, arg1) {\n console.error(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_object_clone_ref(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nfunction __wbg_call_3fc07b7d5fc9022d() { return handleError(function (arg0, arg1, arg2) {\n var ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbindgen_is_string(arg0) {\n var ret = typeof(getObject(arg0)) === 'string';\n return ret;\n};\n\nfunction __wbindgen_string_get(arg0, arg1) {\n const obj = getObject(arg1);\n var ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_debug_string(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"], _jsonpath_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"]);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_rethrow(arg0) {\n throw takeObject(arg0);\n};\n\nfunction __wbindgen_closure_wrapper27(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 8, __wbg_adapter_22);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_closure_wrapper29(arg0, arg1, arg2) {\n var ret = makeClosure(arg0, arg1, 6, __wbg_adapter_25);\n return addHeapObject(ret);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www_bench/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.js?"); /***/ }), @@ -28,7 +28,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /*!****************************************!*\ !*** ../web_pkg/jsonpath_wasm_bg.wasm ***! \****************************************/ -/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, ffi_select, ffi_path_compile, ffi_select_with_compiled_path, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_export_2, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h46468b167eaaeb87, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4bcc2acf0fb4a8f0, __wbindgen_exn_store */ +/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, ffi_select, ffi_path_compile, ffi_select_with_compiled_path, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_export_2, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3f85b00bb5f43a73, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h38eddcbbb73fbf05, __wbindgen_exn_store */ /***/ (function(module, exports, __webpack_require__) { eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./jsonpath_wasm_bg.js */ \"../web_pkg/jsonpath_wasm_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../web_pkg/jsonpath_wasm_bg.wasm?"); diff --git a/docs/bench/1.bootstrap.js b/docs/bench/1.bootstrap.js index f2518160..cdf4fca2 100644 --- a/docs/bench/1.bootstrap.js +++ b/docs/bench/1.bootstrap.js @@ -7,7 +7,7 @@ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("/* WEBPACK VAR INJECTION */(function(global) {var require;var require;/*! jsonpath 1.0.2 */\n\n(function(f){if(true){module.exports=f()}else { var g; }})(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 require(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\n Copyright (C) 2013 Thaddee Tyl \n Copyright (C) 2013 Mathias Bynens \n Copyright (C) 2012 Ariya Hidayat \n Copyright (C) 2012 Mathias Bynens \n Copyright (C) 2012 Joost-Wim Boekesteijn \n Copyright (C) 2012 Kris Kowal \n Copyright (C) 2012 Yusuke Suzuki \n Copyright (C) 2012 Arpad Borsos \n Copyright (C) 2011 Ariya Hidayat \n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*jslint bitwise:true plusplus:true */\n/*global esprima:true, define:true, exports:true, window: true,\nthrowErrorTolerant: true,\nthrowError: true, generateStatement: true, peek: true,\nparseAssignmentExpression: true, parseBlock: true, parseExpression: true,\nparseFunctionDeclaration: true, parseFunctionExpression: true,\nparseFunctionSourceElements: true, parseVariableIdentifier: true,\nparseLeftHandSideExpression: true,\nparseUnaryExpression: true,\nparseStatement: true, parseSourceElement: true */\n\n(function (root, factory) {\n 'use strict';\n\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,\n // Rhino, and plain browser loading.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define(['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n factory((root.esprima = {}));\n }\n}(this, function (exports) {\n 'use strict';\n\n var Token,\n TokenName,\n FnExprTokens,\n Syntax,\n PropertyKind,\n Messages,\n Regex,\n SyntaxTreeDelegate,\n source,\n strict,\n index,\n lineNumber,\n lineStart,\n length,\n delegate,\n lookahead,\n state,\n extra;\n\n Token = {\n BooleanLiteral: 1,\n EOF: 2,\n Identifier: 3,\n Keyword: 4,\n NullLiteral: 5,\n NumericLiteral: 6,\n Punctuator: 7,\n StringLiteral: 8,\n RegularExpression: 9\n };\n\n TokenName = {};\n TokenName[Token.BooleanLiteral] = 'Boolean';\n TokenName[Token.EOF] = '';\n TokenName[Token.Identifier] = 'Identifier';\n TokenName[Token.Keyword] = 'Keyword';\n TokenName[Token.NullLiteral] = 'Null';\n TokenName[Token.NumericLiteral] = 'Numeric';\n TokenName[Token.Punctuator] = 'Punctuator';\n TokenName[Token.StringLiteral] = 'String';\n TokenName[Token.RegularExpression] = 'RegularExpression';\n\n // A function following one of those tokens is an expression.\n FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',\n 'return', 'case', 'delete', 'throw', 'void',\n // assignment operators\n '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',\n '&=', '|=', '^=', ',',\n // binary/unary operators\n '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',\n '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',\n '<=', '<', '>', '!=', '!=='];\n\n Syntax = {\n AssignmentExpression: 'AssignmentExpression',\n ArrayExpression: 'ArrayExpression',\n BlockStatement: 'BlockStatement',\n BinaryExpression: 'BinaryExpression',\n BreakStatement: 'BreakStatement',\n CallExpression: 'CallExpression',\n CatchClause: 'CatchClause',\n ConditionalExpression: 'ConditionalExpression',\n ContinueStatement: 'ContinueStatement',\n DoWhileStatement: 'DoWhileStatement',\n DebuggerStatement: 'DebuggerStatement',\n EmptyStatement: 'EmptyStatement',\n ExpressionStatement: 'ExpressionStatement',\n ForStatement: 'ForStatement',\n ForInStatement: 'ForInStatement',\n FunctionDeclaration: 'FunctionDeclaration',\n FunctionExpression: 'FunctionExpression',\n Identifier: 'Identifier',\n IfStatement: 'IfStatement',\n Literal: 'Literal',\n LabeledStatement: 'LabeledStatement',\n LogicalExpression: 'LogicalExpression',\n MemberExpression: 'MemberExpression',\n NewExpression: 'NewExpression',\n ObjectExpression: 'ObjectExpression',\n Program: 'Program',\n Property: 'Property',\n ReturnStatement: 'ReturnStatement',\n SequenceExpression: 'SequenceExpression',\n SwitchStatement: 'SwitchStatement',\n SwitchCase: 'SwitchCase',\n ThisExpression: 'ThisExpression',\n ThrowStatement: 'ThrowStatement',\n TryStatement: 'TryStatement',\n UnaryExpression: 'UnaryExpression',\n UpdateExpression: 'UpdateExpression',\n VariableDeclaration: 'VariableDeclaration',\n VariableDeclarator: 'VariableDeclarator',\n WhileStatement: 'WhileStatement',\n WithStatement: 'WithStatement'\n };\n\n PropertyKind = {\n Data: 1,\n Get: 2,\n Set: 4\n };\n\n // Error messages should be identical to V8.\n Messages = {\n UnexpectedToken: 'Unexpected token %0',\n UnexpectedNumber: 'Unexpected number',\n UnexpectedString: 'Unexpected string',\n UnexpectedIdentifier: 'Unexpected identifier',\n UnexpectedReserved: 'Unexpected reserved word',\n UnexpectedEOS: 'Unexpected end of input',\n NewlineAfterThrow: 'Illegal newline after throw',\n InvalidRegExp: 'Invalid regular expression',\n UnterminatedRegExp: 'Invalid regular expression: missing /',\n InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n NoCatchOrFinally: 'Missing catch or finally after try',\n UnknownLabel: 'Undefined label \\'%0\\'',\n Redeclaration: '%0 \\'%1\\' has already been declared',\n IllegalContinue: 'Illegal continue statement',\n IllegalBreak: 'Illegal break statement',\n IllegalReturn: 'Illegal return statement',\n StrictModeWith: 'Strict mode code may not include a with statement',\n StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',\n AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',\n AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',\n StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n StrictReservedWord: 'Use of future reserved word in strict mode'\n };\n\n // See also tools/generate-unicode-regex.py.\n Regex = {\n NonAsciiIdentifierStart: new RegExp('[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]'),\n NonAsciiIdentifierPart: new RegExp('[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0\\u08A2-\\u08AC\\u08E4-\\u08FE\\u0900-\\u0963\\u0966-\\u096F\\u0971-\\u0977\\u0979-\\u097F\\u0981-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C82\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D02\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1D00-\\u1DE6\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA697\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7B\\uAA80-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE26\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]')\n };\n\n // Ensure the condition is true, otherwise throw an error.\n // This is only to have a better contract semantic, i.e. another safety net\n // to catch a logic error. The condition shall be fulfilled in normal case.\n // Do NOT use this to enforce a certain condition on any user input.\n\n function assert(condition, message) {\n /* istanbul ignore if */\n if (!condition) {\n throw new Error('ASSERT: ' + message);\n }\n }\n\n function isDecimalDigit(ch) {\n return (ch >= 48 && ch <= 57); // 0..9\n }\n\n function isHexDigit(ch) {\n return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;\n }\n\n function isOctalDigit(ch) {\n return '01234567'.indexOf(ch) >= 0;\n }\n\n\n // 7.2 White Space\n\n function isWhiteSpace(ch) {\n return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);\n }\n\n // 7.3 Line Terminators\n\n function isLineTerminator(ch) {\n return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);\n }\n\n // 7.6 Identifier Names and Identifiers\n\n function isIdentifierStart(ch) {\n return (ch == 0x40) || (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)\n (ch >= 0x41 && ch <= 0x5A) || // A..Z\n (ch >= 0x61 && ch <= 0x7A) || // a..z\n (ch === 0x5C) || // \\ (backslash)\n ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));\n }\n\n function isIdentifierPart(ch) {\n return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)\n (ch >= 0x41 && ch <= 0x5A) || // A..Z\n (ch >= 0x61 && ch <= 0x7A) || // a..z\n (ch >= 0x30 && ch <= 0x39) || // 0..9\n (ch === 0x5C) || // \\ (backslash)\n ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));\n }\n\n // 7.6.1.2 Future Reserved Words\n\n function isFutureReservedWord(id) {\n switch (id) {\n case 'class':\n case 'enum':\n case 'export':\n case 'extends':\n case 'import':\n case 'super':\n return true;\n default:\n return false;\n }\n }\n\n function isStrictModeReservedWord(id) {\n switch (id) {\n case 'implements':\n case 'interface':\n case 'package':\n case 'private':\n case 'protected':\n case 'public':\n case 'static':\n case 'yield':\n case 'let':\n return true;\n default:\n return false;\n }\n }\n\n function isRestrictedWord(id) {\n return id === 'eval' || id === 'arguments';\n }\n\n // 7.6.1.1 Keywords\n\n function isKeyword(id) {\n if (strict && isStrictModeReservedWord(id)) {\n return true;\n }\n\n // 'const' is specialized as Keyword in V8.\n // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next.\n // Some others are from future reserved words.\n\n switch (id.length) {\n case 2:\n return (id === 'if') || (id === 'in') || (id === 'do');\n case 3:\n return (id === 'var') || (id === 'for') || (id === 'new') ||\n (id === 'try') || (id === 'let');\n case 4:\n return (id === 'this') || (id === 'else') || (id === 'case') ||\n (id === 'void') || (id === 'with') || (id === 'enum');\n case 5:\n return (id === 'while') || (id === 'break') || (id === 'catch') ||\n (id === 'throw') || (id === 'const') || (id === 'yield') ||\n (id === 'class') || (id === 'super');\n case 6:\n return (id === 'return') || (id === 'typeof') || (id === 'delete') ||\n (id === 'switch') || (id === 'export') || (id === 'import');\n case 7:\n return (id === 'default') || (id === 'finally') || (id === 'extends');\n case 8:\n return (id === 'function') || (id === 'continue') || (id === 'debugger');\n case 10:\n return (id === 'instanceof');\n default:\n return false;\n }\n }\n\n // 7.4 Comments\n\n function addComment(type, value, start, end, loc) {\n var comment, attacher;\n\n assert(typeof start === 'number', 'Comment must have valid position');\n\n // Because the way the actual token is scanned, often the comments\n // (if any) are skipped twice during the lexical analysis.\n // Thus, we need to skip adding a comment if the comment array already\n // handled it.\n if (state.lastCommentStart >= start) {\n return;\n }\n state.lastCommentStart = start;\n\n comment = {\n type: type,\n value: value\n };\n if (extra.range) {\n comment.range = [start, end];\n }\n if (extra.loc) {\n comment.loc = loc;\n }\n extra.comments.push(comment);\n if (extra.attachComment) {\n extra.leadingComments.push(comment);\n extra.trailingComments.push(comment);\n }\n }\n\n function skipSingleLineComment(offset) {\n var start, loc, ch, comment;\n\n start = index - offset;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart - offset\n }\n };\n\n while (index < length) {\n ch = source.charCodeAt(index);\n ++index;\n if (isLineTerminator(ch)) {\n if (extra.comments) {\n comment = source.slice(start + offset, index - 1);\n loc.end = {\n line: lineNumber,\n column: index - lineStart - 1\n };\n addComment('Line', comment, start, index - 1, loc);\n }\n if (ch === 13 && source.charCodeAt(index) === 10) {\n ++index;\n }\n ++lineNumber;\n lineStart = index;\n return;\n }\n }\n\n if (extra.comments) {\n comment = source.slice(start + offset, index);\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n addComment('Line', comment, start, index, loc);\n }\n }\n\n function skipMultiLineComment() {\n var start, loc, ch, comment;\n\n if (extra.comments) {\n start = index - 2;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart - 2\n }\n };\n }\n\n while (index < length) {\n ch = source.charCodeAt(index);\n if (isLineTerminator(ch)) {\n if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {\n ++index;\n }\n ++lineNumber;\n ++index;\n lineStart = index;\n if (index >= length) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n } else if (ch === 0x2A) {\n // Block comment ends with '*/'.\n if (source.charCodeAt(index + 1) === 0x2F) {\n ++index;\n ++index;\n if (extra.comments) {\n comment = source.slice(start + 2, index - 2);\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n addComment('Block', comment, start, index, loc);\n }\n return;\n }\n ++index;\n } else {\n ++index;\n }\n }\n\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n function skipComment() {\n var ch, start;\n\n start = (index === 0);\n while (index < length) {\n ch = source.charCodeAt(index);\n\n if (isWhiteSpace(ch)) {\n ++index;\n } else if (isLineTerminator(ch)) {\n ++index;\n if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {\n ++index;\n }\n ++lineNumber;\n lineStart = index;\n start = true;\n } else if (ch === 0x2F) { // U+002F is '/'\n ch = source.charCodeAt(index + 1);\n if (ch === 0x2F) {\n ++index;\n ++index;\n skipSingleLineComment(2);\n start = true;\n } else if (ch === 0x2A) { // U+002A is '*'\n ++index;\n ++index;\n skipMultiLineComment();\n } else {\n break;\n }\n } else if (start && ch === 0x2D) { // U+002D is '-'\n // U+003E is '>'\n if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {\n // '-->' is a single-line comment\n index += 3;\n skipSingleLineComment(3);\n } else {\n break;\n }\n } else if (ch === 0x3C) { // U+003C is '<'\n if (source.slice(index + 1, index + 4) === '!--') {\n ++index; // `<`\n ++index; // `!`\n ++index; // `-`\n ++index; // `-`\n skipSingleLineComment(4);\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n\n function scanHexEscape(prefix) {\n var i, len, ch, code = 0;\n\n len = (prefix === 'u') ? 4 : 2;\n for (i = 0; i < len; ++i) {\n if (index < length && isHexDigit(source[index])) {\n ch = source[index++];\n code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n } else {\n return '';\n }\n }\n return String.fromCharCode(code);\n }\n\n function getEscapedIdentifier() {\n var ch, id;\n\n ch = source.charCodeAt(index++);\n id = String.fromCharCode(ch);\n\n // '\\u' (U+005C, U+0075) denotes an escaped character.\n if (ch === 0x5C) {\n if (source.charCodeAt(index) !== 0x75) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n ++index;\n ch = scanHexEscape('u');\n if (!ch || ch === '\\\\' || !isIdentifierStart(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n id = ch;\n }\n\n while (index < length) {\n ch = source.charCodeAt(index);\n if (!isIdentifierPart(ch)) {\n break;\n }\n ++index;\n id += String.fromCharCode(ch);\n\n // '\\u' (U+005C, U+0075) denotes an escaped character.\n if (ch === 0x5C) {\n id = id.substr(0, id.length - 1);\n if (source.charCodeAt(index) !== 0x75) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n ++index;\n ch = scanHexEscape('u');\n if (!ch || ch === '\\\\' || !isIdentifierPart(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n id += ch;\n }\n }\n\n return id;\n }\n\n function getIdentifier() {\n var start, ch;\n\n start = index++;\n while (index < length) {\n ch = source.charCodeAt(index);\n if (ch === 0x5C) {\n // Blackslash (U+005C) marks Unicode escape sequence.\n index = start;\n return getEscapedIdentifier();\n }\n if (isIdentifierPart(ch)) {\n ++index;\n } else {\n break;\n }\n }\n\n return source.slice(start, index);\n }\n\n function scanIdentifier() {\n var start, id, type;\n\n start = index;\n\n // Backslash (U+005C) starts an escaped character.\n id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();\n\n // There is no keyword or literal with only one character.\n // Thus, it must be an identifier.\n if (id.length === 1) {\n type = Token.Identifier;\n } else if (isKeyword(id)) {\n type = Token.Keyword;\n } else if (id === 'null') {\n type = Token.NullLiteral;\n } else if (id === 'true' || id === 'false') {\n type = Token.BooleanLiteral;\n } else {\n type = Token.Identifier;\n }\n\n return {\n type: type,\n value: id,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n\n // 7.7 Punctuators\n\n function scanPunctuator() {\n var start = index,\n code = source.charCodeAt(index),\n code2,\n ch1 = source[index],\n ch2,\n ch3,\n ch4;\n\n switch (code) {\n\n // Check for most common single-character punctuators.\n case 0x2E: // . dot\n case 0x28: // ( open bracket\n case 0x29: // ) close bracket\n case 0x3B: // ; semicolon\n case 0x2C: // , comma\n case 0x7B: // { open curly brace\n case 0x7D: // } close curly brace\n case 0x5B: // [\n case 0x5D: // ]\n case 0x3A: // :\n case 0x3F: // ?\n case 0x7E: // ~\n ++index;\n if (extra.tokenize) {\n if (code === 0x28) {\n extra.openParenToken = extra.tokens.length;\n } else if (code === 0x7B) {\n extra.openCurlyToken = extra.tokens.length;\n }\n }\n return {\n type: Token.Punctuator,\n value: String.fromCharCode(code),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n\n default:\n code2 = source.charCodeAt(index + 1);\n\n // '=' (U+003D) marks an assignment or comparison operator.\n if (code2 === 0x3D) {\n switch (code) {\n case 0x2B: // +\n case 0x2D: // -\n case 0x2F: // /\n case 0x3C: // <\n case 0x3E: // >\n case 0x5E: // ^\n case 0x7C: // |\n case 0x25: // %\n case 0x26: // &\n case 0x2A: // *\n index += 2;\n return {\n type: Token.Punctuator,\n value: String.fromCharCode(code) + String.fromCharCode(code2),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n\n case 0x21: // !\n case 0x3D: // =\n index += 2;\n\n // !== and ===\n if (source.charCodeAt(index) === 0x3D) {\n ++index;\n }\n return {\n type: Token.Punctuator,\n value: source.slice(start, index),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n }\n }\n\n // 4-character punctuator: >>>=\n\n ch4 = source.substr(index, 4);\n\n if (ch4 === '>>>=') {\n index += 4;\n return {\n type: Token.Punctuator,\n value: ch4,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 3-character punctuators: === !== >>> <<= >>=\n\n ch3 = ch4.substr(0, 3);\n\n if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {\n index += 3;\n return {\n type: Token.Punctuator,\n value: ch3,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // Other 2-character punctuators: ++ -- << >> && ||\n ch2 = ch3.substr(0, 2);\n\n if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') {\n index += 2;\n return {\n type: Token.Punctuator,\n value: ch2,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 1-character punctuators: < > = ! + - * % & | ^ /\n if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n ++index;\n return {\n type: Token.Punctuator,\n value: ch1,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n // 7.8.3 Numeric Literals\n\n function scanHexLiteral(start) {\n var number = '';\n\n while (index < length) {\n if (!isHexDigit(source[index])) {\n break;\n }\n number += source[index++];\n }\n\n if (number.length === 0) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n if (isIdentifierStart(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseInt('0x' + number, 16),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function scanOctalLiteral(start) {\n var number = '0' + source[index++];\n while (index < length) {\n if (!isOctalDigit(source[index])) {\n break;\n }\n number += source[index++];\n }\n\n if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseInt(number, 8),\n octal: true,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function scanNumericLiteral() {\n var number, start, ch;\n\n ch = source[index];\n assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n 'Numeric literal must start with a decimal digit or a decimal point');\n\n start = index;\n number = '';\n if (ch !== '.') {\n number = source[index++];\n ch = source[index];\n\n // Hex number starts with '0x'.\n // Octal number starts with '0'.\n if (number === '0') {\n if (ch === 'x' || ch === 'X') {\n ++index;\n return scanHexLiteral(start);\n }\n if (isOctalDigit(ch)) {\n return scanOctalLiteral(start);\n }\n\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n }\n\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n ch = source[index];\n }\n\n if (ch === '.') {\n number += source[index++];\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n ch = source[index];\n }\n\n if (ch === 'e' || ch === 'E') {\n number += source[index++];\n\n ch = source[index];\n if (ch === '+' || ch === '-') {\n number += source[index++];\n }\n if (isDecimalDigit(source.charCodeAt(index))) {\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n } else {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n }\n\n if (isIdentifierStart(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseFloat(number),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 7.8.4 String Literals\n\n function scanStringLiteral() {\n var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart;\n startLineNumber = lineNumber;\n startLineStart = lineStart;\n\n quote = source[index];\n assert((quote === '\\'' || quote === '\"'),\n 'String literal must starts with a quote');\n\n start = index;\n ++index;\n\n while (index < length) {\n ch = source[index++];\n\n if (ch === quote) {\n quote = '';\n break;\n } else if (ch === '\\\\') {\n ch = source[index++];\n if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n switch (ch) {\n case 'u':\n case 'x':\n restore = index;\n unescaped = scanHexEscape(ch);\n if (unescaped) {\n str += unescaped;\n } else {\n index = restore;\n str += ch;\n }\n break;\n case 'n':\n str += '\\n';\n break;\n case 'r':\n str += '\\r';\n break;\n case 't':\n str += '\\t';\n break;\n case 'b':\n str += '\\b';\n break;\n case 'f':\n str += '\\f';\n break;\n case 'v':\n str += '\\x0B';\n break;\n\n default:\n if (isOctalDigit(ch)) {\n code = '01234567'.indexOf(ch);\n\n // \\0 is not octal escape sequence\n if (code !== 0) {\n octal = true;\n }\n\n if (index < length && isOctalDigit(source[index])) {\n octal = true;\n code = code * 8 + '01234567'.indexOf(source[index++]);\n\n // 3 digits are only allowed when string starts\n // with 0, 1, 2, 3\n if ('0123'.indexOf(ch) >= 0 &&\n index < length &&\n isOctalDigit(source[index])) {\n code = code * 8 + '01234567'.indexOf(source[index++]);\n }\n }\n str += String.fromCharCode(code);\n } else {\n str += ch;\n }\n break;\n }\n } else {\n ++lineNumber;\n if (ch === '\\r' && source[index] === '\\n') {\n ++index;\n }\n lineStart = index;\n }\n } else if (isLineTerminator(ch.charCodeAt(0))) {\n break;\n } else {\n str += ch;\n }\n }\n\n if (quote !== '') {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.StringLiteral,\n value: str,\n octal: octal,\n startLineNumber: startLineNumber,\n startLineStart: startLineStart,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function testRegExp(pattern, flags) {\n var value;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n throwError({}, Messages.InvalidRegExp);\n }\n return value;\n }\n\n function scanRegExpBody() {\n var ch, str, classMarker, terminated, body;\n\n ch = source[index];\n assert(ch === '/', 'Regular expression literal must start with a slash');\n str = source[index++];\n\n classMarker = false;\n terminated = false;\n while (index < length) {\n ch = source[index++];\n str += ch;\n if (ch === '\\\\') {\n ch = source[index++];\n // ECMA-262 7.8.5\n if (isLineTerminator(ch.charCodeAt(0))) {\n throwError({}, Messages.UnterminatedRegExp);\n }\n str += ch;\n } else if (isLineTerminator(ch.charCodeAt(0))) {\n throwError({}, Messages.UnterminatedRegExp);\n } else if (classMarker) {\n if (ch === ']') {\n classMarker = false;\n }\n } else {\n if (ch === '/') {\n terminated = true;\n break;\n } else if (ch === '[') {\n classMarker = true;\n }\n }\n }\n\n if (!terminated) {\n throwError({}, Messages.UnterminatedRegExp);\n }\n\n // Exclude leading and trailing slash.\n body = str.substr(1, str.length - 2);\n return {\n value: body,\n literal: str\n };\n }\n\n function scanRegExpFlags() {\n var ch, str, flags, restore;\n\n str = '';\n flags = '';\n while (index < length) {\n ch = source[index];\n if (!isIdentifierPart(ch.charCodeAt(0))) {\n break;\n }\n\n ++index;\n if (ch === '\\\\' && index < length) {\n ch = source[index];\n if (ch === 'u') {\n ++index;\n restore = index;\n ch = scanHexEscape('u');\n if (ch) {\n flags += ch;\n for (str += '\\\\u'; restore < index; ++restore) {\n str += source[restore];\n }\n } else {\n index = restore;\n flags += 'u';\n str += '\\\\u';\n }\n throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');\n } else {\n str += '\\\\';\n throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n } else {\n flags += ch;\n str += ch;\n }\n }\n\n return {\n value: flags,\n literal: str\n };\n }\n\n function scanRegExp() {\n var start, body, flags, pattern, value;\n\n lookahead = null;\n skipComment();\n start = index;\n\n body = scanRegExpBody();\n flags = scanRegExpFlags();\n value = testRegExp(body.value, flags.value);\n\n if (extra.tokenize) {\n return {\n type: Token.RegularExpression,\n value: value,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n return {\n literal: body.literal + flags.literal,\n value: value,\n start: start,\n end: index\n };\n }\n\n function collectRegex() {\n var pos, loc, regex, token;\n\n skipComment();\n\n pos = index;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart\n }\n };\n\n regex = scanRegExp();\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n\n /* istanbul ignore next */\n if (!extra.tokenize) {\n // Pop the previous token, which is likely '/' or '/='\n if (extra.tokens.length > 0) {\n token = extra.tokens[extra.tokens.length - 1];\n if (token.range[0] === pos && token.type === 'Punctuator') {\n if (token.value === '/' || token.value === '/=') {\n extra.tokens.pop();\n }\n }\n }\n\n extra.tokens.push({\n type: 'RegularExpression',\n value: regex.literal,\n range: [pos, index],\n loc: loc\n });\n }\n\n return regex;\n }\n\n function isIdentifierName(token) {\n return token.type === Token.Identifier ||\n token.type === Token.Keyword ||\n token.type === Token.BooleanLiteral ||\n token.type === Token.NullLiteral;\n }\n\n function advanceSlash() {\n var prevToken,\n checkToken;\n // Using the following algorithm:\n // https://github.com/mozilla/sweet.js/wiki/design\n prevToken = extra.tokens[extra.tokens.length - 1];\n if (!prevToken) {\n // Nothing before that: it cannot be a division.\n return collectRegex();\n }\n if (prevToken.type === 'Punctuator') {\n if (prevToken.value === ']') {\n return scanPunctuator();\n }\n if (prevToken.value === ')') {\n checkToken = extra.tokens[extra.openParenToken - 1];\n if (checkToken &&\n checkToken.type === 'Keyword' &&\n (checkToken.value === 'if' ||\n checkToken.value === 'while' ||\n checkToken.value === 'for' ||\n checkToken.value === 'with')) {\n return collectRegex();\n }\n return scanPunctuator();\n }\n if (prevToken.value === '}') {\n // Dividing a function by anything makes little sense,\n // but we have to check for that.\n if (extra.tokens[extra.openCurlyToken - 3] &&\n extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') {\n // Anonymous function.\n checkToken = extra.tokens[extra.openCurlyToken - 4];\n if (!checkToken) {\n return scanPunctuator();\n }\n } else if (extra.tokens[extra.openCurlyToken - 4] &&\n extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') {\n // Named function.\n checkToken = extra.tokens[extra.openCurlyToken - 5];\n if (!checkToken) {\n return collectRegex();\n }\n } else {\n return scanPunctuator();\n }\n // checkToken determines whether the function is\n // a declaration or an expression.\n if (FnExprTokens.indexOf(checkToken.value) >= 0) {\n // It is an expression.\n return scanPunctuator();\n }\n // It is a declaration.\n return collectRegex();\n }\n return collectRegex();\n }\n if (prevToken.type === 'Keyword') {\n return collectRegex();\n }\n return scanPunctuator();\n }\n\n function advance() {\n var ch;\n\n skipComment();\n\n if (index >= length) {\n return {\n type: Token.EOF,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: index,\n end: index\n };\n }\n\n ch = source.charCodeAt(index);\n\n if (isIdentifierStart(ch)) {\n return scanIdentifier();\n }\n\n // Very common: ( and ) and ;\n if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {\n return scanPunctuator();\n }\n\n // String literal starts with single quote (U+0027) or double quote (U+0022).\n if (ch === 0x27 || ch === 0x22) {\n return scanStringLiteral();\n }\n\n\n // Dot (.) U+002E can also start a floating-point number, hence the need\n // to check the next character.\n if (ch === 0x2E) {\n if (isDecimalDigit(source.charCodeAt(index + 1))) {\n return scanNumericLiteral();\n }\n return scanPunctuator();\n }\n\n if (isDecimalDigit(ch)) {\n return scanNumericLiteral();\n }\n\n // Slash (/) U+002F can also start a regex.\n if (extra.tokenize && ch === 0x2F) {\n return advanceSlash();\n }\n\n return scanPunctuator();\n }\n\n function collectToken() {\n var loc, token, range, value;\n\n skipComment();\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart\n }\n };\n\n token = advance();\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n\n if (token.type !== Token.EOF) {\n value = source.slice(token.start, token.end);\n extra.tokens.push({\n type: TokenName[token.type],\n value: value,\n range: [token.start, token.end],\n loc: loc\n });\n }\n\n return token;\n }\n\n function lex() {\n var token;\n\n token = lookahead;\n index = token.end;\n lineNumber = token.lineNumber;\n lineStart = token.lineStart;\n\n lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n\n index = token.end;\n lineNumber = token.lineNumber;\n lineStart = token.lineStart;\n\n return token;\n }\n\n function peek() {\n var pos, line, start;\n\n pos = index;\n line = lineNumber;\n start = lineStart;\n lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n index = pos;\n lineNumber = line;\n lineStart = start;\n }\n\n function Position(line, column) {\n this.line = line;\n this.column = column;\n }\n\n function SourceLocation(startLine, startColumn, line, column) {\n this.start = new Position(startLine, startColumn);\n this.end = new Position(line, column);\n }\n\n SyntaxTreeDelegate = {\n\n name: 'SyntaxTree',\n\n processComment: function (node) {\n var lastChild, trailingComments;\n\n if (node.type === Syntax.Program) {\n if (node.body.length > 0) {\n return;\n }\n }\n\n if (extra.trailingComments.length > 0) {\n if (extra.trailingComments[0].range[0] >= node.range[1]) {\n trailingComments = extra.trailingComments;\n extra.trailingComments = [];\n } else {\n extra.trailingComments.length = 0;\n }\n } else {\n if (extra.bottomRightStack.length > 0 &&\n extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&\n extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {\n trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;\n delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;\n }\n }\n\n // Eating the stack.\n while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {\n lastChild = extra.bottomRightStack.pop();\n }\n\n if (lastChild) {\n if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {\n node.leadingComments = lastChild.leadingComments;\n delete lastChild.leadingComments;\n }\n } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {\n node.leadingComments = extra.leadingComments;\n extra.leadingComments = [];\n }\n\n\n if (trailingComments) {\n node.trailingComments = trailingComments;\n }\n\n extra.bottomRightStack.push(node);\n },\n\n markEnd: function (node, startToken) {\n if (extra.range) {\n node.range = [startToken.start, index];\n }\n if (extra.loc) {\n node.loc = new SourceLocation(\n startToken.startLineNumber === undefined ? startToken.lineNumber : startToken.startLineNumber,\n startToken.start - (startToken.startLineStart === undefined ? startToken.lineStart : startToken.startLineStart),\n lineNumber,\n index - lineStart\n );\n this.postProcess(node);\n }\n\n if (extra.attachComment) {\n this.processComment(node);\n }\n return node;\n },\n\n postProcess: function (node) {\n if (extra.source) {\n node.loc.source = extra.source;\n }\n return node;\n },\n\n createArrayExpression: function (elements) {\n return {\n type: Syntax.ArrayExpression,\n elements: elements\n };\n },\n\n createAssignmentExpression: function (operator, left, right) {\n return {\n type: Syntax.AssignmentExpression,\n operator: operator,\n left: left,\n right: right\n };\n },\n\n createBinaryExpression: function (operator, left, right) {\n var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression :\n Syntax.BinaryExpression;\n return {\n type: type,\n operator: operator,\n left: left,\n right: right\n };\n },\n\n createBlockStatement: function (body) {\n return {\n type: Syntax.BlockStatement,\n body: body\n };\n },\n\n createBreakStatement: function (label) {\n return {\n type: Syntax.BreakStatement,\n label: label\n };\n },\n\n createCallExpression: function (callee, args) {\n return {\n type: Syntax.CallExpression,\n callee: callee,\n 'arguments': args\n };\n },\n\n createCatchClause: function (param, body) {\n return {\n type: Syntax.CatchClause,\n param: param,\n body: body\n };\n },\n\n createConditionalExpression: function (test, consequent, alternate) {\n return {\n type: Syntax.ConditionalExpression,\n test: test,\n consequent: consequent,\n alternate: alternate\n };\n },\n\n createContinueStatement: function (label) {\n return {\n type: Syntax.ContinueStatement,\n label: label\n };\n },\n\n createDebuggerStatement: function () {\n return {\n type: Syntax.DebuggerStatement\n };\n },\n\n createDoWhileStatement: function (body, test) {\n return {\n type: Syntax.DoWhileStatement,\n body: body,\n test: test\n };\n },\n\n createEmptyStatement: function () {\n return {\n type: Syntax.EmptyStatement\n };\n },\n\n createExpressionStatement: function (expression) {\n return {\n type: Syntax.ExpressionStatement,\n expression: expression\n };\n },\n\n createForStatement: function (init, test, update, body) {\n return {\n type: Syntax.ForStatement,\n init: init,\n test: test,\n update: update,\n body: body\n };\n },\n\n createForInStatement: function (left, right, body) {\n return {\n type: Syntax.ForInStatement,\n left: left,\n right: right,\n body: body,\n each: false\n };\n },\n\n createFunctionDeclaration: function (id, params, defaults, body) {\n return {\n type: Syntax.FunctionDeclaration,\n id: id,\n params: params,\n defaults: defaults,\n body: body,\n rest: null,\n generator: false,\n expression: false\n };\n },\n\n createFunctionExpression: function (id, params, defaults, body) {\n return {\n type: Syntax.FunctionExpression,\n id: id,\n params: params,\n defaults: defaults,\n body: body,\n rest: null,\n generator: false,\n expression: false\n };\n },\n\n createIdentifier: function (name) {\n return {\n type: Syntax.Identifier,\n name: name\n };\n },\n\n createIfStatement: function (test, consequent, alternate) {\n return {\n type: Syntax.IfStatement,\n test: test,\n consequent: consequent,\n alternate: alternate\n };\n },\n\n createLabeledStatement: function (label, body) {\n return {\n type: Syntax.LabeledStatement,\n label: label,\n body: body\n };\n },\n\n createLiteral: function (token) {\n return {\n type: Syntax.Literal,\n value: token.value,\n raw: source.slice(token.start, token.end)\n };\n },\n\n createMemberExpression: function (accessor, object, property) {\n return {\n type: Syntax.MemberExpression,\n computed: accessor === '[',\n object: object,\n property: property\n };\n },\n\n createNewExpression: function (callee, args) {\n return {\n type: Syntax.NewExpression,\n callee: callee,\n 'arguments': args\n };\n },\n\n createObjectExpression: function (properties) {\n return {\n type: Syntax.ObjectExpression,\n properties: properties\n };\n },\n\n createPostfixExpression: function (operator, argument) {\n return {\n type: Syntax.UpdateExpression,\n operator: operator,\n argument: argument,\n prefix: false\n };\n },\n\n createProgram: function (body) {\n return {\n type: Syntax.Program,\n body: body\n };\n },\n\n createProperty: function (kind, key, value) {\n return {\n type: Syntax.Property,\n key: key,\n value: value,\n kind: kind\n };\n },\n\n createReturnStatement: function (argument) {\n return {\n type: Syntax.ReturnStatement,\n argument: argument\n };\n },\n\n createSequenceExpression: function (expressions) {\n return {\n type: Syntax.SequenceExpression,\n expressions: expressions\n };\n },\n\n createSwitchCase: function (test, consequent) {\n return {\n type: Syntax.SwitchCase,\n test: test,\n consequent: consequent\n };\n },\n\n createSwitchStatement: function (discriminant, cases) {\n return {\n type: Syntax.SwitchStatement,\n discriminant: discriminant,\n cases: cases\n };\n },\n\n createThisExpression: function () {\n return {\n type: Syntax.ThisExpression\n };\n },\n\n createThrowStatement: function (argument) {\n return {\n type: Syntax.ThrowStatement,\n argument: argument\n };\n },\n\n createTryStatement: function (block, guardedHandlers, handlers, finalizer) {\n return {\n type: Syntax.TryStatement,\n block: block,\n guardedHandlers: guardedHandlers,\n handlers: handlers,\n finalizer: finalizer\n };\n },\n\n createUnaryExpression: function (operator, argument) {\n if (operator === '++' || operator === '--') {\n return {\n type: Syntax.UpdateExpression,\n operator: operator,\n argument: argument,\n prefix: true\n };\n }\n return {\n type: Syntax.UnaryExpression,\n operator: operator,\n argument: argument,\n prefix: true\n };\n },\n\n createVariableDeclaration: function (declarations, kind) {\n return {\n type: Syntax.VariableDeclaration,\n declarations: declarations,\n kind: kind\n };\n },\n\n createVariableDeclarator: function (id, init) {\n return {\n type: Syntax.VariableDeclarator,\n id: id,\n init: init\n };\n },\n\n createWhileStatement: function (test, body) {\n return {\n type: Syntax.WhileStatement,\n test: test,\n body: body\n };\n },\n\n createWithStatement: function (object, body) {\n return {\n type: Syntax.WithStatement,\n object: object,\n body: body\n };\n }\n };\n\n // Return true if there is a line terminator before the next token.\n\n function peekLineTerminator() {\n var pos, line, start, found;\n\n pos = index;\n line = lineNumber;\n start = lineStart;\n skipComment();\n found = lineNumber !== line;\n index = pos;\n lineNumber = line;\n lineStart = start;\n\n return found;\n }\n\n // Throw an exception\n\n function throwError(token, messageFormat) {\n var error,\n args = Array.prototype.slice.call(arguments, 2),\n msg = messageFormat.replace(\n /%(\\d)/g,\n function (whole, index) {\n assert(index < args.length, 'Message reference must be in range');\n return args[index];\n }\n );\n\n if (typeof token.lineNumber === 'number') {\n error = new Error('Line ' + token.lineNumber + ': ' + msg);\n error.index = token.start;\n error.lineNumber = token.lineNumber;\n error.column = token.start - lineStart + 1;\n } else {\n error = new Error('Line ' + lineNumber + ': ' + msg);\n error.index = index;\n error.lineNumber = lineNumber;\n error.column = index - lineStart + 1;\n }\n\n error.description = msg;\n throw error;\n }\n\n function throwErrorTolerant() {\n try {\n throwError.apply(null, arguments);\n } catch (e) {\n if (extra.errors) {\n extra.errors.push(e);\n } else {\n throw e;\n }\n }\n }\n\n\n // Throw an exception because of the token.\n\n function throwUnexpected(token) {\n if (token.type === Token.EOF) {\n throwError(token, Messages.UnexpectedEOS);\n }\n\n if (token.type === Token.NumericLiteral) {\n throwError(token, Messages.UnexpectedNumber);\n }\n\n if (token.type === Token.StringLiteral) {\n throwError(token, Messages.UnexpectedString);\n }\n\n if (token.type === Token.Identifier) {\n throwError(token, Messages.UnexpectedIdentifier);\n }\n\n if (token.type === Token.Keyword) {\n if (isFutureReservedWord(token.value)) {\n throwError(token, Messages.UnexpectedReserved);\n } else if (strict && isStrictModeReservedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictReservedWord);\n return;\n }\n throwError(token, Messages.UnexpectedToken, token.value);\n }\n\n // BooleanLiteral, NullLiteral, or Punctuator.\n throwError(token, Messages.UnexpectedToken, token.value);\n }\n\n // Expect the next token to match the specified punctuator.\n // If not, an exception will be thrown.\n\n function expect(value) {\n var token = lex();\n if (token.type !== Token.Punctuator || token.value !== value) {\n throwUnexpected(token);\n }\n }\n\n // Expect the next token to match the specified keyword.\n // If not, an exception will be thrown.\n\n function expectKeyword(keyword) {\n var token = lex();\n if (token.type !== Token.Keyword || token.value !== keyword) {\n throwUnexpected(token);\n }\n }\n\n // Return true if the next token matches the specified punctuator.\n\n function match(value) {\n return lookahead.type === Token.Punctuator && lookahead.value === value;\n }\n\n // Return true if the next token matches the specified keyword\n\n function matchKeyword(keyword) {\n return lookahead.type === Token.Keyword && lookahead.value === keyword;\n }\n\n // Return true if the next token is an assignment operator\n\n function matchAssign() {\n var op;\n\n if (lookahead.type !== Token.Punctuator) {\n return false;\n }\n op = lookahead.value;\n return op === '=' ||\n op === '*=' ||\n op === '/=' ||\n op === '%=' ||\n op === '+=' ||\n op === '-=' ||\n op === '<<=' ||\n op === '>>=' ||\n op === '>>>=' ||\n op === '&=' ||\n op === '^=' ||\n op === '|=';\n }\n\n function consumeSemicolon() {\n var line;\n\n // Catch the very common case first: immediately a semicolon (U+003B).\n if (source.charCodeAt(index) === 0x3B || match(';')) {\n lex();\n return;\n }\n\n line = lineNumber;\n skipComment();\n if (lineNumber !== line) {\n return;\n }\n\n if (lookahead.type !== Token.EOF && !match('}')) {\n throwUnexpected(lookahead);\n }\n }\n\n // Return true if provided expression is LeftHandSideExpression\n\n function isLeftHandSide(expr) {\n return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;\n }\n\n // 11.1.4 Array Initialiser\n\n function parseArrayInitialiser() {\n var elements = [], startToken;\n\n startToken = lookahead;\n expect('[');\n\n while (!match(']')) {\n if (match(',')) {\n lex();\n elements.push(null);\n } else {\n elements.push(parseAssignmentExpression());\n\n if (!match(']')) {\n expect(',');\n }\n }\n }\n\n lex();\n\n return delegate.markEnd(delegate.createArrayExpression(elements), startToken);\n }\n\n // 11.1.5 Object Initialiser\n\n function parsePropertyFunction(param, first) {\n var previousStrict, body, startToken;\n\n previousStrict = strict;\n startToken = lookahead;\n body = parseFunctionSourceElements();\n if (first && strict && isRestrictedWord(param[0].name)) {\n throwErrorTolerant(first, Messages.StrictParamName);\n }\n strict = previousStrict;\n return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken);\n }\n\n function parseObjectPropertyKey() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n // Note: This function is called only from parseObjectProperty(), where\n // EOF and Punctuator tokens are already filtered out.\n\n if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n if (strict && token.octal) {\n throwErrorTolerant(token, Messages.StrictOctalLiteral);\n }\n return delegate.markEnd(delegate.createLiteral(token), startToken);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseObjectProperty() {\n var token, key, id, value, param, startToken;\n\n token = lookahead;\n startToken = lookahead;\n\n if (token.type === Token.Identifier) {\n\n id = parseObjectPropertyKey();\n\n // Property Assignment: Getter and Setter.\n\n if (token.value === 'get' && !match(':')) {\n key = parseObjectPropertyKey();\n expect('(');\n expect(')');\n value = parsePropertyFunction([]);\n return delegate.markEnd(delegate.createProperty('get', key, value), startToken);\n }\n if (token.value === 'set' && !match(':')) {\n key = parseObjectPropertyKey();\n expect('(');\n token = lookahead;\n if (token.type !== Token.Identifier) {\n expect(')');\n throwErrorTolerant(token, Messages.UnexpectedToken, token.value);\n value = parsePropertyFunction([]);\n } else {\n param = [ parseVariableIdentifier() ];\n expect(')');\n value = parsePropertyFunction(param, token);\n }\n return delegate.markEnd(delegate.createProperty('set', key, value), startToken);\n }\n expect(':');\n value = parseAssignmentExpression();\n return delegate.markEnd(delegate.createProperty('init', id, value), startToken);\n }\n if (token.type === Token.EOF || token.type === Token.Punctuator) {\n throwUnexpected(token);\n } else {\n key = parseObjectPropertyKey();\n expect(':');\n value = parseAssignmentExpression();\n return delegate.markEnd(delegate.createProperty('init', key, value), startToken);\n }\n }\n\n function parseObjectInitialiser() {\n var properties = [], property, name, key, kind, map = {}, toString = String, startToken;\n\n startToken = lookahead;\n\n expect('{');\n\n while (!match('}')) {\n property = parseObjectProperty();\n\n if (property.key.type === Syntax.Identifier) {\n name = property.key.name;\n } else {\n name = toString(property.key.value);\n }\n kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;\n\n key = '$' + name;\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n if (map[key] === PropertyKind.Data) {\n if (strict && kind === PropertyKind.Data) {\n throwErrorTolerant({}, Messages.StrictDuplicateProperty);\n } else if (kind !== PropertyKind.Data) {\n throwErrorTolerant({}, Messages.AccessorDataProperty);\n }\n } else {\n if (kind === PropertyKind.Data) {\n throwErrorTolerant({}, Messages.AccessorDataProperty);\n } else if (map[key] & kind) {\n throwErrorTolerant({}, Messages.AccessorGetSet);\n }\n }\n map[key] |= kind;\n } else {\n map[key] = kind;\n }\n\n properties.push(property);\n\n if (!match('}')) {\n expect(',');\n }\n }\n\n expect('}');\n\n return delegate.markEnd(delegate.createObjectExpression(properties), startToken);\n }\n\n // 11.1.6 The Grouping Operator\n\n function parseGroupExpression() {\n var expr;\n\n expect('(');\n\n expr = parseExpression();\n\n expect(')');\n\n return expr;\n }\n\n\n // 11.1 Primary Expressions\n\n function parsePrimaryExpression() {\n var type, token, expr, startToken;\n\n if (match('(')) {\n return parseGroupExpression();\n }\n\n if (match('[')) {\n return parseArrayInitialiser();\n }\n\n if (match('{')) {\n return parseObjectInitialiser();\n }\n\n type = lookahead.type;\n startToken = lookahead;\n\n if (type === Token.Identifier) {\n expr = delegate.createIdentifier(lex().value);\n } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n if (strict && lookahead.octal) {\n throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);\n }\n expr = delegate.createLiteral(lex());\n } else if (type === Token.Keyword) {\n if (matchKeyword('function')) {\n return parseFunctionExpression();\n }\n if (matchKeyword('this')) {\n lex();\n expr = delegate.createThisExpression();\n } else {\n throwUnexpected(lex());\n }\n } else if (type === Token.BooleanLiteral) {\n token = lex();\n token.value = (token.value === 'true');\n expr = delegate.createLiteral(token);\n } else if (type === Token.NullLiteral) {\n token = lex();\n token.value = null;\n expr = delegate.createLiteral(token);\n } else if (match('/') || match('/=')) {\n if (typeof extra.tokens !== 'undefined') {\n expr = delegate.createLiteral(collectRegex());\n } else {\n expr = delegate.createLiteral(scanRegExp());\n }\n peek();\n } else {\n throwUnexpected(lex());\n }\n\n return delegate.markEnd(expr, startToken);\n }\n\n // 11.2 Left-Hand-Side Expressions\n\n function parseArguments() {\n var args = [];\n\n expect('(');\n\n if (!match(')')) {\n while (index < length) {\n args.push(parseAssignmentExpression());\n if (match(')')) {\n break;\n }\n expect(',');\n }\n }\n\n expect(')');\n\n return args;\n }\n\n function parseNonComputedProperty() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n if (!isIdentifierName(token)) {\n throwUnexpected(token);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseNonComputedMember() {\n expect('.');\n\n return parseNonComputedProperty();\n }\n\n function parseComputedMember() {\n var expr;\n\n expect('[');\n\n expr = parseExpression();\n\n expect(']');\n\n return expr;\n }\n\n function parseNewExpression() {\n var callee, args, startToken;\n\n startToken = lookahead;\n expectKeyword('new');\n callee = parseLeftHandSideExpression();\n args = match('(') ? parseArguments() : [];\n\n return delegate.markEnd(delegate.createNewExpression(callee, args), startToken);\n }\n\n function parseLeftHandSideExpressionAllowCall() {\n var previousAllowIn, expr, args, property, startToken;\n\n startToken = lookahead;\n\n previousAllowIn = state.allowIn;\n state.allowIn = true;\n expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n state.allowIn = previousAllowIn;\n\n for (;;) {\n if (match('.')) {\n property = parseNonComputedMember();\n expr = delegate.createMemberExpression('.', expr, property);\n } else if (match('(')) {\n args = parseArguments();\n expr = delegate.createCallExpression(expr, args);\n } else if (match('[')) {\n property = parseComputedMember();\n expr = delegate.createMemberExpression('[', expr, property);\n } else {\n break;\n }\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n function parseLeftHandSideExpression() {\n var previousAllowIn, expr, property, startToken;\n\n startToken = lookahead;\n\n previousAllowIn = state.allowIn;\n expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n state.allowIn = previousAllowIn;\n\n while (match('.') || match('[')) {\n if (match('[')) {\n property = parseComputedMember();\n expr = delegate.createMemberExpression('[', expr, property);\n } else {\n property = parseNonComputedMember();\n expr = delegate.createMemberExpression('.', expr, property);\n }\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 11.3 Postfix Expressions\n\n function parsePostfixExpression() {\n var expr, token, startToken = lookahead;\n\n expr = parseLeftHandSideExpressionAllowCall();\n\n if (lookahead.type === Token.Punctuator) {\n if ((match('++') || match('--')) && !peekLineTerminator()) {\n // 11.3.1, 11.3.2\n if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n throwErrorTolerant({}, Messages.StrictLHSPostfix);\n }\n\n if (!isLeftHandSide(expr)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n token = lex();\n expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken);\n }\n }\n\n return expr;\n }\n\n // 11.4 Unary Operators\n\n function parseUnaryExpression() {\n var token, expr, startToken;\n\n if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n expr = parsePostfixExpression();\n } else if (match('++') || match('--')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n // 11.4.4, 11.4.5\n if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n throwErrorTolerant({}, Messages.StrictLHSPrefix);\n }\n\n if (!isLeftHandSide(expr)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n } else if (match('+') || match('-') || match('~') || match('!')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {\n throwErrorTolerant({}, Messages.StrictDelete);\n }\n } else {\n expr = parsePostfixExpression();\n }\n\n return expr;\n }\n\n function binaryPrecedence(token, allowIn) {\n var prec = 0;\n\n if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n return 0;\n }\n\n switch (token.value) {\n case '||':\n prec = 1;\n break;\n\n case '&&':\n prec = 2;\n break;\n\n case '|':\n prec = 3;\n break;\n\n case '^':\n prec = 4;\n break;\n\n case '&':\n prec = 5;\n break;\n\n case '==':\n case '!=':\n case '===':\n case '!==':\n prec = 6;\n break;\n\n case '<':\n case '>':\n case '<=':\n case '>=':\n case 'instanceof':\n prec = 7;\n break;\n\n case 'in':\n prec = allowIn ? 7 : 0;\n break;\n\n case '<<':\n case '>>':\n case '>>>':\n prec = 8;\n break;\n\n case '+':\n case '-':\n prec = 9;\n break;\n\n case '*':\n case '/':\n case '%':\n prec = 11;\n break;\n\n default:\n break;\n }\n\n return prec;\n }\n\n // 11.5 Multiplicative Operators\n // 11.6 Additive Operators\n // 11.7 Bitwise Shift Operators\n // 11.8 Relational Operators\n // 11.9 Equality Operators\n // 11.10 Binary Bitwise Operators\n // 11.11 Binary Logical Operators\n\n function parseBinaryExpression() {\n var marker, markers, expr, token, prec, stack, right, operator, left, i;\n\n marker = lookahead;\n left = parseUnaryExpression();\n\n token = lookahead;\n prec = binaryPrecedence(token, state.allowIn);\n if (prec === 0) {\n return left;\n }\n token.prec = prec;\n lex();\n\n markers = [marker, lookahead];\n right = parseUnaryExpression();\n\n stack = [left, token, right];\n\n while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {\n\n // Reduce: make a binary expression from the three topmost entries.\n while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n right = stack.pop();\n operator = stack.pop().value;\n left = stack.pop();\n expr = delegate.createBinaryExpression(operator, left, right);\n markers.pop();\n marker = markers[markers.length - 1];\n delegate.markEnd(expr, marker);\n stack.push(expr);\n }\n\n // Shift.\n token = lex();\n token.prec = prec;\n stack.push(token);\n markers.push(lookahead);\n expr = parseUnaryExpression();\n stack.push(expr);\n }\n\n // Final reduce to clean-up the stack.\n i = stack.length - 1;\n expr = stack[i];\n markers.pop();\n while (i > 1) {\n expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n i -= 2;\n marker = markers.pop();\n delegate.markEnd(expr, marker);\n }\n\n return expr;\n }\n\n\n // 11.12 Conditional Operator\n\n function parseConditionalExpression() {\n var expr, previousAllowIn, consequent, alternate, startToken;\n\n startToken = lookahead;\n\n expr = parseBinaryExpression();\n\n if (match('?')) {\n lex();\n previousAllowIn = state.allowIn;\n state.allowIn = true;\n consequent = parseAssignmentExpression();\n state.allowIn = previousAllowIn;\n expect(':');\n alternate = parseAssignmentExpression();\n\n expr = delegate.createConditionalExpression(expr, consequent, alternate);\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 11.13 Assignment Operators\n\n function parseAssignmentExpression() {\n var token, left, right, node, startToken;\n\n token = lookahead;\n startToken = lookahead;\n\n node = left = parseConditionalExpression();\n\n if (matchAssign()) {\n // LeftHandSideExpression\n if (!isLeftHandSide(left)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n // 11.13.1\n if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) {\n throwErrorTolerant(token, Messages.StrictLHSAssignment);\n }\n\n token = lex();\n right = parseAssignmentExpression();\n node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken);\n }\n\n return node;\n }\n\n // 11.14 Comma Operator\n\n function parseExpression() {\n var expr, startToken = lookahead;\n\n expr = parseAssignmentExpression();\n\n if (match(',')) {\n expr = delegate.createSequenceExpression([ expr ]);\n\n while (index < length) {\n if (!match(',')) {\n break;\n }\n lex();\n expr.expressions.push(parseAssignmentExpression());\n }\n\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 12.1 Block\n\n function parseStatementList() {\n var list = [],\n statement;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n statement = parseSourceElement();\n if (typeof statement === 'undefined') {\n break;\n }\n list.push(statement);\n }\n\n return list;\n }\n\n function parseBlock() {\n var block, startToken;\n\n startToken = lookahead;\n expect('{');\n\n block = parseStatementList();\n\n expect('}');\n\n return delegate.markEnd(delegate.createBlockStatement(block), startToken);\n }\n\n // 12.2 Variable Statement\n\n function parseVariableIdentifier() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n if (token.type !== Token.Identifier) {\n throwUnexpected(token);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseVariableDeclaration(kind) {\n var init = null, id, startToken;\n\n startToken = lookahead;\n id = parseVariableIdentifier();\n\n // 12.2.1\n if (strict && isRestrictedWord(id.name)) {\n throwErrorTolerant({}, Messages.StrictVarName);\n }\n\n if (kind === 'const') {\n expect('=');\n init = parseAssignmentExpression();\n } else if (match('=')) {\n lex();\n init = parseAssignmentExpression();\n }\n\n return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken);\n }\n\n function parseVariableDeclarationList(kind) {\n var list = [];\n\n do {\n list.push(parseVariableDeclaration(kind));\n if (!match(',')) {\n break;\n }\n lex();\n } while (index < length);\n\n return list;\n }\n\n function parseVariableStatement() {\n var declarations;\n\n expectKeyword('var');\n\n declarations = parseVariableDeclarationList();\n\n consumeSemicolon();\n\n return delegate.createVariableDeclaration(declarations, 'var');\n }\n\n // kind may be `const` or `let`\n // Both are experimental and not in the specification yet.\n // see http://wiki.ecmascript.org/doku.php?id=harmony:const\n // and http://wiki.ecmascript.org/doku.php?id=harmony:let\n function parseConstLetDeclaration(kind) {\n var declarations, startToken;\n\n startToken = lookahead;\n\n expectKeyword(kind);\n\n declarations = parseVariableDeclarationList(kind);\n\n consumeSemicolon();\n\n return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken);\n }\n\n // 12.3 Empty Statement\n\n function parseEmptyStatement() {\n expect(';');\n return delegate.createEmptyStatement();\n }\n\n // 12.4 Expression Statement\n\n function parseExpressionStatement() {\n var expr = parseExpression();\n consumeSemicolon();\n return delegate.createExpressionStatement(expr);\n }\n\n // 12.5 If statement\n\n function parseIfStatement() {\n var test, consequent, alternate;\n\n expectKeyword('if');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n consequent = parseStatement();\n\n if (matchKeyword('else')) {\n lex();\n alternate = parseStatement();\n } else {\n alternate = null;\n }\n\n return delegate.createIfStatement(test, consequent, alternate);\n }\n\n // 12.6 Iteration Statements\n\n function parseDoWhileStatement() {\n var body, test, oldInIteration;\n\n expectKeyword('do');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n expectKeyword('while');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n if (match(';')) {\n lex();\n }\n\n return delegate.createDoWhileStatement(body, test);\n }\n\n function parseWhileStatement() {\n var test, body, oldInIteration;\n\n expectKeyword('while');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n return delegate.createWhileStatement(test, body);\n }\n\n function parseForVariableDeclaration() {\n var token, declarations, startToken;\n\n startToken = lookahead;\n token = lex();\n declarations = parseVariableDeclarationList();\n\n return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken);\n }\n\n function parseForStatement() {\n var init, test, update, left, right, body, oldInIteration;\n\n init = test = update = null;\n\n expectKeyword('for');\n\n expect('(');\n\n if (match(';')) {\n lex();\n } else {\n if (matchKeyword('var') || matchKeyword('let')) {\n state.allowIn = false;\n init = parseForVariableDeclaration();\n state.allowIn = true;\n\n if (init.declarations.length === 1 && matchKeyword('in')) {\n lex();\n left = init;\n right = parseExpression();\n init = null;\n }\n } else {\n state.allowIn = false;\n init = parseExpression();\n state.allowIn = true;\n\n if (matchKeyword('in')) {\n // LeftHandSideExpression\n if (!isLeftHandSide(init)) {\n throwErrorTolerant({}, Messages.InvalidLHSInForIn);\n }\n\n lex();\n left = init;\n right = parseExpression();\n init = null;\n }\n }\n\n if (typeof left === 'undefined') {\n expect(';');\n }\n }\n\n if (typeof left === 'undefined') {\n\n if (!match(';')) {\n test = parseExpression();\n }\n expect(';');\n\n if (!match(')')) {\n update = parseExpression();\n }\n }\n\n expect(')');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n return (typeof left === 'undefined') ?\n delegate.createForStatement(init, test, update, body) :\n delegate.createForInStatement(left, right, body);\n }\n\n // 12.7 The continue statement\n\n function parseContinueStatement() {\n var label = null, key;\n\n expectKeyword('continue');\n\n // Optimize the most common form: 'continue;'.\n if (source.charCodeAt(index) === 0x3B) {\n lex();\n\n if (!state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(null);\n }\n\n if (peekLineTerminator()) {\n if (!state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(null);\n }\n\n if (lookahead.type === Token.Identifier) {\n label = parseVariableIdentifier();\n\n key = '$' + label.name;\n if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.UnknownLabel, label.name);\n }\n }\n\n consumeSemicolon();\n\n if (label === null && !state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(label);\n }\n\n // 12.8 The break statement\n\n function parseBreakStatement() {\n var label = null, key;\n\n expectKeyword('break');\n\n // Catch the very common case first: immediately a semicolon (U+003B).\n if (source.charCodeAt(index) === 0x3B) {\n lex();\n\n if (!(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(null);\n }\n\n if (peekLineTerminator()) {\n if (!(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(null);\n }\n\n if (lookahead.type === Token.Identifier) {\n label = parseVariableIdentifier();\n\n key = '$' + label.name;\n if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.UnknownLabel, label.name);\n }\n }\n\n consumeSemicolon();\n\n if (label === null && !(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(label);\n }\n\n // 12.9 The return statement\n\n function parseReturnStatement() {\n var argument = null;\n\n expectKeyword('return');\n\n if (!state.inFunctionBody) {\n throwErrorTolerant({}, Messages.IllegalReturn);\n }\n\n // 'return' followed by a space and an identifier is very common.\n if (source.charCodeAt(index) === 0x20) {\n if (isIdentifierStart(source.charCodeAt(index + 1))) {\n argument = parseExpression();\n consumeSemicolon();\n return delegate.createReturnStatement(argument);\n }\n }\n\n if (peekLineTerminator()) {\n return delegate.createReturnStatement(null);\n }\n\n if (!match(';')) {\n if (!match('}') && lookahead.type !== Token.EOF) {\n argument = parseExpression();\n }\n }\n\n consumeSemicolon();\n\n return delegate.createReturnStatement(argument);\n }\n\n // 12.10 The with statement\n\n function parseWithStatement() {\n var object, body;\n\n if (strict) {\n // TODO(ikarienator): Should we update the test cases instead?\n skipComment();\n throwErrorTolerant({}, Messages.StrictModeWith);\n }\n\n expectKeyword('with');\n\n expect('(');\n\n object = parseExpression();\n\n expect(')');\n\n body = parseStatement();\n\n return delegate.createWithStatement(object, body);\n }\n\n // 12.10 The swith statement\n\n function parseSwitchCase() {\n var test, consequent = [], statement, startToken;\n\n startToken = lookahead;\n if (matchKeyword('default')) {\n lex();\n test = null;\n } else {\n expectKeyword('case');\n test = parseExpression();\n }\n expect(':');\n\n while (index < length) {\n if (match('}') || matchKeyword('default') || matchKeyword('case')) {\n break;\n }\n statement = parseStatement();\n consequent.push(statement);\n }\n\n return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken);\n }\n\n function parseSwitchStatement() {\n var discriminant, cases, clause, oldInSwitch, defaultFound;\n\n expectKeyword('switch');\n\n expect('(');\n\n discriminant = parseExpression();\n\n expect(')');\n\n expect('{');\n\n cases = [];\n\n if (match('}')) {\n lex();\n return delegate.createSwitchStatement(discriminant, cases);\n }\n\n oldInSwitch = state.inSwitch;\n state.inSwitch = true;\n defaultFound = false;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n clause = parseSwitchCase();\n if (clause.test === null) {\n if (defaultFound) {\n throwError({}, Messages.MultipleDefaultsInSwitch);\n }\n defaultFound = true;\n }\n cases.push(clause);\n }\n\n state.inSwitch = oldInSwitch;\n\n expect('}');\n\n return delegate.createSwitchStatement(discriminant, cases);\n }\n\n // 12.13 The throw statement\n\n function parseThrowStatement() {\n var argument;\n\n expectKeyword('throw');\n\n if (peekLineTerminator()) {\n throwError({}, Messages.NewlineAfterThrow);\n }\n\n argument = parseExpression();\n\n consumeSemicolon();\n\n return delegate.createThrowStatement(argument);\n }\n\n // 12.14 The try statement\n\n function parseCatchClause() {\n var param, body, startToken;\n\n startToken = lookahead;\n expectKeyword('catch');\n\n expect('(');\n if (match(')')) {\n throwUnexpected(lookahead);\n }\n\n param = parseVariableIdentifier();\n // 12.14.1\n if (strict && isRestrictedWord(param.name)) {\n throwErrorTolerant({}, Messages.StrictCatchVariable);\n }\n\n expect(')');\n body = parseBlock();\n return delegate.markEnd(delegate.createCatchClause(param, body), startToken);\n }\n\n function parseTryStatement() {\n var block, handlers = [], finalizer = null;\n\n expectKeyword('try');\n\n block = parseBlock();\n\n if (matchKeyword('catch')) {\n handlers.push(parseCatchClause());\n }\n\n if (matchKeyword('finally')) {\n lex();\n finalizer = parseBlock();\n }\n\n if (handlers.length === 0 && !finalizer) {\n throwError({}, Messages.NoCatchOrFinally);\n }\n\n return delegate.createTryStatement(block, [], handlers, finalizer);\n }\n\n // 12.15 The debugger statement\n\n function parseDebuggerStatement() {\n expectKeyword('debugger');\n\n consumeSemicolon();\n\n return delegate.createDebuggerStatement();\n }\n\n // 12 Statements\n\n function parseStatement() {\n var type = lookahead.type,\n expr,\n labeledBody,\n key,\n startToken;\n\n if (type === Token.EOF) {\n throwUnexpected(lookahead);\n }\n\n if (type === Token.Punctuator && lookahead.value === '{') {\n return parseBlock();\n }\n\n startToken = lookahead;\n\n if (type === Token.Punctuator) {\n switch (lookahead.value) {\n case ';':\n return delegate.markEnd(parseEmptyStatement(), startToken);\n case '(':\n return delegate.markEnd(parseExpressionStatement(), startToken);\n default:\n break;\n }\n }\n\n if (type === Token.Keyword) {\n switch (lookahead.value) {\n case 'break':\n return delegate.markEnd(parseBreakStatement(), startToken);\n case 'continue':\n return delegate.markEnd(parseContinueStatement(), startToken);\n case 'debugger':\n return delegate.markEnd(parseDebuggerStatement(), startToken);\n case 'do':\n return delegate.markEnd(parseDoWhileStatement(), startToken);\n case 'for':\n return delegate.markEnd(parseForStatement(), startToken);\n case 'function':\n return delegate.markEnd(parseFunctionDeclaration(), startToken);\n case 'if':\n return delegate.markEnd(parseIfStatement(), startToken);\n case 'return':\n return delegate.markEnd(parseReturnStatement(), startToken);\n case 'switch':\n return delegate.markEnd(parseSwitchStatement(), startToken);\n case 'throw':\n return delegate.markEnd(parseThrowStatement(), startToken);\n case 'try':\n return delegate.markEnd(parseTryStatement(), startToken);\n case 'var':\n return delegate.markEnd(parseVariableStatement(), startToken);\n case 'while':\n return delegate.markEnd(parseWhileStatement(), startToken);\n case 'with':\n return delegate.markEnd(parseWithStatement(), startToken);\n default:\n break;\n }\n }\n\n expr = parseExpression();\n\n // 12.12 Labelled Statements\n if ((expr.type === Syntax.Identifier) && match(':')) {\n lex();\n\n key = '$' + expr.name;\n if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.Redeclaration, 'Label', expr.name);\n }\n\n state.labelSet[key] = true;\n labeledBody = parseStatement();\n delete state.labelSet[key];\n return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken);\n }\n\n consumeSemicolon();\n\n return delegate.markEnd(delegate.createExpressionStatement(expr), startToken);\n }\n\n // 13 Function Definition\n\n function parseFunctionSourceElements() {\n var sourceElement, sourceElements = [], token, directive, firstRestricted,\n oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken;\n\n startToken = lookahead;\n expect('{');\n\n while (index < length) {\n if (lookahead.type !== Token.StringLiteral) {\n break;\n }\n token = lookahead;\n\n sourceElement = parseSourceElement();\n sourceElements.push(sourceElement);\n if (sourceElement.expression.type !== Syntax.Literal) {\n // this is not directive\n break;\n }\n directive = source.slice(token.start + 1, token.end - 1);\n if (directive === 'use strict') {\n strict = true;\n if (firstRestricted) {\n throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n }\n } else {\n if (!firstRestricted && token.octal) {\n firstRestricted = token;\n }\n }\n }\n\n oldLabelSet = state.labelSet;\n oldInIteration = state.inIteration;\n oldInSwitch = state.inSwitch;\n oldInFunctionBody = state.inFunctionBody;\n\n state.labelSet = {};\n state.inIteration = false;\n state.inSwitch = false;\n state.inFunctionBody = true;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n sourceElement = parseSourceElement();\n if (typeof sourceElement === 'undefined') {\n break;\n }\n sourceElements.push(sourceElement);\n }\n\n expect('}');\n\n state.labelSet = oldLabelSet;\n state.inIteration = oldInIteration;\n state.inSwitch = oldInSwitch;\n state.inFunctionBody = oldInFunctionBody;\n\n return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken);\n }\n\n function parseParams(firstRestricted) {\n var param, params = [], token, stricted, paramSet, key, message;\n expect('(');\n\n if (!match(')')) {\n paramSet = {};\n while (index < length) {\n token = lookahead;\n param = parseVariableIdentifier();\n key = '$' + token.value;\n if (strict) {\n if (isRestrictedWord(token.value)) {\n stricted = token;\n message = Messages.StrictParamName;\n }\n if (Object.prototype.hasOwnProperty.call(paramSet, key)) {\n stricted = token;\n message = Messages.StrictParamDupe;\n }\n } else if (!firstRestricted) {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictParamName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) {\n firstRestricted = token;\n message = Messages.StrictParamDupe;\n }\n }\n params.push(param);\n paramSet[key] = true;\n if (match(')')) {\n break;\n }\n expect(',');\n }\n }\n\n expect(')');\n\n return {\n params: params,\n stricted: stricted,\n firstRestricted: firstRestricted,\n message: message\n };\n }\n\n function parseFunctionDeclaration() {\n var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken;\n\n startToken = lookahead;\n\n expectKeyword('function');\n token = lookahead;\n id = parseVariableIdentifier();\n if (strict) {\n if (isRestrictedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictFunctionName);\n }\n } else {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictFunctionName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n }\n }\n\n tmp = parseParams(firstRestricted);\n params = tmp.params;\n stricted = tmp.stricted;\n firstRestricted = tmp.firstRestricted;\n if (tmp.message) {\n message = tmp.message;\n }\n\n previousStrict = strict;\n body = parseFunctionSourceElements();\n if (strict && firstRestricted) {\n throwError(firstRestricted, message);\n }\n if (strict && stricted) {\n throwErrorTolerant(stricted, message);\n }\n strict = previousStrict;\n\n return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken);\n }\n\n function parseFunctionExpression() {\n var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken;\n\n startToken = lookahead;\n expectKeyword('function');\n\n if (!match('(')) {\n token = lookahead;\n id = parseVariableIdentifier();\n if (strict) {\n if (isRestrictedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictFunctionName);\n }\n } else {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictFunctionName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n }\n }\n }\n\n tmp = parseParams(firstRestricted);\n params = tmp.params;\n stricted = tmp.stricted;\n firstRestricted = tmp.firstRestricted;\n if (tmp.message) {\n message = tmp.message;\n }\n\n previousStrict = strict;\n body = parseFunctionSourceElements();\n if (strict && firstRestricted) {\n throwError(firstRestricted, message);\n }\n if (strict && stricted) {\n throwErrorTolerant(stricted, message);\n }\n strict = previousStrict;\n\n return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken);\n }\n\n // 14 Program\n\n function parseSourceElement() {\n if (lookahead.type === Token.Keyword) {\n switch (lookahead.value) {\n case 'const':\n case 'let':\n return parseConstLetDeclaration(lookahead.value);\n case 'function':\n return parseFunctionDeclaration();\n default:\n return parseStatement();\n }\n }\n\n if (lookahead.type !== Token.EOF) {\n return parseStatement();\n }\n }\n\n function parseSourceElements() {\n var sourceElement, sourceElements = [], token, directive, firstRestricted;\n\n while (index < length) {\n token = lookahead;\n if (token.type !== Token.StringLiteral) {\n break;\n }\n\n sourceElement = parseSourceElement();\n sourceElements.push(sourceElement);\n if (sourceElement.expression.type !== Syntax.Literal) {\n // this is not directive\n break;\n }\n directive = source.slice(token.start + 1, token.end - 1);\n if (directive === 'use strict') {\n strict = true;\n if (firstRestricted) {\n throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n }\n } else {\n if (!firstRestricted && token.octal) {\n firstRestricted = token;\n }\n }\n }\n\n while (index < length) {\n sourceElement = parseSourceElement();\n /* istanbul ignore if */\n if (typeof sourceElement === 'undefined') {\n break;\n }\n sourceElements.push(sourceElement);\n }\n return sourceElements;\n }\n\n function parseProgram() {\n var body, startToken;\n\n skipComment();\n peek();\n startToken = lookahead;\n strict = false;\n\n body = parseSourceElements();\n return delegate.markEnd(delegate.createProgram(body), startToken);\n }\n\n function filterTokenLocation() {\n var i, entry, token, tokens = [];\n\n for (i = 0; i < extra.tokens.length; ++i) {\n entry = extra.tokens[i];\n token = {\n type: entry.type,\n value: entry.value\n };\n if (extra.range) {\n token.range = entry.range;\n }\n if (extra.loc) {\n token.loc = entry.loc;\n }\n tokens.push(token);\n }\n\n extra.tokens = tokens;\n }\n\n function tokenize(code, options) {\n var toString,\n token,\n tokens;\n\n toString = String;\n if (typeof code !== 'string' && !(code instanceof String)) {\n code = toString(code);\n }\n\n delegate = SyntaxTreeDelegate;\n source = code;\n index = 0;\n lineNumber = (source.length > 0) ? 1 : 0;\n lineStart = 0;\n length = source.length;\n lookahead = null;\n state = {\n allowIn: true,\n labelSet: {},\n inFunctionBody: false,\n inIteration: false,\n inSwitch: false,\n lastCommentStart: -1\n };\n\n extra = {};\n\n // Options matching.\n options = options || {};\n\n // Of course we collect tokens here.\n options.tokens = true;\n extra.tokens = [];\n extra.tokenize = true;\n // The following two fields are necessary to compute the Regex tokens.\n extra.openParenToken = -1;\n extra.openCurlyToken = -1;\n\n extra.range = (typeof options.range === 'boolean') && options.range;\n extra.loc = (typeof options.loc === 'boolean') && options.loc;\n\n if (typeof options.comment === 'boolean' && options.comment) {\n extra.comments = [];\n }\n if (typeof options.tolerant === 'boolean' && options.tolerant) {\n extra.errors = [];\n }\n\n try {\n peek();\n if (lookahead.type === Token.EOF) {\n return extra.tokens;\n }\n\n token = lex();\n while (lookahead.type !== Token.EOF) {\n try {\n token = lex();\n } catch (lexError) {\n token = lookahead;\n if (extra.errors) {\n extra.errors.push(lexError);\n // We have to break on the first error\n // to avoid infinite loops.\n break;\n } else {\n throw lexError;\n }\n }\n }\n\n filterTokenLocation();\n tokens = extra.tokens;\n if (typeof extra.comments !== 'undefined') {\n tokens.comments = extra.comments;\n }\n if (typeof extra.errors !== 'undefined') {\n tokens.errors = extra.errors;\n }\n } catch (e) {\n throw e;\n } finally {\n extra = {};\n }\n return tokens;\n }\n\n function parse(code, options) {\n var program, toString;\n\n toString = String;\n if (typeof code !== 'string' && !(code instanceof String)) {\n code = toString(code);\n }\n\n delegate = SyntaxTreeDelegate;\n source = code;\n index = 0;\n lineNumber = (source.length > 0) ? 1 : 0;\n lineStart = 0;\n length = source.length;\n lookahead = null;\n state = {\n allowIn: true,\n labelSet: {},\n inFunctionBody: false,\n inIteration: false,\n inSwitch: false,\n lastCommentStart: -1\n };\n\n extra = {};\n if (typeof options !== 'undefined') {\n extra.range = (typeof options.range === 'boolean') && options.range;\n extra.loc = (typeof options.loc === 'boolean') && options.loc;\n extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;\n\n if (extra.loc && options.source !== null && options.source !== undefined) {\n extra.source = toString(options.source);\n }\n\n if (typeof options.tokens === 'boolean' && options.tokens) {\n extra.tokens = [];\n }\n if (typeof options.comment === 'boolean' && options.comment) {\n extra.comments = [];\n }\n if (typeof options.tolerant === 'boolean' && options.tolerant) {\n extra.errors = [];\n }\n if (extra.attachComment) {\n extra.range = true;\n extra.comments = [];\n extra.bottomRightStack = [];\n extra.trailingComments = [];\n extra.leadingComments = [];\n }\n }\n\n try {\n program = parseProgram();\n if (typeof extra.comments !== 'undefined') {\n program.comments = extra.comments;\n }\n if (typeof extra.tokens !== 'undefined') {\n filterTokenLocation();\n program.tokens = extra.tokens;\n }\n if (typeof extra.errors !== 'undefined') {\n program.errors = extra.errors;\n }\n } catch (e) {\n throw e;\n } finally {\n extra = {};\n }\n\n return program;\n }\n\n // Sync with *.json manifests.\n exports.version = '1.2.2';\n\n exports.tokenize = tokenize;\n\n exports.parse = parse;\n\n // Deep copy.\n /* istanbul ignore next */\n exports.Syntax = (function () {\n var name, types = {};\n\n if (typeof Object.create === 'function') {\n types = Object.create(null);\n }\n\n for (name in Syntax) {\n if (Syntax.hasOwnProperty(name)) {\n types[name] = Syntax[name];\n }\n }\n\n if (typeof Object.freeze === 'function') {\n Object.freeze(types);\n }\n\n return types;\n }());\n\n}));\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n},{}],1:[function(require,module,exports){\n(function (process){\n/* parser generated by jison 0.4.13 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"JSON_PATH\":3,\"DOLLAR\":4,\"PATH_COMPONENTS\":5,\"LEADING_CHILD_MEMBER_EXPRESSION\":6,\"PATH_COMPONENT\":7,\"MEMBER_COMPONENT\":8,\"SUBSCRIPT_COMPONENT\":9,\"CHILD_MEMBER_COMPONENT\":10,\"DESCENDANT_MEMBER_COMPONENT\":11,\"DOT\":12,\"MEMBER_EXPRESSION\":13,\"DOT_DOT\":14,\"STAR\":15,\"IDENTIFIER\":16,\"SCRIPT_EXPRESSION\":17,\"INTEGER\":18,\"END\":19,\"CHILD_SUBSCRIPT_COMPONENT\":20,\"DESCENDANT_SUBSCRIPT_COMPONENT\":21,\"[\":22,\"SUBSCRIPT\":23,\"]\":24,\"SUBSCRIPT_EXPRESSION\":25,\"SUBSCRIPT_EXPRESSION_LIST\":26,\"SUBSCRIPT_EXPRESSION_LISTABLE\":27,\",\":28,\"STRING_LITERAL\":29,\"ARRAY_SLICE\":30,\"FILTER_EXPRESSION\":31,\"QQ_STRING\":32,\"Q_STRING\":33,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"DOLLAR\",12:\"DOT\",14:\"DOT_DOT\",15:\"STAR\",16:\"IDENTIFIER\",17:\"SCRIPT_EXPRESSION\",18:\"INTEGER\",19:\"END\",22:\"[\",24:\"]\",28:\",\",30:\"ARRAY_SLICE\",31:\"FILTER_EXPRESSION\",32:\"QQ_STRING\",33:\"Q_STRING\"},\nproductions_: [0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */\n/**/) {\n/* this == yyval */\nif (!yy.ast) {\n yy.ast = _ast;\n _ast.initialize();\n}\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:yy.ast.set({ expression: { type: \"root\", value: $$[$0] } }); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 2:yy.ast.set({ expression: { type: \"root\", value: $$[$0-1] } }); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 3:yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 4:yy.ast.set({ operation: \"member\", scope: \"child\", expression: { type: \"identifier\", value: $$[$0-1] }}); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 5:\nbreak;\ncase 6:\nbreak;\ncase 7:yy.ast.set({ operation: \"member\" }); yy.ast.push()\nbreak;\ncase 8:yy.ast.set({ operation: \"subscript\" }); yy.ast.push() \nbreak;\ncase 9:yy.ast.set({ scope: \"child\" })\nbreak;\ncase 10:yy.ast.set({ scope: \"descendant\" })\nbreak;\ncase 11:\nbreak;\ncase 12:yy.ast.set({ scope: \"child\", operation: \"member\" })\nbreak;\ncase 13:\nbreak;\ncase 14:yy.ast.set({ expression: { type: \"wildcard\", value: $$[$0] } })\nbreak;\ncase 15:yy.ast.set({ expression: { type: \"identifier\", value: $$[$0] } })\nbreak;\ncase 16:yy.ast.set({ expression: { type: \"script_expression\", value: $$[$0] } })\nbreak;\ncase 17:yy.ast.set({ expression: { type: \"numeric_literal\", value: parseInt($$[$0]) } })\nbreak;\ncase 18:\nbreak;\ncase 19:yy.ast.set({ scope: \"child\" })\nbreak;\ncase 20:yy.ast.set({ scope: \"descendant\" })\nbreak;\ncase 21:\nbreak;\ncase 22:\nbreak;\ncase 23:\nbreak;\ncase 24:$$[$0].length > 1? yy.ast.set({ expression: { type: \"union\", value: $$[$0] } }) : this.$ = $$[$0]\nbreak;\ncase 25:this.$ = [$$[$0]]\nbreak;\ncase 26:this.$ = $$[$0-2].concat($$[$0])\nbreak;\ncase 27:this.$ = { expression: { type: \"numeric_literal\", value: parseInt($$[$0]) } }; yy.ast.set(this.$)\nbreak;\ncase 28:this.$ = { expression: { type: \"string_literal\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 29:this.$ = { expression: { type: \"slice\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 30:this.$ = { expression: { type: \"wildcard\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 31:this.$ = { expression: { type: \"script_expression\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 32:this.$ = { expression: { type: \"filter_expression\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 33:this.$ = $$[$0]\nbreak;\ncase 34:this.$ = $$[$0]\nbreak;\n}\n},\ntable: [{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],\ndefaultActions: {27:[2,23],29:[2,30],30:[2,31],31:[2,32]},\nparseError: function parseError(str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == 'undefined') {\n this.lexer.yylloc = {};\n }\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === 'function') {\n this.parseError = this.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = self.lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (this.lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + this.lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: this.lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: this.lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n this.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\nvar _ast = {\n\n initialize: function() {\n this._nodes = [];\n this._node = {};\n this._stash = [];\n },\n\n set: function(props) {\n for (var k in props) this._node[k] = props[k];\n return this._node;\n },\n\n node: function(obj) {\n if (arguments.length) this._node = obj;\n return this._node;\n },\n\n push: function() {\n this._nodes.push(this._node);\n this._node = {};\n },\n\n unshift: function() {\n this._nodes.unshift(this._node);\n this._node = {};\n },\n\n yield: function() {\n var _nodes = this._nodes;\n this.initialize();\n return _nodes;\n }\n};\n/* generated by jison-lex 0.2.1 */\nvar lexer = (function(){\nvar lexer = {\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input) {\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function (match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin(condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState() {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules() {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState(n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState(condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START\n/**/) {\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 4\nbreak;\ncase 1:return 14\nbreak;\ncase 2:return 12\nbreak;\ncase 3:return 15\nbreak;\ncase 4:return 16\nbreak;\ncase 5:return 22\nbreak;\ncase 6:return 24\nbreak;\ncase 7:return 28\nbreak;\ncase 8:return 30\nbreak;\ncase 9:return 18\nbreak;\ncase 10:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 32;\nbreak;\ncase 11:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 33;\nbreak;\ncase 12:return 17\nbreak;\ncase 13:return 31\nbreak;\n}\n},\nrules: [/^(?:\\$)/,/^(?:\\.\\.)/,/^(?:\\.)/,/^(?:\\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\\[)/,/^(?:\\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\\:((-?(?:0|[1-9][0-9]*)))?(\\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:\"(?:\\\\[\"bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\")/,/^(?:'(?:\\\\['bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^'\\\\])*')/,/^(?:\\(.+?\\)(?=\\]))/,/^(?:\\?\\(.+?\\)(?=\\]))/],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}}\n};\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain(args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}\n\n}).call(this,require('_process'))\n},{\"_process\":14,\"fs\":12,\"path\":13}],2:[function(require,module,exports){\nmodule.exports = {\n identifier: \"[a-zA-Z_]+[a-zA-Z0-9_]*\",\n integer: \"-?(?:0|[1-9][0-9]*)\",\n qq_string: \"\\\"(?:\\\\\\\\[\\\"bfnrt/\\\\\\\\]|\\\\\\\\u[a-fA-F0-9]{4}|[^\\\"\\\\\\\\])*\\\"\",\n q_string: \"'(?:\\\\\\\\[\\'bfnrt/\\\\\\\\]|\\\\\\\\u[a-fA-F0-9]{4}|[^\\'\\\\\\\\])*'\"\n};\n\n},{}],3:[function(require,module,exports){\nvar dict = require('./dict');\nvar fs = require('fs');\nvar grammar = {\n\n lex: {\n\n macros: {\n esc: \"\\\\\\\\\",\n int: dict.integer\n },\n\n rules: [\n [\"\\\\$\", \"return 'DOLLAR'\"],\n [\"\\\\.\\\\.\", \"return 'DOT_DOT'\"],\n [\"\\\\.\", \"return 'DOT'\"],\n [\"\\\\*\", \"return 'STAR'\"],\n [dict.identifier, \"return 'IDENTIFIER'\"],\n [\"\\\\[\", \"return '['\"],\n [\"\\\\]\", \"return ']'\"],\n [\",\", \"return ','\"],\n [\"({int})?\\\\:({int})?(\\\\:({int})?)?\", \"return 'ARRAY_SLICE'\"],\n [\"{int}\", \"return 'INTEGER'\"],\n [dict.qq_string, \"yytext = yytext.substr(1,yyleng-2); return 'QQ_STRING';\"],\n [dict.q_string, \"yytext = yytext.substr(1,yyleng-2); return 'Q_STRING';\"],\n [\"\\\\(.+?\\\\)(?=\\\\])\", \"return 'SCRIPT_EXPRESSION'\"],\n [\"\\\\?\\\\(.+?\\\\)(?=\\\\])\", \"return 'FILTER_EXPRESSION'\"]\n ]\n },\n\n start: \"JSON_PATH\",\n\n bnf: {\n\n JSON_PATH: [\n [ 'DOLLAR', 'yy.ast.set({ expression: { type: \"root\", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'DOLLAR PATH_COMPONENTS', 'yy.ast.set({ expression: { type: \"root\", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'LEADING_CHILD_MEMBER_EXPRESSION', 'yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'LEADING_CHILD_MEMBER_EXPRESSION PATH_COMPONENTS', 'yy.ast.set({ operation: \"member\", scope: \"child\", expression: { type: \"identifier\", value: $1 }}); yy.ast.unshift(); return yy.ast.yield()' ] ],\n\n PATH_COMPONENTS: [\n [ 'PATH_COMPONENT', '' ],\n [ 'PATH_COMPONENTS PATH_COMPONENT', '' ] ],\n\n PATH_COMPONENT: [\n [ 'MEMBER_COMPONENT', 'yy.ast.set({ operation: \"member\" }); yy.ast.push()' ],\n [ 'SUBSCRIPT_COMPONENT', 'yy.ast.set({ operation: \"subscript\" }); yy.ast.push() ' ] ],\n\n MEMBER_COMPONENT: [\n [ 'CHILD_MEMBER_COMPONENT', 'yy.ast.set({ scope: \"child\" })' ],\n [ 'DESCENDANT_MEMBER_COMPONENT', 'yy.ast.set({ scope: \"descendant\" })' ] ],\n\n CHILD_MEMBER_COMPONENT: [\n [ 'DOT MEMBER_EXPRESSION', '' ] ],\n\n LEADING_CHILD_MEMBER_EXPRESSION: [\n [ 'MEMBER_EXPRESSION', 'yy.ast.set({ scope: \"child\", operation: \"member\" })' ] ],\n\n DESCENDANT_MEMBER_COMPONENT: [\n [ 'DOT_DOT MEMBER_EXPRESSION', '' ] ],\n\n MEMBER_EXPRESSION: [\n [ 'STAR', 'yy.ast.set({ expression: { type: \"wildcard\", value: $1 } })' ],\n [ 'IDENTIFIER', 'yy.ast.set({ expression: { type: \"identifier\", value: $1 } })' ],\n [ 'SCRIPT_EXPRESSION', 'yy.ast.set({ expression: { type: \"script_expression\", value: $1 } })' ],\n [ 'INTEGER', 'yy.ast.set({ expression: { type: \"numeric_literal\", value: parseInt($1) } })' ],\n [ 'END', '' ] ],\n\n SUBSCRIPT_COMPONENT: [\n [ 'CHILD_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: \"child\" })' ],\n [ 'DESCENDANT_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: \"descendant\" })' ] ],\n\n CHILD_SUBSCRIPT_COMPONENT: [\n [ '[ SUBSCRIPT ]', '' ] ],\n\n DESCENDANT_SUBSCRIPT_COMPONENT: [\n [ 'DOT_DOT [ SUBSCRIPT ]', '' ] ],\n\n SUBSCRIPT: [\n [ 'SUBSCRIPT_EXPRESSION', '' ],\n [ 'SUBSCRIPT_EXPRESSION_LIST', '$1.length > 1? yy.ast.set({ expression: { type: \"union\", value: $1 } }) : $$ = $1' ] ],\n\n SUBSCRIPT_EXPRESSION_LIST: [\n [ 'SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = [$1]'],\n [ 'SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = $1.concat($3)' ] ],\n\n SUBSCRIPT_EXPRESSION_LISTABLE: [\n [ 'INTEGER', '$$ = { expression: { type: \"numeric_literal\", value: parseInt($1) } }; yy.ast.set($$)' ],\n [ 'STRING_LITERAL', '$$ = { expression: { type: \"string_literal\", value: $1 } }; yy.ast.set($$)' ],\n [ 'ARRAY_SLICE', '$$ = { expression: { type: \"slice\", value: $1 } }; yy.ast.set($$)' ] ],\n\n SUBSCRIPT_EXPRESSION: [\n [ 'STAR', '$$ = { expression: { type: \"wildcard\", value: $1 } }; yy.ast.set($$)' ],\n [ 'SCRIPT_EXPRESSION', '$$ = { expression: { type: \"script_expression\", value: $1 } }; yy.ast.set($$)' ],\n [ 'FILTER_EXPRESSION', '$$ = { expression: { type: \"filter_expression\", value: $1 } }; yy.ast.set($$)' ] ],\n\n STRING_LITERAL: [\n [ 'QQ_STRING', \"$$ = $1\" ],\n [ 'Q_STRING', \"$$ = $1\" ] ]\n }\n};\nif (fs.readFileSync) {\n grammar.moduleInclude = fs.readFileSync(require.resolve(\"../include/module.js\"));\n grammar.actionInclude = fs.readFileSync(require.resolve(\"../include/action.js\"));\n}\n\nmodule.exports = grammar;\n\n},{\"./dict\":2,\"fs\":12}],4:[function(require,module,exports){\nvar aesprim = require('./aesprim');\nvar slice = require('./slice');\nvar _evaluate = require('static-eval');\nvar _uniq = require('underscore').uniq;\n\nvar Handlers = function() {\n return this.initialize.apply(this, arguments);\n}\n\nHandlers.prototype.initialize = function() {\n this.traverse = traverser(true);\n this.descend = traverser();\n}\n\nHandlers.prototype.keys = Object.keys;\n\nHandlers.prototype.resolve = function(component) {\n\n var key = [ component.operation, component.scope, component.expression.type ].join('-');\n var method = this._fns[key];\n\n if (!method) throw new Error(\"couldn't resolve key: \" + key);\n return method.bind(this);\n};\n\nHandlers.prototype.register = function(key, handler) {\n\n if (!handler instanceof Function) {\n throw new Error(\"handler must be a function\");\n }\n\n this._fns[key] = handler;\n};\n\nHandlers.prototype._fns = {\n\n 'member-child-identifier': function(component, partial) {\n var key = component.expression.value;\n var value = partial.value;\n if (value instanceof Object && key in value) {\n return [ { value: value[key], path: partial.path.concat(key) } ]\n }\n },\n\n 'member-descendant-identifier':\n _traverse(function(key, value, ref) { return key == ref }),\n\n 'subscript-child-numeric_literal':\n _descend(function(key, value, ref) { return key === ref }),\n\n 'member-child-numeric_literal':\n _descend(function(key, value, ref) { return String(key) === String(ref) }),\n\n 'subscript-descendant-numeric_literal':\n _traverse(function(key, value, ref) { return key === ref }),\n\n 'member-child-wildcard':\n _descend(function() { return true }),\n\n 'member-descendant-wildcard':\n _traverse(function() { return true }),\n\n 'subscript-descendant-wildcard':\n _traverse(function() { return true }),\n\n 'subscript-child-wildcard':\n _descend(function() { return true }),\n\n 'subscript-child-slice': function(component, partial) {\n if (is_array(partial.value)) {\n var args = component.expression.value.split(':').map(_parse_nullable_int);\n var values = partial.value.map(function(v, i) { return { value: v, path: partial.path.concat(i) } });\n return slice.apply(null, [values].concat(args));\n }\n },\n\n 'subscript-child-union': function(component, partial) {\n var results = [];\n component.expression.value.forEach(function(component) {\n var _component = { operation: 'subscript', scope: 'child', expression: component.expression };\n var handler = this.resolve(_component);\n var _results = handler(_component, partial);\n if (_results) {\n results = results.concat(_results);\n }\n }, this);\n\n return unique(results);\n },\n\n 'subscript-descendant-union': function(component, partial, count) {\n\n var jp = require('..');\n var self = this;\n\n var results = [];\n var nodes = jp.nodes(partial, '$..*').slice(1);\n\n nodes.forEach(function(node) {\n if (results.length >= count) return;\n component.expression.value.forEach(function(component) {\n var _component = { operation: 'subscript', scope: 'child', expression: component.expression };\n var handler = self.resolve(_component);\n var _results = handler(_component, node);\n results = results.concat(_results);\n });\n });\n\n return unique(results);\n },\n\n 'subscript-child-filter_expression': function(component, partial, count) {\n\n // slice out the expression from ?(expression)\n var src = component.expression.value.slice(2, -1);\n var ast = aesprim.parse(src).body[0].expression;\n\n var passable = function(key, value) {\n return evaluate(ast, { '@': value });\n }\n\n return this.descend(partial, null, passable, count);\n\n },\n\n 'subscript-descendant-filter_expression': function(component, partial, count) {\n\n // slice out the expression from ?(expression)\n var src = component.expression.value.slice(2, -1);\n var ast = aesprim.parse(src).body[0].expression;\n\n var passable = function(key, value) {\n return evaluate(ast, { '@': value });\n }\n\n return this.traverse(partial, null, passable, count);\n },\n\n 'subscript-child-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$[{{value}}]');\n },\n\n 'member-child-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$.{{value}}');\n },\n\n 'member-descendant-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$..value');\n }\n};\n\nHandlers.prototype._fns['subscript-child-string_literal'] =\n\tHandlers.prototype._fns['member-child-identifier'];\n\nHandlers.prototype._fns['member-descendant-numeric_literal'] =\n Handlers.prototype._fns['subscript-descendant-string_literal'] =\n Handlers.prototype._fns['member-descendant-identifier'];\n\nfunction eval_recurse(partial, src, template) {\n\n var jp = require('./index');\n var ast = aesprim.parse(src).body[0].expression;\n var value = evaluate(ast, { '@': partial.value });\n var path = template.replace(/\\{\\{\\s*value\\s*\\}\\}/g, value);\n\n var results = jp.nodes(partial.value, path);\n results.forEach(function(r) {\n r.path = partial.path.concat(r.path.slice(1));\n });\n\n return results;\n}\n\nfunction is_array(val) {\n return Array.isArray(val);\n}\n\nfunction is_object(val) {\n // is this a non-array, non-null object?\n return val && !(val instanceof Array) && val instanceof Object;\n}\n\nfunction traverser(recurse) {\n\n return function(partial, ref, passable, count) {\n\n var value = partial.value;\n var path = partial.path;\n\n var results = [];\n\n var descend = function(value, path) {\n\n if (is_array(value)) {\n value.forEach(function(element, index) {\n if (results.length >= count) { return }\n if (passable(index, element, ref)) {\n results.push({ path: path.concat(index), value: element });\n }\n });\n value.forEach(function(element, index) {\n if (results.length >= count) { return }\n if (recurse) {\n descend(element, path.concat(index));\n }\n });\n } else if (is_object(value)) {\n this.keys(value).forEach(function(k) {\n if (results.length >= count) { return }\n if (passable(k, value[k], ref)) {\n results.push({ path: path.concat(k), value: value[k] });\n }\n })\n this.keys(value).forEach(function(k) {\n if (results.length >= count) { return }\n if (recurse) {\n descend(value[k], path.concat(k));\n }\n });\n }\n }.bind(this);\n descend(value, path);\n return results;\n }\n}\n\nfunction _descend(passable) {\n return function(component, partial, count) {\n return this.descend(partial, component.expression.value, passable, count);\n }\n}\n\nfunction _traverse(passable) {\n return function(component, partial, count) {\n return this.traverse(partial, component.expression.value, passable, count);\n }\n}\n\nfunction evaluate() {\n try { return _evaluate.apply(this, arguments) }\n catch (e) { }\n}\n\nfunction unique(results) {\n results = results.filter(function(d) { return d })\n return _uniq(\n results,\n function(r) { return r.path.map(function(c) { return String(c).replace('-', '--') }).join('-') }\n );\n}\n\nfunction _parse_nullable_int(val) {\n var sval = String(val);\n return sval.match(/^-?[0-9]+$/) ? parseInt(sval) : null;\n}\n\nmodule.exports = Handlers;\n\n},{\"..\":\"jsonpath\",\"./aesprim\":\"./aesprim\",\"./index\":5,\"./slice\":7,\"static-eval\":15,\"underscore\":12}],5:[function(require,module,exports){\nvar assert = require('assert');\nvar dict = require('./dict');\nvar Parser = require('./parser');\nvar Handlers = require('./handlers');\n\nvar JSONPath = function() {\n this.initialize.apply(this, arguments);\n};\n\nJSONPath.prototype.initialize = function() {\n this.parser = new Parser();\n this.handlers = new Handlers();\n};\n\nJSONPath.prototype.parse = function(string) {\n assert.ok(_is_string(string), \"we need a path\");\n return this.parser.parse(string);\n};\n\nJSONPath.prototype.parent = function(obj, string) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var node = this.nodes(obj, string)[0];\n var key = node.path.pop(); /* jshint unused:false */\n return this.value(obj, node.path);\n}\n\nJSONPath.prototype.apply = function(obj, string, fn) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n assert.equal(typeof fn, \"function\", \"fn needs to be function\")\n\n var nodes = this.nodes(obj, string).sort(function(a, b) {\n // sort nodes so we apply from the bottom up\n return b.path.length - a.path.length;\n });\n\n nodes.forEach(function(node) {\n var key = node.path.pop();\n var parent = this.value(obj, this.stringify(node.path));\n var val = node.value = fn.call(obj, parent[key]);\n parent[key] = val;\n }, this);\n\n return nodes;\n}\n\nJSONPath.prototype.value = function(obj, path, value) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(path, \"we need a path\");\n\n if (arguments.length >= 3) {\n var node = this.nodes(obj, path).shift();\n if (!node) return this._vivify(obj, path, value);\n var key = node.path.slice(-1).shift();\n var parent = this.parent(obj, this.stringify(node.path));\n parent[key] = value;\n }\n return this.query(obj, this.stringify(path), 1).shift();\n}\n\nJSONPath.prototype._vivify = function(obj, string, value) {\n\n var self = this;\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var path = this.parser.parse(string)\n .map(function(component) { return component.expression.value });\n\n var setValue = function(path, value) {\n var key = path.pop();\n var node = self.value(obj, path);\n if (!node) {\n setValue(path.concat(), typeof key === 'string' ? {} : []);\n node = self.value(obj, path);\n }\n node[key] = value;\n }\n setValue(path, value);\n return this.query(obj, string)[0];\n}\n\nJSONPath.prototype.query = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(_is_string(string), \"we need a path\");\n\n var results = this.nodes(obj, string, count)\n .map(function(r) { return r.value });\n\n return results;\n};\n\nJSONPath.prototype.paths = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var results = this.nodes(obj, string, count)\n .map(function(r) { return r.path });\n\n return results;\n};\n\nJSONPath.prototype.nodes = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n if (count === 0) return [];\n\n var path = this.parser.parse(string);\n var handlers = this.handlers;\n\n var partials = [ { path: ['$'], value: obj } ];\n var matches = [];\n\n if (path.length && path[0].expression.type == 'root') path.shift();\n\n if (!path.length) return partials;\n\n path.forEach(function(component, index) {\n\n if (matches.length >= count) return;\n var handler = handlers.resolve(component);\n var _partials = [];\n\n partials.forEach(function(p) {\n\n if (matches.length >= count) return;\n var results = handler(component, p, count);\n\n if (index == path.length - 1) {\n // if we're through the components we're done\n matches = matches.concat(results || []);\n } else {\n // otherwise accumulate and carry on through\n _partials = _partials.concat(results || []);\n }\n });\n\n partials = _partials;\n\n });\n\n return count ? matches.slice(0, count) : matches;\n};\n\nJSONPath.prototype.stringify = function(path) {\n\n assert.ok(path, \"we need a path\");\n\n var string = '$';\n\n var templates = {\n 'descendant-member': '..{{value}}',\n 'child-member': '.{{value}}',\n 'descendant-subscript': '..[{{value}}]',\n 'child-subscript': '[{{value}}]'\n };\n\n path = this._normalize(path);\n\n path.forEach(function(component) {\n\n if (component.expression.type == 'root') return;\n\n var key = [component.scope, component.operation].join('-');\n var template = templates[key];\n var value;\n\n if (component.expression.type == 'string_literal') {\n value = JSON.stringify(component.expression.value)\n } else {\n value = component.expression.value;\n }\n\n if (!template) throw new Error(\"couldn't find template \" + key);\n\n string += template.replace(/{{value}}/, value);\n });\n\n return string;\n}\n\nJSONPath.prototype._normalize = function(path) {\n\n assert.ok(path, \"we need a path\");\n\n if (typeof path == \"string\") {\n\n return this.parser.parse(path);\n\n } else if (Array.isArray(path) && typeof path[0] == \"string\") {\n\n var _path = [ { expression: { type: \"root\", value: \"$\" } } ];\n\n path.forEach(function(component, index) {\n\n if (component == '$' && index === 0) return;\n\n if (typeof component == \"string\" && component.match(\"^\" + dict.identifier + \"$\")) {\n\n _path.push({\n operation: 'member',\n scope: 'child',\n expression: { value: component, type: 'identifier' }\n });\n\n } else {\n\n var type = typeof component == \"number\" ?\n 'numeric_literal' : 'string_literal';\n\n _path.push({\n operation: 'subscript',\n scope: 'child',\n expression: { value: component, type: type }\n });\n }\n });\n\n return _path;\n\n } else if (Array.isArray(path) && typeof path[0] == \"object\") {\n\n return path\n }\n\n throw new Error(\"couldn't understand path \" + path);\n}\n\nfunction _is_string(obj) {\n return Object.prototype.toString.call(obj) == '[object String]';\n}\n\nJSONPath.Handlers = Handlers;\nJSONPath.Parser = Parser;\n\nvar instance = new JSONPath;\ninstance.JSONPath = JSONPath;\n\nmodule.exports = instance;\n\n},{\"./dict\":2,\"./handlers\":4,\"./parser\":6,\"assert\":8}],6:[function(require,module,exports){\nvar grammar = require('./grammar');\nvar gparser = require('../generated/parser');\n\nvar Parser = function() {\n\n var parser = new gparser.Parser();\n\n var _parseError = parser.parseError;\n parser.yy.parseError = function() {\n if (parser.yy.ast) {\n parser.yy.ast.initialize();\n }\n _parseError.apply(parser, arguments);\n }\n\n return parser;\n\n};\n\nParser.grammar = grammar;\nmodule.exports = Parser;\n\n},{\"../generated/parser\":1,\"./grammar\":3}],7:[function(require,module,exports){\nmodule.exports = function(arr, start, end, step) {\n\n if (typeof start == 'string') throw new Error(\"start cannot be a string\");\n if (typeof end == 'string') throw new Error(\"end cannot be a string\");\n if (typeof step == 'string') throw new Error(\"step cannot be a string\");\n\n var len = arr.length;\n\n if (step === 0) throw new Error(\"step cannot be zero\");\n step = step ? integer(step) : 1;\n\n // normalize negative values\n start = start < 0 ? len + start : start;\n end = end < 0 ? len + end : end;\n\n // default extents to extents\n start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);\n end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);\n\n // clamp extents\n start = step > 0 ? Math.max(0, start) : Math.min(len, start);\n end = step > 0 ? Math.min(end, len) : Math.max(-1, end);\n\n // return empty if extents are backwards\n if (step > 0 && end <= start) return [];\n if (step < 0 && start <= end) return [];\n\n var result = [];\n\n for (var i = start; i != end; i += step) {\n if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;\n result.push(arr[i]);\n }\n\n return result;\n}\n\nfunction integer(val) {\n return String(val).match(/^[0-9]+$/) ? parseInt(val) :\n Number.isFinite(val) ? parseInt(val, 10) : 0;\n}\n\n},{}],8:[function(require,module,exports){\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// when used in node, this will actually load the util module we depend on\n// versus loading the builtin util module as happens otherwise\n// this is a bug in node module loading as far as I am concerned\nvar util = require('util/');\n\nvar pSlice = Array.prototype.slice;\nvar hasOwn = Object.prototype.hasOwnProperty;\n\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n// actual: actual,\n// expected: expected })\n\nassert.AssertionError = function AssertionError(options) {\n this.name = 'AssertionError';\n this.actual = options.actual;\n this.expected = options.expected;\n this.operator = options.operator;\n if (options.message) {\n this.message = options.message;\n this.generatedMessage = false;\n } else {\n this.message = getMessage(this);\n this.generatedMessage = true;\n }\n var stackStartFunction = options.stackStartFunction || fail;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, stackStartFunction);\n }\n else {\n // non v8 browsers so we can have a stacktrace\n var err = new Error();\n if (err.stack) {\n var out = err.stack;\n\n // try to strip useless frames\n var fn_name = stackStartFunction.name;\n var idx = out.indexOf('\\n' + fn_name);\n if (idx >= 0) {\n // once we have located the function frame\n // we need to strip out everything before it (and its line)\n var next_line = out.indexOf('\\n', idx + 1);\n out = out.substring(next_line + 1);\n }\n\n this.stack = out;\n }\n }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction replacer(key, value) {\n if (util.isUndefined(value)) {\n return '' + value;\n }\n if (util.isNumber(value) && !isFinite(value)) {\n return value.toString();\n }\n if (util.isFunction(value) || util.isRegExp(value)) {\n return value.toString();\n }\n return value;\n}\n\nfunction truncate(s, n) {\n if (util.isString(s)) {\n return s.length < n ? s : s.slice(0, n);\n } else {\n return s;\n }\n}\n\nfunction getMessage(self) {\n return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +\n self.operator + ' ' +\n truncate(JSON.stringify(self.expected, replacer), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n throw new assert.AssertionError({\n message: message,\n actual: actual,\n expected: expected,\n operator: operator,\n stackStartFunction: stackStartFunction\n });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n if (actual == expected) {\n fail(actual, expected, message, '!=', assert.notEqual);\n }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n if (!_deepEqual(actual, expected)) {\n fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n }\n};\n\nfunction _deepEqual(actual, expected) {\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (util.isBuffer(actual) && util.isBuffer(expected)) {\n if (actual.length != expected.length) return false;\n\n for (var i = 0; i < actual.length; i++) {\n if (actual[i] !== expected[i]) return false;\n }\n\n return true;\n\n // 7.2. If the expected value is a Date object, the actual value is\n // equivalent if it is also a Date object that refers to the same time.\n } else if (util.isDate(actual) && util.isDate(expected)) {\n return actual.getTime() === expected.getTime();\n\n // 7.3 If the expected value is a RegExp object, the actual value is\n // equivalent if it is also a RegExp object with the same source and\n // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n return actual.source === expected.source &&\n actual.global === expected.global &&\n actual.multiline === expected.multiline &&\n actual.lastIndex === expected.lastIndex &&\n actual.ignoreCase === expected.ignoreCase;\n\n // 7.4. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!util.isObject(actual) && !util.isObject(expected)) {\n return actual == expected;\n\n // 7.5 For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected);\n }\n}\n\nfunction isArguments(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b) {\n if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n // if one is a primitive, the other must be same\n if (util.isPrimitive(a) || util.isPrimitive(b)) {\n return a === b;\n }\n var aIsArgs = isArguments(a),\n bIsArgs = isArguments(b);\n if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n return false;\n if (aIsArgs) {\n a = pSlice.call(a);\n b = pSlice.call(b);\n return _deepEqual(a, b);\n }\n var ka = objectKeys(a),\n kb = objectKeys(b),\n key, i;\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!_deepEqual(a[key], b[key])) return false;\n }\n return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n if (_deepEqual(actual, expected)) {\n fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n }\n};\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n if (actual !== expected) {\n fail(actual, expected, message, '===', assert.strictEqual);\n }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==. assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n if (actual === expected) {\n fail(actual, expected, message, '!==', assert.notStrictEqual);\n }\n};\n\nfunction expectedException(actual, expected) {\n if (!actual || !expected) {\n return false;\n }\n\n if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n return expected.test(actual);\n } else if (actual instanceof expected) {\n return true;\n } else if (expected.call({}, actual) === true) {\n return true;\n }\n\n return false;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n var actual;\n\n if (util.isString(expected)) {\n message = expected;\n expected = null;\n }\n\n try {\n block();\n } catch (e) {\n actual = e;\n }\n\n message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n (message ? ' ' + message : '.');\n\n if (shouldThrow && !actual) {\n fail(actual, expected, 'Missing expected exception' + message);\n }\n\n if (!shouldThrow && expectedException(actual, expected)) {\n fail(actual, expected, 'Got unwanted exception' + message);\n }\n\n if ((shouldThrow && actual && expected &&\n !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n throw actual;\n }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n _throws.apply(this, [true].concat(pSlice.call(arguments)));\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/message) {\n _throws.apply(this, [false].concat(pSlice.call(arguments)));\n};\n\nassert.ifError = function(err) { if (err) {throw err;}};\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n if (hasOwn.call(obj, key)) keys.push(key);\n }\n return keys;\n};\n\n},{\"util/\":11}],9:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n},{}],10:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],11:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":10,\"_process\":14,\"inherits\":9}],12:[function(require,module,exports){\n\n},{}],13:[function(require,module,exports){\n(function (process){\n// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n if (typeof path !== 'string') path = path + '';\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) {\n // return '//';\n // Backwards-compat fix:\n return '/';\n }\n return path.slice(0, end);\n};\n\nfunction basename(path) {\n if (typeof path !== 'string') path = path + '';\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n var f = basename(path);\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\nexports.extname = function (path) {\n if (typeof path !== 'string') path = path + '';\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":14}],14:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],15:[function(require,module,exports){\nvar unparse = require('escodegen').generate;\n\nmodule.exports = function (ast, vars) {\n if (!vars) vars = {};\n var FAIL = {};\n \n var result = (function walk (node, scopeVars) {\n if (node.type === 'Literal') {\n return node.value;\n }\n else if (node.type === 'UnaryExpression'){\n var val = walk(node.argument)\n if (node.operator === '+') return +val\n if (node.operator === '-') return -val\n if (node.operator === '~') return ~val\n if (node.operator === '!') return !val\n return FAIL\n }\n else if (node.type === 'ArrayExpression') {\n var xs = [];\n for (var i = 0, l = node.elements.length; i < l; i++) {\n var x = walk(node.elements[i]);\n if (x === FAIL) return FAIL;\n xs.push(x);\n }\n return xs;\n }\n else if (node.type === 'ObjectExpression') {\n var obj = {};\n for (var i = 0; i < node.properties.length; i++) {\n var prop = node.properties[i];\n var value = prop.value === null\n ? prop.value\n : walk(prop.value)\n ;\n if (value === FAIL) return FAIL;\n obj[prop.key.value || prop.key.name] = value;\n }\n return obj;\n }\n else if (node.type === 'BinaryExpression' ||\n node.type === 'LogicalExpression') {\n var l = walk(node.left);\n if (l === FAIL) return FAIL;\n var r = walk(node.right);\n if (r === FAIL) return FAIL;\n \n var op = node.operator;\n if (op === '==') return l == r;\n if (op === '===') return l === r;\n if (op === '!=') return l != r;\n if (op === '!==') return l !== r;\n if (op === '+') return l + r;\n if (op === '-') return l - r;\n if (op === '*') return l * r;\n if (op === '/') return l / r;\n if (op === '%') return l % r;\n if (op === '<') return l < r;\n if (op === '<=') return l <= r;\n if (op === '>') return l > r;\n if (op === '>=') return l >= r;\n if (op === '|') return l | r;\n if (op === '&') return l & r;\n if (op === '^') return l ^ r;\n if (op === '&&') return l && r;\n if (op === '||') return l || r;\n \n return FAIL;\n }\n else if (node.type === 'Identifier') {\n if ({}.hasOwnProperty.call(vars, node.name)) {\n return vars[node.name];\n }\n else return FAIL;\n }\n else if (node.type === 'ThisExpression') {\n if ({}.hasOwnProperty.call(vars, 'this')) {\n return vars['this'];\n }\n else return FAIL;\n }\n else if (node.type === 'CallExpression') {\n var callee = walk(node.callee);\n if (callee === FAIL) return FAIL;\n if (typeof callee !== 'function') return FAIL;\n \n var ctx = node.callee.object ? walk(node.callee.object) : FAIL;\n if (ctx === FAIL) ctx = null;\n\n var args = [];\n for (var i = 0, l = node.arguments.length; i < l; i++) {\n var x = walk(node.arguments[i]);\n if (x === FAIL) return FAIL;\n args.push(x);\n }\n return callee.apply(ctx, args);\n }\n else if (node.type === 'MemberExpression') {\n var obj = walk(node.object);\n // do not allow access to methods on Function \n if((obj === FAIL) || (typeof obj == 'function')){\n return FAIL;\n }\n if (node.property.type === 'Identifier') {\n return obj[node.property.name];\n }\n var prop = walk(node.property);\n if (prop === FAIL) return FAIL;\n return obj[prop];\n }\n else if (node.type === 'ConditionalExpression') {\n var val = walk(node.test)\n if (val === FAIL) return FAIL;\n return val ? walk(node.consequent) : walk(node.alternate)\n }\n else if (node.type === 'ExpressionStatement') {\n var val = walk(node.expression)\n if (val === FAIL) return FAIL;\n return val;\n }\n else if (node.type === 'ReturnStatement') {\n return walk(node.argument)\n }\n else if (node.type === 'FunctionExpression') {\n \n var bodies = node.body.body;\n \n // Create a \"scope\" for our arguments\n var oldVars = {};\n Object.keys(vars).forEach(function(element){\n oldVars[element] = vars[element];\n })\n\n for(var i=0; i\n Copyright (C) 2013 Thaddee Tyl \n Copyright (C) 2013 Mathias Bynens \n Copyright (C) 2012 Ariya Hidayat \n Copyright (C) 2012 Mathias Bynens \n Copyright (C) 2012 Joost-Wim Boekesteijn \n Copyright (C) 2012 Kris Kowal \n Copyright (C) 2012 Yusuke Suzuki \n Copyright (C) 2012 Arpad Borsos \n Copyright (C) 2011 Ariya Hidayat \n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*jslint bitwise:true plusplus:true */\n/*global esprima:true, define:true, exports:true, window: true,\nthrowErrorTolerant: true,\nthrowError: true, generateStatement: true, peek: true,\nparseAssignmentExpression: true, parseBlock: true, parseExpression: true,\nparseFunctionDeclaration: true, parseFunctionExpression: true,\nparseFunctionSourceElements: true, parseVariableIdentifier: true,\nparseLeftHandSideExpression: true,\nparseUnaryExpression: true,\nparseStatement: true, parseSourceElement: true */\n\n(function (root, factory) {\n 'use strict';\n\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,\n // Rhino, and plain browser loading.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define(['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n factory((root.esprima = {}));\n }\n}(this, function (exports) {\n 'use strict';\n\n var Token,\n TokenName,\n FnExprTokens,\n Syntax,\n PropertyKind,\n Messages,\n Regex,\n SyntaxTreeDelegate,\n source,\n strict,\n index,\n lineNumber,\n lineStart,\n length,\n delegate,\n lookahead,\n state,\n extra;\n\n Token = {\n BooleanLiteral: 1,\n EOF: 2,\n Identifier: 3,\n Keyword: 4,\n NullLiteral: 5,\n NumericLiteral: 6,\n Punctuator: 7,\n StringLiteral: 8,\n RegularExpression: 9\n };\n\n TokenName = {};\n TokenName[Token.BooleanLiteral] = 'Boolean';\n TokenName[Token.EOF] = '';\n TokenName[Token.Identifier] = 'Identifier';\n TokenName[Token.Keyword] = 'Keyword';\n TokenName[Token.NullLiteral] = 'Null';\n TokenName[Token.NumericLiteral] = 'Numeric';\n TokenName[Token.Punctuator] = 'Punctuator';\n TokenName[Token.StringLiteral] = 'String';\n TokenName[Token.RegularExpression] = 'RegularExpression';\n\n // A function following one of those tokens is an expression.\n FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',\n 'return', 'case', 'delete', 'throw', 'void',\n // assignment operators\n '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',\n '&=', '|=', '^=', ',',\n // binary/unary operators\n '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',\n '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',\n '<=', '<', '>', '!=', '!=='];\n\n Syntax = {\n AssignmentExpression: 'AssignmentExpression',\n ArrayExpression: 'ArrayExpression',\n BlockStatement: 'BlockStatement',\n BinaryExpression: 'BinaryExpression',\n BreakStatement: 'BreakStatement',\n CallExpression: 'CallExpression',\n CatchClause: 'CatchClause',\n ConditionalExpression: 'ConditionalExpression',\n ContinueStatement: 'ContinueStatement',\n DoWhileStatement: 'DoWhileStatement',\n DebuggerStatement: 'DebuggerStatement',\n EmptyStatement: 'EmptyStatement',\n ExpressionStatement: 'ExpressionStatement',\n ForStatement: 'ForStatement',\n ForInStatement: 'ForInStatement',\n FunctionDeclaration: 'FunctionDeclaration',\n FunctionExpression: 'FunctionExpression',\n Identifier: 'Identifier',\n IfStatement: 'IfStatement',\n Literal: 'Literal',\n LabeledStatement: 'LabeledStatement',\n LogicalExpression: 'LogicalExpression',\n MemberExpression: 'MemberExpression',\n NewExpression: 'NewExpression',\n ObjectExpression: 'ObjectExpression',\n Program: 'Program',\n Property: 'Property',\n ReturnStatement: 'ReturnStatement',\n SequenceExpression: 'SequenceExpression',\n SwitchStatement: 'SwitchStatement',\n SwitchCase: 'SwitchCase',\n ThisExpression: 'ThisExpression',\n ThrowStatement: 'ThrowStatement',\n TryStatement: 'TryStatement',\n UnaryExpression: 'UnaryExpression',\n UpdateExpression: 'UpdateExpression',\n VariableDeclaration: 'VariableDeclaration',\n VariableDeclarator: 'VariableDeclarator',\n WhileStatement: 'WhileStatement',\n WithStatement: 'WithStatement'\n };\n\n PropertyKind = {\n Data: 1,\n Get: 2,\n Set: 4\n };\n\n // Error messages should be identical to V8.\n Messages = {\n UnexpectedToken: 'Unexpected token %0',\n UnexpectedNumber: 'Unexpected number',\n UnexpectedString: 'Unexpected string',\n UnexpectedIdentifier: 'Unexpected identifier',\n UnexpectedReserved: 'Unexpected reserved word',\n UnexpectedEOS: 'Unexpected end of input',\n NewlineAfterThrow: 'Illegal newline after throw',\n InvalidRegExp: 'Invalid regular expression',\n UnterminatedRegExp: 'Invalid regular expression: missing /',\n InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n NoCatchOrFinally: 'Missing catch or finally after try',\n UnknownLabel: 'Undefined label \\'%0\\'',\n Redeclaration: '%0 \\'%1\\' has already been declared',\n IllegalContinue: 'Illegal continue statement',\n IllegalBreak: 'Illegal break statement',\n IllegalReturn: 'Illegal return statement',\n StrictModeWith: 'Strict mode code may not include a with statement',\n StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',\n AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',\n AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',\n StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n StrictReservedWord: 'Use of future reserved word in strict mode'\n };\n\n // See also tools/generate-unicode-regex.py.\n Regex = {\n NonAsciiIdentifierStart: new RegExp('[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]'),\n NonAsciiIdentifierPart: new RegExp('[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0\\u08A2-\\u08AC\\u08E4-\\u08FE\\u0900-\\u0963\\u0966-\\u096F\\u0971-\\u0977\\u0979-\\u097F\\u0981-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C82\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D02\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1D00-\\u1DE6\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA697\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7B\\uAA80-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE26\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]')\n };\n\n // Ensure the condition is true, otherwise throw an error.\n // This is only to have a better contract semantic, i.e. another safety net\n // to catch a logic error. The condition shall be fulfilled in normal case.\n // Do NOT use this to enforce a certain condition on any user input.\n\n function assert(condition, message) {\n /* istanbul ignore if */\n if (!condition) {\n throw new Error('ASSERT: ' + message);\n }\n }\n\n function isDecimalDigit(ch) {\n return (ch >= 48 && ch <= 57); // 0..9\n }\n\n function isHexDigit(ch) {\n return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;\n }\n\n function isOctalDigit(ch) {\n return '01234567'.indexOf(ch) >= 0;\n }\n\n\n // 7.2 White Space\n\n function isWhiteSpace(ch) {\n return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);\n }\n\n // 7.3 Line Terminators\n\n function isLineTerminator(ch) {\n return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);\n }\n\n // 7.6 Identifier Names and Identifiers\n\n function isIdentifierStart(ch) {\n return (ch == 0x40) || (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)\n (ch >= 0x41 && ch <= 0x5A) || // A..Z\n (ch >= 0x61 && ch <= 0x7A) || // a..z\n (ch === 0x5C) || // \\ (backslash)\n ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));\n }\n\n function isIdentifierPart(ch) {\n return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)\n (ch >= 0x41 && ch <= 0x5A) || // A..Z\n (ch >= 0x61 && ch <= 0x7A) || // a..z\n (ch >= 0x30 && ch <= 0x39) || // 0..9\n (ch === 0x5C) || // \\ (backslash)\n ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));\n }\n\n // 7.6.1.2 Future Reserved Words\n\n function isFutureReservedWord(id) {\n switch (id) {\n case 'class':\n case 'enum':\n case 'export':\n case 'extends':\n case 'import':\n case 'super':\n return true;\n default:\n return false;\n }\n }\n\n function isStrictModeReservedWord(id) {\n switch (id) {\n case 'implements':\n case 'interface':\n case 'package':\n case 'private':\n case 'protected':\n case 'public':\n case 'static':\n case 'yield':\n case 'let':\n return true;\n default:\n return false;\n }\n }\n\n function isRestrictedWord(id) {\n return id === 'eval' || id === 'arguments';\n }\n\n // 7.6.1.1 Keywords\n\n function isKeyword(id) {\n if (strict && isStrictModeReservedWord(id)) {\n return true;\n }\n\n // 'const' is specialized as Keyword in V8.\n // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next.\n // Some others are from future reserved words.\n\n switch (id.length) {\n case 2:\n return (id === 'if') || (id === 'in') || (id === 'do');\n case 3:\n return (id === 'var') || (id === 'for') || (id === 'new') ||\n (id === 'try') || (id === 'let');\n case 4:\n return (id === 'this') || (id === 'else') || (id === 'case') ||\n (id === 'void') || (id === 'with') || (id === 'enum');\n case 5:\n return (id === 'while') || (id === 'break') || (id === 'catch') ||\n (id === 'throw') || (id === 'const') || (id === 'yield') ||\n (id === 'class') || (id === 'super');\n case 6:\n return (id === 'return') || (id === 'typeof') || (id === 'delete') ||\n (id === 'switch') || (id === 'export') || (id === 'import');\n case 7:\n return (id === 'default') || (id === 'finally') || (id === 'extends');\n case 8:\n return (id === 'function') || (id === 'continue') || (id === 'debugger');\n case 10:\n return (id === 'instanceof');\n default:\n return false;\n }\n }\n\n // 7.4 Comments\n\n function addComment(type, value, start, end, loc) {\n var comment, attacher;\n\n assert(typeof start === 'number', 'Comment must have valid position');\n\n // Because the way the actual token is scanned, often the comments\n // (if any) are skipped twice during the lexical analysis.\n // Thus, we need to skip adding a comment if the comment array already\n // handled it.\n if (state.lastCommentStart >= start) {\n return;\n }\n state.lastCommentStart = start;\n\n comment = {\n type: type,\n value: value\n };\n if (extra.range) {\n comment.range = [start, end];\n }\n if (extra.loc) {\n comment.loc = loc;\n }\n extra.comments.push(comment);\n if (extra.attachComment) {\n extra.leadingComments.push(comment);\n extra.trailingComments.push(comment);\n }\n }\n\n function skipSingleLineComment(offset) {\n var start, loc, ch, comment;\n\n start = index - offset;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart - offset\n }\n };\n\n while (index < length) {\n ch = source.charCodeAt(index);\n ++index;\n if (isLineTerminator(ch)) {\n if (extra.comments) {\n comment = source.slice(start + offset, index - 1);\n loc.end = {\n line: lineNumber,\n column: index - lineStart - 1\n };\n addComment('Line', comment, start, index - 1, loc);\n }\n if (ch === 13 && source.charCodeAt(index) === 10) {\n ++index;\n }\n ++lineNumber;\n lineStart = index;\n return;\n }\n }\n\n if (extra.comments) {\n comment = source.slice(start + offset, index);\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n addComment('Line', comment, start, index, loc);\n }\n }\n\n function skipMultiLineComment() {\n var start, loc, ch, comment;\n\n if (extra.comments) {\n start = index - 2;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart - 2\n }\n };\n }\n\n while (index < length) {\n ch = source.charCodeAt(index);\n if (isLineTerminator(ch)) {\n if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {\n ++index;\n }\n ++lineNumber;\n ++index;\n lineStart = index;\n if (index >= length) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n } else if (ch === 0x2A) {\n // Block comment ends with '*/'.\n if (source.charCodeAt(index + 1) === 0x2F) {\n ++index;\n ++index;\n if (extra.comments) {\n comment = source.slice(start + 2, index - 2);\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n addComment('Block', comment, start, index, loc);\n }\n return;\n }\n ++index;\n } else {\n ++index;\n }\n }\n\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n function skipComment() {\n var ch, start;\n\n start = (index === 0);\n while (index < length) {\n ch = source.charCodeAt(index);\n\n if (isWhiteSpace(ch)) {\n ++index;\n } else if (isLineTerminator(ch)) {\n ++index;\n if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {\n ++index;\n }\n ++lineNumber;\n lineStart = index;\n start = true;\n } else if (ch === 0x2F) { // U+002F is '/'\n ch = source.charCodeAt(index + 1);\n if (ch === 0x2F) {\n ++index;\n ++index;\n skipSingleLineComment(2);\n start = true;\n } else if (ch === 0x2A) { // U+002A is '*'\n ++index;\n ++index;\n skipMultiLineComment();\n } else {\n break;\n }\n } else if (start && ch === 0x2D) { // U+002D is '-'\n // U+003E is '>'\n if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {\n // '-->' is a single-line comment\n index += 3;\n skipSingleLineComment(3);\n } else {\n break;\n }\n } else if (ch === 0x3C) { // U+003C is '<'\n if (source.slice(index + 1, index + 4) === '!--') {\n ++index; // `<`\n ++index; // `!`\n ++index; // `-`\n ++index; // `-`\n skipSingleLineComment(4);\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n\n function scanHexEscape(prefix) {\n var i, len, ch, code = 0;\n\n len = (prefix === 'u') ? 4 : 2;\n for (i = 0; i < len; ++i) {\n if (index < length && isHexDigit(source[index])) {\n ch = source[index++];\n code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n } else {\n return '';\n }\n }\n return String.fromCharCode(code);\n }\n\n function getEscapedIdentifier() {\n var ch, id;\n\n ch = source.charCodeAt(index++);\n id = String.fromCharCode(ch);\n\n // '\\u' (U+005C, U+0075) denotes an escaped character.\n if (ch === 0x5C) {\n if (source.charCodeAt(index) !== 0x75) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n ++index;\n ch = scanHexEscape('u');\n if (!ch || ch === '\\\\' || !isIdentifierStart(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n id = ch;\n }\n\n while (index < length) {\n ch = source.charCodeAt(index);\n if (!isIdentifierPart(ch)) {\n break;\n }\n ++index;\n id += String.fromCharCode(ch);\n\n // '\\u' (U+005C, U+0075) denotes an escaped character.\n if (ch === 0x5C) {\n id = id.substr(0, id.length - 1);\n if (source.charCodeAt(index) !== 0x75) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n ++index;\n ch = scanHexEscape('u');\n if (!ch || ch === '\\\\' || !isIdentifierPart(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n id += ch;\n }\n }\n\n return id;\n }\n\n function getIdentifier() {\n var start, ch;\n\n start = index++;\n while (index < length) {\n ch = source.charCodeAt(index);\n if (ch === 0x5C) {\n // Blackslash (U+005C) marks Unicode escape sequence.\n index = start;\n return getEscapedIdentifier();\n }\n if (isIdentifierPart(ch)) {\n ++index;\n } else {\n break;\n }\n }\n\n return source.slice(start, index);\n }\n\n function scanIdentifier() {\n var start, id, type;\n\n start = index;\n\n // Backslash (U+005C) starts an escaped character.\n id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();\n\n // There is no keyword or literal with only one character.\n // Thus, it must be an identifier.\n if (id.length === 1) {\n type = Token.Identifier;\n } else if (isKeyword(id)) {\n type = Token.Keyword;\n } else if (id === 'null') {\n type = Token.NullLiteral;\n } else if (id === 'true' || id === 'false') {\n type = Token.BooleanLiteral;\n } else {\n type = Token.Identifier;\n }\n\n return {\n type: type,\n value: id,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n\n // 7.7 Punctuators\n\n function scanPunctuator() {\n var start = index,\n code = source.charCodeAt(index),\n code2,\n ch1 = source[index],\n ch2,\n ch3,\n ch4;\n\n switch (code) {\n\n // Check for most common single-character punctuators.\n case 0x2E: // . dot\n case 0x28: // ( open bracket\n case 0x29: // ) close bracket\n case 0x3B: // ; semicolon\n case 0x2C: // , comma\n case 0x7B: // { open curly brace\n case 0x7D: // } close curly brace\n case 0x5B: // [\n case 0x5D: // ]\n case 0x3A: // :\n case 0x3F: // ?\n case 0x7E: // ~\n ++index;\n if (extra.tokenize) {\n if (code === 0x28) {\n extra.openParenToken = extra.tokens.length;\n } else if (code === 0x7B) {\n extra.openCurlyToken = extra.tokens.length;\n }\n }\n return {\n type: Token.Punctuator,\n value: String.fromCharCode(code),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n\n default:\n code2 = source.charCodeAt(index + 1);\n\n // '=' (U+003D) marks an assignment or comparison operator.\n if (code2 === 0x3D) {\n switch (code) {\n case 0x2B: // +\n case 0x2D: // -\n case 0x2F: // /\n case 0x3C: // <\n case 0x3E: // >\n case 0x5E: // ^\n case 0x7C: // |\n case 0x25: // %\n case 0x26: // &\n case 0x2A: // *\n index += 2;\n return {\n type: Token.Punctuator,\n value: String.fromCharCode(code) + String.fromCharCode(code2),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n\n case 0x21: // !\n case 0x3D: // =\n index += 2;\n\n // !== and ===\n if (source.charCodeAt(index) === 0x3D) {\n ++index;\n }\n return {\n type: Token.Punctuator,\n value: source.slice(start, index),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n }\n }\n\n // 4-character punctuator: >>>=\n\n ch4 = source.substr(index, 4);\n\n if (ch4 === '>>>=') {\n index += 4;\n return {\n type: Token.Punctuator,\n value: ch4,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 3-character punctuators: === !== >>> <<= >>=\n\n ch3 = ch4.substr(0, 3);\n\n if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {\n index += 3;\n return {\n type: Token.Punctuator,\n value: ch3,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // Other 2-character punctuators: ++ -- << >> && ||\n ch2 = ch3.substr(0, 2);\n\n if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') {\n index += 2;\n return {\n type: Token.Punctuator,\n value: ch2,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 1-character punctuators: < > = ! + - * % & | ^ /\n if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n ++index;\n return {\n type: Token.Punctuator,\n value: ch1,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n // 7.8.3 Numeric Literals\n\n function scanHexLiteral(start) {\n var number = '';\n\n while (index < length) {\n if (!isHexDigit(source[index])) {\n break;\n }\n number += source[index++];\n }\n\n if (number.length === 0) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n if (isIdentifierStart(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseInt('0x' + number, 16),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function scanOctalLiteral(start) {\n var number = '0' + source[index++];\n while (index < length) {\n if (!isOctalDigit(source[index])) {\n break;\n }\n number += source[index++];\n }\n\n if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseInt(number, 8),\n octal: true,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function scanNumericLiteral() {\n var number, start, ch;\n\n ch = source[index];\n assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n 'Numeric literal must start with a decimal digit or a decimal point');\n\n start = index;\n number = '';\n if (ch !== '.') {\n number = source[index++];\n ch = source[index];\n\n // Hex number starts with '0x'.\n // Octal number starts with '0'.\n if (number === '0') {\n if (ch === 'x' || ch === 'X') {\n ++index;\n return scanHexLiteral(start);\n }\n if (isOctalDigit(ch)) {\n return scanOctalLiteral(start);\n }\n\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n }\n\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n ch = source[index];\n }\n\n if (ch === '.') {\n number += source[index++];\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n ch = source[index];\n }\n\n if (ch === 'e' || ch === 'E') {\n number += source[index++];\n\n ch = source[index];\n if (ch === '+' || ch === '-') {\n number += source[index++];\n }\n if (isDecimalDigit(source.charCodeAt(index))) {\n while (isDecimalDigit(source.charCodeAt(index))) {\n number += source[index++];\n }\n } else {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n }\n\n if (isIdentifierStart(source.charCodeAt(index))) {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.NumericLiteral,\n value: parseFloat(number),\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n // 7.8.4 String Literals\n\n function scanStringLiteral() {\n var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart;\n startLineNumber = lineNumber;\n startLineStart = lineStart;\n\n quote = source[index];\n assert((quote === '\\'' || quote === '\"'),\n 'String literal must starts with a quote');\n\n start = index;\n ++index;\n\n while (index < length) {\n ch = source[index++];\n\n if (ch === quote) {\n quote = '';\n break;\n } else if (ch === '\\\\') {\n ch = source[index++];\n if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n switch (ch) {\n case 'u':\n case 'x':\n restore = index;\n unescaped = scanHexEscape(ch);\n if (unescaped) {\n str += unescaped;\n } else {\n index = restore;\n str += ch;\n }\n break;\n case 'n':\n str += '\\n';\n break;\n case 'r':\n str += '\\r';\n break;\n case 't':\n str += '\\t';\n break;\n case 'b':\n str += '\\b';\n break;\n case 'f':\n str += '\\f';\n break;\n case 'v':\n str += '\\x0B';\n break;\n\n default:\n if (isOctalDigit(ch)) {\n code = '01234567'.indexOf(ch);\n\n // \\0 is not octal escape sequence\n if (code !== 0) {\n octal = true;\n }\n\n if (index < length && isOctalDigit(source[index])) {\n octal = true;\n code = code * 8 + '01234567'.indexOf(source[index++]);\n\n // 3 digits are only allowed when string starts\n // with 0, 1, 2, 3\n if ('0123'.indexOf(ch) >= 0 &&\n index < length &&\n isOctalDigit(source[index])) {\n code = code * 8 + '01234567'.indexOf(source[index++]);\n }\n }\n str += String.fromCharCode(code);\n } else {\n str += ch;\n }\n break;\n }\n } else {\n ++lineNumber;\n if (ch === '\\r' && source[index] === '\\n') {\n ++index;\n }\n lineStart = index;\n }\n } else if (isLineTerminator(ch.charCodeAt(0))) {\n break;\n } else {\n str += ch;\n }\n }\n\n if (quote !== '') {\n throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n\n return {\n type: Token.StringLiteral,\n value: str,\n octal: octal,\n startLineNumber: startLineNumber,\n startLineStart: startLineStart,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n function testRegExp(pattern, flags) {\n var value;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n throwError({}, Messages.InvalidRegExp);\n }\n return value;\n }\n\n function scanRegExpBody() {\n var ch, str, classMarker, terminated, body;\n\n ch = source[index];\n assert(ch === '/', 'Regular expression literal must start with a slash');\n str = source[index++];\n\n classMarker = false;\n terminated = false;\n while (index < length) {\n ch = source[index++];\n str += ch;\n if (ch === '\\\\') {\n ch = source[index++];\n // ECMA-262 7.8.5\n if (isLineTerminator(ch.charCodeAt(0))) {\n throwError({}, Messages.UnterminatedRegExp);\n }\n str += ch;\n } else if (isLineTerminator(ch.charCodeAt(0))) {\n throwError({}, Messages.UnterminatedRegExp);\n } else if (classMarker) {\n if (ch === ']') {\n classMarker = false;\n }\n } else {\n if (ch === '/') {\n terminated = true;\n break;\n } else if (ch === '[') {\n classMarker = true;\n }\n }\n }\n\n if (!terminated) {\n throwError({}, Messages.UnterminatedRegExp);\n }\n\n // Exclude leading and trailing slash.\n body = str.substr(1, str.length - 2);\n return {\n value: body,\n literal: str\n };\n }\n\n function scanRegExpFlags() {\n var ch, str, flags, restore;\n\n str = '';\n flags = '';\n while (index < length) {\n ch = source[index];\n if (!isIdentifierPart(ch.charCodeAt(0))) {\n break;\n }\n\n ++index;\n if (ch === '\\\\' && index < length) {\n ch = source[index];\n if (ch === 'u') {\n ++index;\n restore = index;\n ch = scanHexEscape('u');\n if (ch) {\n flags += ch;\n for (str += '\\\\u'; restore < index; ++restore) {\n str += source[restore];\n }\n } else {\n index = restore;\n flags += 'u';\n str += '\\\\u';\n }\n throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');\n } else {\n str += '\\\\';\n throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');\n }\n } else {\n flags += ch;\n str += ch;\n }\n }\n\n return {\n value: flags,\n literal: str\n };\n }\n\n function scanRegExp() {\n var start, body, flags, pattern, value;\n\n lookahead = null;\n skipComment();\n start = index;\n\n body = scanRegExpBody();\n flags = scanRegExpFlags();\n value = testRegExp(body.value, flags.value);\n\n if (extra.tokenize) {\n return {\n type: Token.RegularExpression,\n value: value,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: start,\n end: index\n };\n }\n\n return {\n literal: body.literal + flags.literal,\n value: value,\n start: start,\n end: index\n };\n }\n\n function collectRegex() {\n var pos, loc, regex, token;\n\n skipComment();\n\n pos = index;\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart\n }\n };\n\n regex = scanRegExp();\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n\n /* istanbul ignore next */\n if (!extra.tokenize) {\n // Pop the previous token, which is likely '/' or '/='\n if (extra.tokens.length > 0) {\n token = extra.tokens[extra.tokens.length - 1];\n if (token.range[0] === pos && token.type === 'Punctuator') {\n if (token.value === '/' || token.value === '/=') {\n extra.tokens.pop();\n }\n }\n }\n\n extra.tokens.push({\n type: 'RegularExpression',\n value: regex.literal,\n range: [pos, index],\n loc: loc\n });\n }\n\n return regex;\n }\n\n function isIdentifierName(token) {\n return token.type === Token.Identifier ||\n token.type === Token.Keyword ||\n token.type === Token.BooleanLiteral ||\n token.type === Token.NullLiteral;\n }\n\n function advanceSlash() {\n var prevToken,\n checkToken;\n // Using the following algorithm:\n // https://github.com/mozilla/sweet.js/wiki/design\n prevToken = extra.tokens[extra.tokens.length - 1];\n if (!prevToken) {\n // Nothing before that: it cannot be a division.\n return collectRegex();\n }\n if (prevToken.type === 'Punctuator') {\n if (prevToken.value === ']') {\n return scanPunctuator();\n }\n if (prevToken.value === ')') {\n checkToken = extra.tokens[extra.openParenToken - 1];\n if (checkToken &&\n checkToken.type === 'Keyword' &&\n (checkToken.value === 'if' ||\n checkToken.value === 'while' ||\n checkToken.value === 'for' ||\n checkToken.value === 'with')) {\n return collectRegex();\n }\n return scanPunctuator();\n }\n if (prevToken.value === '}') {\n // Dividing a function by anything makes little sense,\n // but we have to check for that.\n if (extra.tokens[extra.openCurlyToken - 3] &&\n extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') {\n // Anonymous function.\n checkToken = extra.tokens[extra.openCurlyToken - 4];\n if (!checkToken) {\n return scanPunctuator();\n }\n } else if (extra.tokens[extra.openCurlyToken - 4] &&\n extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') {\n // Named function.\n checkToken = extra.tokens[extra.openCurlyToken - 5];\n if (!checkToken) {\n return collectRegex();\n }\n } else {\n return scanPunctuator();\n }\n // checkToken determines whether the function is\n // a declaration or an expression.\n if (FnExprTokens.indexOf(checkToken.value) >= 0) {\n // It is an expression.\n return scanPunctuator();\n }\n // It is a declaration.\n return collectRegex();\n }\n return collectRegex();\n }\n if (prevToken.type === 'Keyword') {\n return collectRegex();\n }\n return scanPunctuator();\n }\n\n function advance() {\n var ch;\n\n skipComment();\n\n if (index >= length) {\n return {\n type: Token.EOF,\n lineNumber: lineNumber,\n lineStart: lineStart,\n start: index,\n end: index\n };\n }\n\n ch = source.charCodeAt(index);\n\n if (isIdentifierStart(ch)) {\n return scanIdentifier();\n }\n\n // Very common: ( and ) and ;\n if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {\n return scanPunctuator();\n }\n\n // String literal starts with single quote (U+0027) or double quote (U+0022).\n if (ch === 0x27 || ch === 0x22) {\n return scanStringLiteral();\n }\n\n\n // Dot (.) U+002E can also start a floating-point number, hence the need\n // to check the next character.\n if (ch === 0x2E) {\n if (isDecimalDigit(source.charCodeAt(index + 1))) {\n return scanNumericLiteral();\n }\n return scanPunctuator();\n }\n\n if (isDecimalDigit(ch)) {\n return scanNumericLiteral();\n }\n\n // Slash (/) U+002F can also start a regex.\n if (extra.tokenize && ch === 0x2F) {\n return advanceSlash();\n }\n\n return scanPunctuator();\n }\n\n function collectToken() {\n var loc, token, range, value;\n\n skipComment();\n loc = {\n start: {\n line: lineNumber,\n column: index - lineStart\n }\n };\n\n token = advance();\n loc.end = {\n line: lineNumber,\n column: index - lineStart\n };\n\n if (token.type !== Token.EOF) {\n value = source.slice(token.start, token.end);\n extra.tokens.push({\n type: TokenName[token.type],\n value: value,\n range: [token.start, token.end],\n loc: loc\n });\n }\n\n return token;\n }\n\n function lex() {\n var token;\n\n token = lookahead;\n index = token.end;\n lineNumber = token.lineNumber;\n lineStart = token.lineStart;\n\n lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n\n index = token.end;\n lineNumber = token.lineNumber;\n lineStart = token.lineStart;\n\n return token;\n }\n\n function peek() {\n var pos, line, start;\n\n pos = index;\n line = lineNumber;\n start = lineStart;\n lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n index = pos;\n lineNumber = line;\n lineStart = start;\n }\n\n function Position(line, column) {\n this.line = line;\n this.column = column;\n }\n\n function SourceLocation(startLine, startColumn, line, column) {\n this.start = new Position(startLine, startColumn);\n this.end = new Position(line, column);\n }\n\n SyntaxTreeDelegate = {\n\n name: 'SyntaxTree',\n\n processComment: function (node) {\n var lastChild, trailingComments;\n\n if (node.type === Syntax.Program) {\n if (node.body.length > 0) {\n return;\n }\n }\n\n if (extra.trailingComments.length > 0) {\n if (extra.trailingComments[0].range[0] >= node.range[1]) {\n trailingComments = extra.trailingComments;\n extra.trailingComments = [];\n } else {\n extra.trailingComments.length = 0;\n }\n } else {\n if (extra.bottomRightStack.length > 0 &&\n extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&\n extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {\n trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;\n delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;\n }\n }\n\n // Eating the stack.\n while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {\n lastChild = extra.bottomRightStack.pop();\n }\n\n if (lastChild) {\n if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {\n node.leadingComments = lastChild.leadingComments;\n delete lastChild.leadingComments;\n }\n } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {\n node.leadingComments = extra.leadingComments;\n extra.leadingComments = [];\n }\n\n\n if (trailingComments) {\n node.trailingComments = trailingComments;\n }\n\n extra.bottomRightStack.push(node);\n },\n\n markEnd: function (node, startToken) {\n if (extra.range) {\n node.range = [startToken.start, index];\n }\n if (extra.loc) {\n node.loc = new SourceLocation(\n startToken.startLineNumber === undefined ? startToken.lineNumber : startToken.startLineNumber,\n startToken.start - (startToken.startLineStart === undefined ? startToken.lineStart : startToken.startLineStart),\n lineNumber,\n index - lineStart\n );\n this.postProcess(node);\n }\n\n if (extra.attachComment) {\n this.processComment(node);\n }\n return node;\n },\n\n postProcess: function (node) {\n if (extra.source) {\n node.loc.source = extra.source;\n }\n return node;\n },\n\n createArrayExpression: function (elements) {\n return {\n type: Syntax.ArrayExpression,\n elements: elements\n };\n },\n\n createAssignmentExpression: function (operator, left, right) {\n return {\n type: Syntax.AssignmentExpression,\n operator: operator,\n left: left,\n right: right\n };\n },\n\n createBinaryExpression: function (operator, left, right) {\n var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression :\n Syntax.BinaryExpression;\n return {\n type: type,\n operator: operator,\n left: left,\n right: right\n };\n },\n\n createBlockStatement: function (body) {\n return {\n type: Syntax.BlockStatement,\n body: body\n };\n },\n\n createBreakStatement: function (label) {\n return {\n type: Syntax.BreakStatement,\n label: label\n };\n },\n\n createCallExpression: function (callee, args) {\n return {\n type: Syntax.CallExpression,\n callee: callee,\n 'arguments': args\n };\n },\n\n createCatchClause: function (param, body) {\n return {\n type: Syntax.CatchClause,\n param: param,\n body: body\n };\n },\n\n createConditionalExpression: function (test, consequent, alternate) {\n return {\n type: Syntax.ConditionalExpression,\n test: test,\n consequent: consequent,\n alternate: alternate\n };\n },\n\n createContinueStatement: function (label) {\n return {\n type: Syntax.ContinueStatement,\n label: label\n };\n },\n\n createDebuggerStatement: function () {\n return {\n type: Syntax.DebuggerStatement\n };\n },\n\n createDoWhileStatement: function (body, test) {\n return {\n type: Syntax.DoWhileStatement,\n body: body,\n test: test\n };\n },\n\n createEmptyStatement: function () {\n return {\n type: Syntax.EmptyStatement\n };\n },\n\n createExpressionStatement: function (expression) {\n return {\n type: Syntax.ExpressionStatement,\n expression: expression\n };\n },\n\n createForStatement: function (init, test, update, body) {\n return {\n type: Syntax.ForStatement,\n init: init,\n test: test,\n update: update,\n body: body\n };\n },\n\n createForInStatement: function (left, right, body) {\n return {\n type: Syntax.ForInStatement,\n left: left,\n right: right,\n body: body,\n each: false\n };\n },\n\n createFunctionDeclaration: function (id, params, defaults, body) {\n return {\n type: Syntax.FunctionDeclaration,\n id: id,\n params: params,\n defaults: defaults,\n body: body,\n rest: null,\n generator: false,\n expression: false\n };\n },\n\n createFunctionExpression: function (id, params, defaults, body) {\n return {\n type: Syntax.FunctionExpression,\n id: id,\n params: params,\n defaults: defaults,\n body: body,\n rest: null,\n generator: false,\n expression: false\n };\n },\n\n createIdentifier: function (name) {\n return {\n type: Syntax.Identifier,\n name: name\n };\n },\n\n createIfStatement: function (test, consequent, alternate) {\n return {\n type: Syntax.IfStatement,\n test: test,\n consequent: consequent,\n alternate: alternate\n };\n },\n\n createLabeledStatement: function (label, body) {\n return {\n type: Syntax.LabeledStatement,\n label: label,\n body: body\n };\n },\n\n createLiteral: function (token) {\n return {\n type: Syntax.Literal,\n value: token.value,\n raw: source.slice(token.start, token.end)\n };\n },\n\n createMemberExpression: function (accessor, object, property) {\n return {\n type: Syntax.MemberExpression,\n computed: accessor === '[',\n object: object,\n property: property\n };\n },\n\n createNewExpression: function (callee, args) {\n return {\n type: Syntax.NewExpression,\n callee: callee,\n 'arguments': args\n };\n },\n\n createObjectExpression: function (properties) {\n return {\n type: Syntax.ObjectExpression,\n properties: properties\n };\n },\n\n createPostfixExpression: function (operator, argument) {\n return {\n type: Syntax.UpdateExpression,\n operator: operator,\n argument: argument,\n prefix: false\n };\n },\n\n createProgram: function (body) {\n return {\n type: Syntax.Program,\n body: body\n };\n },\n\n createProperty: function (kind, key, value) {\n return {\n type: Syntax.Property,\n key: key,\n value: value,\n kind: kind\n };\n },\n\n createReturnStatement: function (argument) {\n return {\n type: Syntax.ReturnStatement,\n argument: argument\n };\n },\n\n createSequenceExpression: function (expressions) {\n return {\n type: Syntax.SequenceExpression,\n expressions: expressions\n };\n },\n\n createSwitchCase: function (test, consequent) {\n return {\n type: Syntax.SwitchCase,\n test: test,\n consequent: consequent\n };\n },\n\n createSwitchStatement: function (discriminant, cases) {\n return {\n type: Syntax.SwitchStatement,\n discriminant: discriminant,\n cases: cases\n };\n },\n\n createThisExpression: function () {\n return {\n type: Syntax.ThisExpression\n };\n },\n\n createThrowStatement: function (argument) {\n return {\n type: Syntax.ThrowStatement,\n argument: argument\n };\n },\n\n createTryStatement: function (block, guardedHandlers, handlers, finalizer) {\n return {\n type: Syntax.TryStatement,\n block: block,\n guardedHandlers: guardedHandlers,\n handlers: handlers,\n finalizer: finalizer\n };\n },\n\n createUnaryExpression: function (operator, argument) {\n if (operator === '++' || operator === '--') {\n return {\n type: Syntax.UpdateExpression,\n operator: operator,\n argument: argument,\n prefix: true\n };\n }\n return {\n type: Syntax.UnaryExpression,\n operator: operator,\n argument: argument,\n prefix: true\n };\n },\n\n createVariableDeclaration: function (declarations, kind) {\n return {\n type: Syntax.VariableDeclaration,\n declarations: declarations,\n kind: kind\n };\n },\n\n createVariableDeclarator: function (id, init) {\n return {\n type: Syntax.VariableDeclarator,\n id: id,\n init: init\n };\n },\n\n createWhileStatement: function (test, body) {\n return {\n type: Syntax.WhileStatement,\n test: test,\n body: body\n };\n },\n\n createWithStatement: function (object, body) {\n return {\n type: Syntax.WithStatement,\n object: object,\n body: body\n };\n }\n };\n\n // Return true if there is a line terminator before the next token.\n\n function peekLineTerminator() {\n var pos, line, start, found;\n\n pos = index;\n line = lineNumber;\n start = lineStart;\n skipComment();\n found = lineNumber !== line;\n index = pos;\n lineNumber = line;\n lineStart = start;\n\n return found;\n }\n\n // Throw an exception\n\n function throwError(token, messageFormat) {\n var error,\n args = Array.prototype.slice.call(arguments, 2),\n msg = messageFormat.replace(\n /%(\\d)/g,\n function (whole, index) {\n assert(index < args.length, 'Message reference must be in range');\n return args[index];\n }\n );\n\n if (typeof token.lineNumber === 'number') {\n error = new Error('Line ' + token.lineNumber + ': ' + msg);\n error.index = token.start;\n error.lineNumber = token.lineNumber;\n error.column = token.start - lineStart + 1;\n } else {\n error = new Error('Line ' + lineNumber + ': ' + msg);\n error.index = index;\n error.lineNumber = lineNumber;\n error.column = index - lineStart + 1;\n }\n\n error.description = msg;\n throw error;\n }\n\n function throwErrorTolerant() {\n try {\n throwError.apply(null, arguments);\n } catch (e) {\n if (extra.errors) {\n extra.errors.push(e);\n } else {\n throw e;\n }\n }\n }\n\n\n // Throw an exception because of the token.\n\n function throwUnexpected(token) {\n if (token.type === Token.EOF) {\n throwError(token, Messages.UnexpectedEOS);\n }\n\n if (token.type === Token.NumericLiteral) {\n throwError(token, Messages.UnexpectedNumber);\n }\n\n if (token.type === Token.StringLiteral) {\n throwError(token, Messages.UnexpectedString);\n }\n\n if (token.type === Token.Identifier) {\n throwError(token, Messages.UnexpectedIdentifier);\n }\n\n if (token.type === Token.Keyword) {\n if (isFutureReservedWord(token.value)) {\n throwError(token, Messages.UnexpectedReserved);\n } else if (strict && isStrictModeReservedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictReservedWord);\n return;\n }\n throwError(token, Messages.UnexpectedToken, token.value);\n }\n\n // BooleanLiteral, NullLiteral, or Punctuator.\n throwError(token, Messages.UnexpectedToken, token.value);\n }\n\n // Expect the next token to match the specified punctuator.\n // If not, an exception will be thrown.\n\n function expect(value) {\n var token = lex();\n if (token.type !== Token.Punctuator || token.value !== value) {\n throwUnexpected(token);\n }\n }\n\n // Expect the next token to match the specified keyword.\n // If not, an exception will be thrown.\n\n function expectKeyword(keyword) {\n var token = lex();\n if (token.type !== Token.Keyword || token.value !== keyword) {\n throwUnexpected(token);\n }\n }\n\n // Return true if the next token matches the specified punctuator.\n\n function match(value) {\n return lookahead.type === Token.Punctuator && lookahead.value === value;\n }\n\n // Return true if the next token matches the specified keyword\n\n function matchKeyword(keyword) {\n return lookahead.type === Token.Keyword && lookahead.value === keyword;\n }\n\n // Return true if the next token is an assignment operator\n\n function matchAssign() {\n var op;\n\n if (lookahead.type !== Token.Punctuator) {\n return false;\n }\n op = lookahead.value;\n return op === '=' ||\n op === '*=' ||\n op === '/=' ||\n op === '%=' ||\n op === '+=' ||\n op === '-=' ||\n op === '<<=' ||\n op === '>>=' ||\n op === '>>>=' ||\n op === '&=' ||\n op === '^=' ||\n op === '|=';\n }\n\n function consumeSemicolon() {\n var line;\n\n // Catch the very common case first: immediately a semicolon (U+003B).\n if (source.charCodeAt(index) === 0x3B || match(';')) {\n lex();\n return;\n }\n\n line = lineNumber;\n skipComment();\n if (lineNumber !== line) {\n return;\n }\n\n if (lookahead.type !== Token.EOF && !match('}')) {\n throwUnexpected(lookahead);\n }\n }\n\n // Return true if provided expression is LeftHandSideExpression\n\n function isLeftHandSide(expr) {\n return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;\n }\n\n // 11.1.4 Array Initialiser\n\n function parseArrayInitialiser() {\n var elements = [], startToken;\n\n startToken = lookahead;\n expect('[');\n\n while (!match(']')) {\n if (match(',')) {\n lex();\n elements.push(null);\n } else {\n elements.push(parseAssignmentExpression());\n\n if (!match(']')) {\n expect(',');\n }\n }\n }\n\n lex();\n\n return delegate.markEnd(delegate.createArrayExpression(elements), startToken);\n }\n\n // 11.1.5 Object Initialiser\n\n function parsePropertyFunction(param, first) {\n var previousStrict, body, startToken;\n\n previousStrict = strict;\n startToken = lookahead;\n body = parseFunctionSourceElements();\n if (first && strict && isRestrictedWord(param[0].name)) {\n throwErrorTolerant(first, Messages.StrictParamName);\n }\n strict = previousStrict;\n return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken);\n }\n\n function parseObjectPropertyKey() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n // Note: This function is called only from parseObjectProperty(), where\n // EOF and Punctuator tokens are already filtered out.\n\n if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n if (strict && token.octal) {\n throwErrorTolerant(token, Messages.StrictOctalLiteral);\n }\n return delegate.markEnd(delegate.createLiteral(token), startToken);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseObjectProperty() {\n var token, key, id, value, param, startToken;\n\n token = lookahead;\n startToken = lookahead;\n\n if (token.type === Token.Identifier) {\n\n id = parseObjectPropertyKey();\n\n // Property Assignment: Getter and Setter.\n\n if (token.value === 'get' && !match(':')) {\n key = parseObjectPropertyKey();\n expect('(');\n expect(')');\n value = parsePropertyFunction([]);\n return delegate.markEnd(delegate.createProperty('get', key, value), startToken);\n }\n if (token.value === 'set' && !match(':')) {\n key = parseObjectPropertyKey();\n expect('(');\n token = lookahead;\n if (token.type !== Token.Identifier) {\n expect(')');\n throwErrorTolerant(token, Messages.UnexpectedToken, token.value);\n value = parsePropertyFunction([]);\n } else {\n param = [ parseVariableIdentifier() ];\n expect(')');\n value = parsePropertyFunction(param, token);\n }\n return delegate.markEnd(delegate.createProperty('set', key, value), startToken);\n }\n expect(':');\n value = parseAssignmentExpression();\n return delegate.markEnd(delegate.createProperty('init', id, value), startToken);\n }\n if (token.type === Token.EOF || token.type === Token.Punctuator) {\n throwUnexpected(token);\n } else {\n key = parseObjectPropertyKey();\n expect(':');\n value = parseAssignmentExpression();\n return delegate.markEnd(delegate.createProperty('init', key, value), startToken);\n }\n }\n\n function parseObjectInitialiser() {\n var properties = [], property, name, key, kind, map = {}, toString = String, startToken;\n\n startToken = lookahead;\n\n expect('{');\n\n while (!match('}')) {\n property = parseObjectProperty();\n\n if (property.key.type === Syntax.Identifier) {\n name = property.key.name;\n } else {\n name = toString(property.key.value);\n }\n kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;\n\n key = '$' + name;\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n if (map[key] === PropertyKind.Data) {\n if (strict && kind === PropertyKind.Data) {\n throwErrorTolerant({}, Messages.StrictDuplicateProperty);\n } else if (kind !== PropertyKind.Data) {\n throwErrorTolerant({}, Messages.AccessorDataProperty);\n }\n } else {\n if (kind === PropertyKind.Data) {\n throwErrorTolerant({}, Messages.AccessorDataProperty);\n } else if (map[key] & kind) {\n throwErrorTolerant({}, Messages.AccessorGetSet);\n }\n }\n map[key] |= kind;\n } else {\n map[key] = kind;\n }\n\n properties.push(property);\n\n if (!match('}')) {\n expect(',');\n }\n }\n\n expect('}');\n\n return delegate.markEnd(delegate.createObjectExpression(properties), startToken);\n }\n\n // 11.1.6 The Grouping Operator\n\n function parseGroupExpression() {\n var expr;\n\n expect('(');\n\n expr = parseExpression();\n\n expect(')');\n\n return expr;\n }\n\n\n // 11.1 Primary Expressions\n\n function parsePrimaryExpression() {\n var type, token, expr, startToken;\n\n if (match('(')) {\n return parseGroupExpression();\n }\n\n if (match('[')) {\n return parseArrayInitialiser();\n }\n\n if (match('{')) {\n return parseObjectInitialiser();\n }\n\n type = lookahead.type;\n startToken = lookahead;\n\n if (type === Token.Identifier) {\n expr = delegate.createIdentifier(lex().value);\n } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n if (strict && lookahead.octal) {\n throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);\n }\n expr = delegate.createLiteral(lex());\n } else if (type === Token.Keyword) {\n if (matchKeyword('function')) {\n return parseFunctionExpression();\n }\n if (matchKeyword('this')) {\n lex();\n expr = delegate.createThisExpression();\n } else {\n throwUnexpected(lex());\n }\n } else if (type === Token.BooleanLiteral) {\n token = lex();\n token.value = (token.value === 'true');\n expr = delegate.createLiteral(token);\n } else if (type === Token.NullLiteral) {\n token = lex();\n token.value = null;\n expr = delegate.createLiteral(token);\n } else if (match('/') || match('/=')) {\n if (typeof extra.tokens !== 'undefined') {\n expr = delegate.createLiteral(collectRegex());\n } else {\n expr = delegate.createLiteral(scanRegExp());\n }\n peek();\n } else {\n throwUnexpected(lex());\n }\n\n return delegate.markEnd(expr, startToken);\n }\n\n // 11.2 Left-Hand-Side Expressions\n\n function parseArguments() {\n var args = [];\n\n expect('(');\n\n if (!match(')')) {\n while (index < length) {\n args.push(parseAssignmentExpression());\n if (match(')')) {\n break;\n }\n expect(',');\n }\n }\n\n expect(')');\n\n return args;\n }\n\n function parseNonComputedProperty() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n if (!isIdentifierName(token)) {\n throwUnexpected(token);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseNonComputedMember() {\n expect('.');\n\n return parseNonComputedProperty();\n }\n\n function parseComputedMember() {\n var expr;\n\n expect('[');\n\n expr = parseExpression();\n\n expect(']');\n\n return expr;\n }\n\n function parseNewExpression() {\n var callee, args, startToken;\n\n startToken = lookahead;\n expectKeyword('new');\n callee = parseLeftHandSideExpression();\n args = match('(') ? parseArguments() : [];\n\n return delegate.markEnd(delegate.createNewExpression(callee, args), startToken);\n }\n\n function parseLeftHandSideExpressionAllowCall() {\n var previousAllowIn, expr, args, property, startToken;\n\n startToken = lookahead;\n\n previousAllowIn = state.allowIn;\n state.allowIn = true;\n expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n state.allowIn = previousAllowIn;\n\n for (;;) {\n if (match('.')) {\n property = parseNonComputedMember();\n expr = delegate.createMemberExpression('.', expr, property);\n } else if (match('(')) {\n args = parseArguments();\n expr = delegate.createCallExpression(expr, args);\n } else if (match('[')) {\n property = parseComputedMember();\n expr = delegate.createMemberExpression('[', expr, property);\n } else {\n break;\n }\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n function parseLeftHandSideExpression() {\n var previousAllowIn, expr, property, startToken;\n\n startToken = lookahead;\n\n previousAllowIn = state.allowIn;\n expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n state.allowIn = previousAllowIn;\n\n while (match('.') || match('[')) {\n if (match('[')) {\n property = parseComputedMember();\n expr = delegate.createMemberExpression('[', expr, property);\n } else {\n property = parseNonComputedMember();\n expr = delegate.createMemberExpression('.', expr, property);\n }\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 11.3 Postfix Expressions\n\n function parsePostfixExpression() {\n var expr, token, startToken = lookahead;\n\n expr = parseLeftHandSideExpressionAllowCall();\n\n if (lookahead.type === Token.Punctuator) {\n if ((match('++') || match('--')) && !peekLineTerminator()) {\n // 11.3.1, 11.3.2\n if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n throwErrorTolerant({}, Messages.StrictLHSPostfix);\n }\n\n if (!isLeftHandSide(expr)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n token = lex();\n expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken);\n }\n }\n\n return expr;\n }\n\n // 11.4 Unary Operators\n\n function parseUnaryExpression() {\n var token, expr, startToken;\n\n if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n expr = parsePostfixExpression();\n } else if (match('++') || match('--')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n // 11.4.4, 11.4.5\n if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n throwErrorTolerant({}, Messages.StrictLHSPrefix);\n }\n\n if (!isLeftHandSide(expr)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n } else if (match('+') || match('-') || match('~') || match('!')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n startToken = lookahead;\n token = lex();\n expr = parseUnaryExpression();\n expr = delegate.createUnaryExpression(token.value, expr);\n expr = delegate.markEnd(expr, startToken);\n if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {\n throwErrorTolerant({}, Messages.StrictDelete);\n }\n } else {\n expr = parsePostfixExpression();\n }\n\n return expr;\n }\n\n function binaryPrecedence(token, allowIn) {\n var prec = 0;\n\n if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n return 0;\n }\n\n switch (token.value) {\n case '||':\n prec = 1;\n break;\n\n case '&&':\n prec = 2;\n break;\n\n case '|':\n prec = 3;\n break;\n\n case '^':\n prec = 4;\n break;\n\n case '&':\n prec = 5;\n break;\n\n case '==':\n case '!=':\n case '===':\n case '!==':\n prec = 6;\n break;\n\n case '<':\n case '>':\n case '<=':\n case '>=':\n case 'instanceof':\n prec = 7;\n break;\n\n case 'in':\n prec = allowIn ? 7 : 0;\n break;\n\n case '<<':\n case '>>':\n case '>>>':\n prec = 8;\n break;\n\n case '+':\n case '-':\n prec = 9;\n break;\n\n case '*':\n case '/':\n case '%':\n prec = 11;\n break;\n\n default:\n break;\n }\n\n return prec;\n }\n\n // 11.5 Multiplicative Operators\n // 11.6 Additive Operators\n // 11.7 Bitwise Shift Operators\n // 11.8 Relational Operators\n // 11.9 Equality Operators\n // 11.10 Binary Bitwise Operators\n // 11.11 Binary Logical Operators\n\n function parseBinaryExpression() {\n var marker, markers, expr, token, prec, stack, right, operator, left, i;\n\n marker = lookahead;\n left = parseUnaryExpression();\n\n token = lookahead;\n prec = binaryPrecedence(token, state.allowIn);\n if (prec === 0) {\n return left;\n }\n token.prec = prec;\n lex();\n\n markers = [marker, lookahead];\n right = parseUnaryExpression();\n\n stack = [left, token, right];\n\n while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {\n\n // Reduce: make a binary expression from the three topmost entries.\n while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n right = stack.pop();\n operator = stack.pop().value;\n left = stack.pop();\n expr = delegate.createBinaryExpression(operator, left, right);\n markers.pop();\n marker = markers[markers.length - 1];\n delegate.markEnd(expr, marker);\n stack.push(expr);\n }\n\n // Shift.\n token = lex();\n token.prec = prec;\n stack.push(token);\n markers.push(lookahead);\n expr = parseUnaryExpression();\n stack.push(expr);\n }\n\n // Final reduce to clean-up the stack.\n i = stack.length - 1;\n expr = stack[i];\n markers.pop();\n while (i > 1) {\n expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n i -= 2;\n marker = markers.pop();\n delegate.markEnd(expr, marker);\n }\n\n return expr;\n }\n\n\n // 11.12 Conditional Operator\n\n function parseConditionalExpression() {\n var expr, previousAllowIn, consequent, alternate, startToken;\n\n startToken = lookahead;\n\n expr = parseBinaryExpression();\n\n if (match('?')) {\n lex();\n previousAllowIn = state.allowIn;\n state.allowIn = true;\n consequent = parseAssignmentExpression();\n state.allowIn = previousAllowIn;\n expect(':');\n alternate = parseAssignmentExpression();\n\n expr = delegate.createConditionalExpression(expr, consequent, alternate);\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 11.13 Assignment Operators\n\n function parseAssignmentExpression() {\n var token, left, right, node, startToken;\n\n token = lookahead;\n startToken = lookahead;\n\n node = left = parseConditionalExpression();\n\n if (matchAssign()) {\n // LeftHandSideExpression\n if (!isLeftHandSide(left)) {\n throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n }\n\n // 11.13.1\n if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) {\n throwErrorTolerant(token, Messages.StrictLHSAssignment);\n }\n\n token = lex();\n right = parseAssignmentExpression();\n node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken);\n }\n\n return node;\n }\n\n // 11.14 Comma Operator\n\n function parseExpression() {\n var expr, startToken = lookahead;\n\n expr = parseAssignmentExpression();\n\n if (match(',')) {\n expr = delegate.createSequenceExpression([ expr ]);\n\n while (index < length) {\n if (!match(',')) {\n break;\n }\n lex();\n expr.expressions.push(parseAssignmentExpression());\n }\n\n delegate.markEnd(expr, startToken);\n }\n\n return expr;\n }\n\n // 12.1 Block\n\n function parseStatementList() {\n var list = [],\n statement;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n statement = parseSourceElement();\n if (typeof statement === 'undefined') {\n break;\n }\n list.push(statement);\n }\n\n return list;\n }\n\n function parseBlock() {\n var block, startToken;\n\n startToken = lookahead;\n expect('{');\n\n block = parseStatementList();\n\n expect('}');\n\n return delegate.markEnd(delegate.createBlockStatement(block), startToken);\n }\n\n // 12.2 Variable Statement\n\n function parseVariableIdentifier() {\n var token, startToken;\n\n startToken = lookahead;\n token = lex();\n\n if (token.type !== Token.Identifier) {\n throwUnexpected(token);\n }\n\n return delegate.markEnd(delegate.createIdentifier(token.value), startToken);\n }\n\n function parseVariableDeclaration(kind) {\n var init = null, id, startToken;\n\n startToken = lookahead;\n id = parseVariableIdentifier();\n\n // 12.2.1\n if (strict && isRestrictedWord(id.name)) {\n throwErrorTolerant({}, Messages.StrictVarName);\n }\n\n if (kind === 'const') {\n expect('=');\n init = parseAssignmentExpression();\n } else if (match('=')) {\n lex();\n init = parseAssignmentExpression();\n }\n\n return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken);\n }\n\n function parseVariableDeclarationList(kind) {\n var list = [];\n\n do {\n list.push(parseVariableDeclaration(kind));\n if (!match(',')) {\n break;\n }\n lex();\n } while (index < length);\n\n return list;\n }\n\n function parseVariableStatement() {\n var declarations;\n\n expectKeyword('var');\n\n declarations = parseVariableDeclarationList();\n\n consumeSemicolon();\n\n return delegate.createVariableDeclaration(declarations, 'var');\n }\n\n // kind may be `const` or `let`\n // Both are experimental and not in the specification yet.\n // see http://wiki.ecmascript.org/doku.php?id=harmony:const\n // and http://wiki.ecmascript.org/doku.php?id=harmony:let\n function parseConstLetDeclaration(kind) {\n var declarations, startToken;\n\n startToken = lookahead;\n\n expectKeyword(kind);\n\n declarations = parseVariableDeclarationList(kind);\n\n consumeSemicolon();\n\n return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken);\n }\n\n // 12.3 Empty Statement\n\n function parseEmptyStatement() {\n expect(';');\n return delegate.createEmptyStatement();\n }\n\n // 12.4 Expression Statement\n\n function parseExpressionStatement() {\n var expr = parseExpression();\n consumeSemicolon();\n return delegate.createExpressionStatement(expr);\n }\n\n // 12.5 If statement\n\n function parseIfStatement() {\n var test, consequent, alternate;\n\n expectKeyword('if');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n consequent = parseStatement();\n\n if (matchKeyword('else')) {\n lex();\n alternate = parseStatement();\n } else {\n alternate = null;\n }\n\n return delegate.createIfStatement(test, consequent, alternate);\n }\n\n // 12.6 Iteration Statements\n\n function parseDoWhileStatement() {\n var body, test, oldInIteration;\n\n expectKeyword('do');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n expectKeyword('while');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n if (match(';')) {\n lex();\n }\n\n return delegate.createDoWhileStatement(body, test);\n }\n\n function parseWhileStatement() {\n var test, body, oldInIteration;\n\n expectKeyword('while');\n\n expect('(');\n\n test = parseExpression();\n\n expect(')');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n return delegate.createWhileStatement(test, body);\n }\n\n function parseForVariableDeclaration() {\n var token, declarations, startToken;\n\n startToken = lookahead;\n token = lex();\n declarations = parseVariableDeclarationList();\n\n return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken);\n }\n\n function parseForStatement() {\n var init, test, update, left, right, body, oldInIteration;\n\n init = test = update = null;\n\n expectKeyword('for');\n\n expect('(');\n\n if (match(';')) {\n lex();\n } else {\n if (matchKeyword('var') || matchKeyword('let')) {\n state.allowIn = false;\n init = parseForVariableDeclaration();\n state.allowIn = true;\n\n if (init.declarations.length === 1 && matchKeyword('in')) {\n lex();\n left = init;\n right = parseExpression();\n init = null;\n }\n } else {\n state.allowIn = false;\n init = parseExpression();\n state.allowIn = true;\n\n if (matchKeyword('in')) {\n // LeftHandSideExpression\n if (!isLeftHandSide(init)) {\n throwErrorTolerant({}, Messages.InvalidLHSInForIn);\n }\n\n lex();\n left = init;\n right = parseExpression();\n init = null;\n }\n }\n\n if (typeof left === 'undefined') {\n expect(';');\n }\n }\n\n if (typeof left === 'undefined') {\n\n if (!match(';')) {\n test = parseExpression();\n }\n expect(';');\n\n if (!match(')')) {\n update = parseExpression();\n }\n }\n\n expect(')');\n\n oldInIteration = state.inIteration;\n state.inIteration = true;\n\n body = parseStatement();\n\n state.inIteration = oldInIteration;\n\n return (typeof left === 'undefined') ?\n delegate.createForStatement(init, test, update, body) :\n delegate.createForInStatement(left, right, body);\n }\n\n // 12.7 The continue statement\n\n function parseContinueStatement() {\n var label = null, key;\n\n expectKeyword('continue');\n\n // Optimize the most common form: 'continue;'.\n if (source.charCodeAt(index) === 0x3B) {\n lex();\n\n if (!state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(null);\n }\n\n if (peekLineTerminator()) {\n if (!state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(null);\n }\n\n if (lookahead.type === Token.Identifier) {\n label = parseVariableIdentifier();\n\n key = '$' + label.name;\n if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.UnknownLabel, label.name);\n }\n }\n\n consumeSemicolon();\n\n if (label === null && !state.inIteration) {\n throwError({}, Messages.IllegalContinue);\n }\n\n return delegate.createContinueStatement(label);\n }\n\n // 12.8 The break statement\n\n function parseBreakStatement() {\n var label = null, key;\n\n expectKeyword('break');\n\n // Catch the very common case first: immediately a semicolon (U+003B).\n if (source.charCodeAt(index) === 0x3B) {\n lex();\n\n if (!(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(null);\n }\n\n if (peekLineTerminator()) {\n if (!(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(null);\n }\n\n if (lookahead.type === Token.Identifier) {\n label = parseVariableIdentifier();\n\n key = '$' + label.name;\n if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.UnknownLabel, label.name);\n }\n }\n\n consumeSemicolon();\n\n if (label === null && !(state.inIteration || state.inSwitch)) {\n throwError({}, Messages.IllegalBreak);\n }\n\n return delegate.createBreakStatement(label);\n }\n\n // 12.9 The return statement\n\n function parseReturnStatement() {\n var argument = null;\n\n expectKeyword('return');\n\n if (!state.inFunctionBody) {\n throwErrorTolerant({}, Messages.IllegalReturn);\n }\n\n // 'return' followed by a space and an identifier is very common.\n if (source.charCodeAt(index) === 0x20) {\n if (isIdentifierStart(source.charCodeAt(index + 1))) {\n argument = parseExpression();\n consumeSemicolon();\n return delegate.createReturnStatement(argument);\n }\n }\n\n if (peekLineTerminator()) {\n return delegate.createReturnStatement(null);\n }\n\n if (!match(';')) {\n if (!match('}') && lookahead.type !== Token.EOF) {\n argument = parseExpression();\n }\n }\n\n consumeSemicolon();\n\n return delegate.createReturnStatement(argument);\n }\n\n // 12.10 The with statement\n\n function parseWithStatement() {\n var object, body;\n\n if (strict) {\n // TODO(ikarienator): Should we update the test cases instead?\n skipComment();\n throwErrorTolerant({}, Messages.StrictModeWith);\n }\n\n expectKeyword('with');\n\n expect('(');\n\n object = parseExpression();\n\n expect(')');\n\n body = parseStatement();\n\n return delegate.createWithStatement(object, body);\n }\n\n // 12.10 The swith statement\n\n function parseSwitchCase() {\n var test, consequent = [], statement, startToken;\n\n startToken = lookahead;\n if (matchKeyword('default')) {\n lex();\n test = null;\n } else {\n expectKeyword('case');\n test = parseExpression();\n }\n expect(':');\n\n while (index < length) {\n if (match('}') || matchKeyword('default') || matchKeyword('case')) {\n break;\n }\n statement = parseStatement();\n consequent.push(statement);\n }\n\n return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken);\n }\n\n function parseSwitchStatement() {\n var discriminant, cases, clause, oldInSwitch, defaultFound;\n\n expectKeyword('switch');\n\n expect('(');\n\n discriminant = parseExpression();\n\n expect(')');\n\n expect('{');\n\n cases = [];\n\n if (match('}')) {\n lex();\n return delegate.createSwitchStatement(discriminant, cases);\n }\n\n oldInSwitch = state.inSwitch;\n state.inSwitch = true;\n defaultFound = false;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n clause = parseSwitchCase();\n if (clause.test === null) {\n if (defaultFound) {\n throwError({}, Messages.MultipleDefaultsInSwitch);\n }\n defaultFound = true;\n }\n cases.push(clause);\n }\n\n state.inSwitch = oldInSwitch;\n\n expect('}');\n\n return delegate.createSwitchStatement(discriminant, cases);\n }\n\n // 12.13 The throw statement\n\n function parseThrowStatement() {\n var argument;\n\n expectKeyword('throw');\n\n if (peekLineTerminator()) {\n throwError({}, Messages.NewlineAfterThrow);\n }\n\n argument = parseExpression();\n\n consumeSemicolon();\n\n return delegate.createThrowStatement(argument);\n }\n\n // 12.14 The try statement\n\n function parseCatchClause() {\n var param, body, startToken;\n\n startToken = lookahead;\n expectKeyword('catch');\n\n expect('(');\n if (match(')')) {\n throwUnexpected(lookahead);\n }\n\n param = parseVariableIdentifier();\n // 12.14.1\n if (strict && isRestrictedWord(param.name)) {\n throwErrorTolerant({}, Messages.StrictCatchVariable);\n }\n\n expect(')');\n body = parseBlock();\n return delegate.markEnd(delegate.createCatchClause(param, body), startToken);\n }\n\n function parseTryStatement() {\n var block, handlers = [], finalizer = null;\n\n expectKeyword('try');\n\n block = parseBlock();\n\n if (matchKeyword('catch')) {\n handlers.push(parseCatchClause());\n }\n\n if (matchKeyword('finally')) {\n lex();\n finalizer = parseBlock();\n }\n\n if (handlers.length === 0 && !finalizer) {\n throwError({}, Messages.NoCatchOrFinally);\n }\n\n return delegate.createTryStatement(block, [], handlers, finalizer);\n }\n\n // 12.15 The debugger statement\n\n function parseDebuggerStatement() {\n expectKeyword('debugger');\n\n consumeSemicolon();\n\n return delegate.createDebuggerStatement();\n }\n\n // 12 Statements\n\n function parseStatement() {\n var type = lookahead.type,\n expr,\n labeledBody,\n key,\n startToken;\n\n if (type === Token.EOF) {\n throwUnexpected(lookahead);\n }\n\n if (type === Token.Punctuator && lookahead.value === '{') {\n return parseBlock();\n }\n\n startToken = lookahead;\n\n if (type === Token.Punctuator) {\n switch (lookahead.value) {\n case ';':\n return delegate.markEnd(parseEmptyStatement(), startToken);\n case '(':\n return delegate.markEnd(parseExpressionStatement(), startToken);\n default:\n break;\n }\n }\n\n if (type === Token.Keyword) {\n switch (lookahead.value) {\n case 'break':\n return delegate.markEnd(parseBreakStatement(), startToken);\n case 'continue':\n return delegate.markEnd(parseContinueStatement(), startToken);\n case 'debugger':\n return delegate.markEnd(parseDebuggerStatement(), startToken);\n case 'do':\n return delegate.markEnd(parseDoWhileStatement(), startToken);\n case 'for':\n return delegate.markEnd(parseForStatement(), startToken);\n case 'function':\n return delegate.markEnd(parseFunctionDeclaration(), startToken);\n case 'if':\n return delegate.markEnd(parseIfStatement(), startToken);\n case 'return':\n return delegate.markEnd(parseReturnStatement(), startToken);\n case 'switch':\n return delegate.markEnd(parseSwitchStatement(), startToken);\n case 'throw':\n return delegate.markEnd(parseThrowStatement(), startToken);\n case 'try':\n return delegate.markEnd(parseTryStatement(), startToken);\n case 'var':\n return delegate.markEnd(parseVariableStatement(), startToken);\n case 'while':\n return delegate.markEnd(parseWhileStatement(), startToken);\n case 'with':\n return delegate.markEnd(parseWithStatement(), startToken);\n default:\n break;\n }\n }\n\n expr = parseExpression();\n\n // 12.12 Labelled Statements\n if ((expr.type === Syntax.Identifier) && match(':')) {\n lex();\n\n key = '$' + expr.name;\n if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n throwError({}, Messages.Redeclaration, 'Label', expr.name);\n }\n\n state.labelSet[key] = true;\n labeledBody = parseStatement();\n delete state.labelSet[key];\n return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken);\n }\n\n consumeSemicolon();\n\n return delegate.markEnd(delegate.createExpressionStatement(expr), startToken);\n }\n\n // 13 Function Definition\n\n function parseFunctionSourceElements() {\n var sourceElement, sourceElements = [], token, directive, firstRestricted,\n oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken;\n\n startToken = lookahead;\n expect('{');\n\n while (index < length) {\n if (lookahead.type !== Token.StringLiteral) {\n break;\n }\n token = lookahead;\n\n sourceElement = parseSourceElement();\n sourceElements.push(sourceElement);\n if (sourceElement.expression.type !== Syntax.Literal) {\n // this is not directive\n break;\n }\n directive = source.slice(token.start + 1, token.end - 1);\n if (directive === 'use strict') {\n strict = true;\n if (firstRestricted) {\n throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n }\n } else {\n if (!firstRestricted && token.octal) {\n firstRestricted = token;\n }\n }\n }\n\n oldLabelSet = state.labelSet;\n oldInIteration = state.inIteration;\n oldInSwitch = state.inSwitch;\n oldInFunctionBody = state.inFunctionBody;\n\n state.labelSet = {};\n state.inIteration = false;\n state.inSwitch = false;\n state.inFunctionBody = true;\n\n while (index < length) {\n if (match('}')) {\n break;\n }\n sourceElement = parseSourceElement();\n if (typeof sourceElement === 'undefined') {\n break;\n }\n sourceElements.push(sourceElement);\n }\n\n expect('}');\n\n state.labelSet = oldLabelSet;\n state.inIteration = oldInIteration;\n state.inSwitch = oldInSwitch;\n state.inFunctionBody = oldInFunctionBody;\n\n return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken);\n }\n\n function parseParams(firstRestricted) {\n var param, params = [], token, stricted, paramSet, key, message;\n expect('(');\n\n if (!match(')')) {\n paramSet = {};\n while (index < length) {\n token = lookahead;\n param = parseVariableIdentifier();\n key = '$' + token.value;\n if (strict) {\n if (isRestrictedWord(token.value)) {\n stricted = token;\n message = Messages.StrictParamName;\n }\n if (Object.prototype.hasOwnProperty.call(paramSet, key)) {\n stricted = token;\n message = Messages.StrictParamDupe;\n }\n } else if (!firstRestricted) {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictParamName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) {\n firstRestricted = token;\n message = Messages.StrictParamDupe;\n }\n }\n params.push(param);\n paramSet[key] = true;\n if (match(')')) {\n break;\n }\n expect(',');\n }\n }\n\n expect(')');\n\n return {\n params: params,\n stricted: stricted,\n firstRestricted: firstRestricted,\n message: message\n };\n }\n\n function parseFunctionDeclaration() {\n var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken;\n\n startToken = lookahead;\n\n expectKeyword('function');\n token = lookahead;\n id = parseVariableIdentifier();\n if (strict) {\n if (isRestrictedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictFunctionName);\n }\n } else {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictFunctionName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n }\n }\n\n tmp = parseParams(firstRestricted);\n params = tmp.params;\n stricted = tmp.stricted;\n firstRestricted = tmp.firstRestricted;\n if (tmp.message) {\n message = tmp.message;\n }\n\n previousStrict = strict;\n body = parseFunctionSourceElements();\n if (strict && firstRestricted) {\n throwError(firstRestricted, message);\n }\n if (strict && stricted) {\n throwErrorTolerant(stricted, message);\n }\n strict = previousStrict;\n\n return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken);\n }\n\n function parseFunctionExpression() {\n var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken;\n\n startToken = lookahead;\n expectKeyword('function');\n\n if (!match('(')) {\n token = lookahead;\n id = parseVariableIdentifier();\n if (strict) {\n if (isRestrictedWord(token.value)) {\n throwErrorTolerant(token, Messages.StrictFunctionName);\n }\n } else {\n if (isRestrictedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictFunctionName;\n } else if (isStrictModeReservedWord(token.value)) {\n firstRestricted = token;\n message = Messages.StrictReservedWord;\n }\n }\n }\n\n tmp = parseParams(firstRestricted);\n params = tmp.params;\n stricted = tmp.stricted;\n firstRestricted = tmp.firstRestricted;\n if (tmp.message) {\n message = tmp.message;\n }\n\n previousStrict = strict;\n body = parseFunctionSourceElements();\n if (strict && firstRestricted) {\n throwError(firstRestricted, message);\n }\n if (strict && stricted) {\n throwErrorTolerant(stricted, message);\n }\n strict = previousStrict;\n\n return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken);\n }\n\n // 14 Program\n\n function parseSourceElement() {\n if (lookahead.type === Token.Keyword) {\n switch (lookahead.value) {\n case 'const':\n case 'let':\n return parseConstLetDeclaration(lookahead.value);\n case 'function':\n return parseFunctionDeclaration();\n default:\n return parseStatement();\n }\n }\n\n if (lookahead.type !== Token.EOF) {\n return parseStatement();\n }\n }\n\n function parseSourceElements() {\n var sourceElement, sourceElements = [], token, directive, firstRestricted;\n\n while (index < length) {\n token = lookahead;\n if (token.type !== Token.StringLiteral) {\n break;\n }\n\n sourceElement = parseSourceElement();\n sourceElements.push(sourceElement);\n if (sourceElement.expression.type !== Syntax.Literal) {\n // this is not directive\n break;\n }\n directive = source.slice(token.start + 1, token.end - 1);\n if (directive === 'use strict') {\n strict = true;\n if (firstRestricted) {\n throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n }\n } else {\n if (!firstRestricted && token.octal) {\n firstRestricted = token;\n }\n }\n }\n\n while (index < length) {\n sourceElement = parseSourceElement();\n /* istanbul ignore if */\n if (typeof sourceElement === 'undefined') {\n break;\n }\n sourceElements.push(sourceElement);\n }\n return sourceElements;\n }\n\n function parseProgram() {\n var body, startToken;\n\n skipComment();\n peek();\n startToken = lookahead;\n strict = false;\n\n body = parseSourceElements();\n return delegate.markEnd(delegate.createProgram(body), startToken);\n }\n\n function filterTokenLocation() {\n var i, entry, token, tokens = [];\n\n for (i = 0; i < extra.tokens.length; ++i) {\n entry = extra.tokens[i];\n token = {\n type: entry.type,\n value: entry.value\n };\n if (extra.range) {\n token.range = entry.range;\n }\n if (extra.loc) {\n token.loc = entry.loc;\n }\n tokens.push(token);\n }\n\n extra.tokens = tokens;\n }\n\n function tokenize(code, options) {\n var toString,\n token,\n tokens;\n\n toString = String;\n if (typeof code !== 'string' && !(code instanceof String)) {\n code = toString(code);\n }\n\n delegate = SyntaxTreeDelegate;\n source = code;\n index = 0;\n lineNumber = (source.length > 0) ? 1 : 0;\n lineStart = 0;\n length = source.length;\n lookahead = null;\n state = {\n allowIn: true,\n labelSet: {},\n inFunctionBody: false,\n inIteration: false,\n inSwitch: false,\n lastCommentStart: -1\n };\n\n extra = {};\n\n // Options matching.\n options = options || {};\n\n // Of course we collect tokens here.\n options.tokens = true;\n extra.tokens = [];\n extra.tokenize = true;\n // The following two fields are necessary to compute the Regex tokens.\n extra.openParenToken = -1;\n extra.openCurlyToken = -1;\n\n extra.range = (typeof options.range === 'boolean') && options.range;\n extra.loc = (typeof options.loc === 'boolean') && options.loc;\n\n if (typeof options.comment === 'boolean' && options.comment) {\n extra.comments = [];\n }\n if (typeof options.tolerant === 'boolean' && options.tolerant) {\n extra.errors = [];\n }\n\n try {\n peek();\n if (lookahead.type === Token.EOF) {\n return extra.tokens;\n }\n\n token = lex();\n while (lookahead.type !== Token.EOF) {\n try {\n token = lex();\n } catch (lexError) {\n token = lookahead;\n if (extra.errors) {\n extra.errors.push(lexError);\n // We have to break on the first error\n // to avoid infinite loops.\n break;\n } else {\n throw lexError;\n }\n }\n }\n\n filterTokenLocation();\n tokens = extra.tokens;\n if (typeof extra.comments !== 'undefined') {\n tokens.comments = extra.comments;\n }\n if (typeof extra.errors !== 'undefined') {\n tokens.errors = extra.errors;\n }\n } catch (e) {\n throw e;\n } finally {\n extra = {};\n }\n return tokens;\n }\n\n function parse(code, options) {\n var program, toString;\n\n toString = String;\n if (typeof code !== 'string' && !(code instanceof String)) {\n code = toString(code);\n }\n\n delegate = SyntaxTreeDelegate;\n source = code;\n index = 0;\n lineNumber = (source.length > 0) ? 1 : 0;\n lineStart = 0;\n length = source.length;\n lookahead = null;\n state = {\n allowIn: true,\n labelSet: {},\n inFunctionBody: false,\n inIteration: false,\n inSwitch: false,\n lastCommentStart: -1\n };\n\n extra = {};\n if (typeof options !== 'undefined') {\n extra.range = (typeof options.range === 'boolean') && options.range;\n extra.loc = (typeof options.loc === 'boolean') && options.loc;\n extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;\n\n if (extra.loc && options.source !== null && options.source !== undefined) {\n extra.source = toString(options.source);\n }\n\n if (typeof options.tokens === 'boolean' && options.tokens) {\n extra.tokens = [];\n }\n if (typeof options.comment === 'boolean' && options.comment) {\n extra.comments = [];\n }\n if (typeof options.tolerant === 'boolean' && options.tolerant) {\n extra.errors = [];\n }\n if (extra.attachComment) {\n extra.range = true;\n extra.comments = [];\n extra.bottomRightStack = [];\n extra.trailingComments = [];\n extra.leadingComments = [];\n }\n }\n\n try {\n program = parseProgram();\n if (typeof extra.comments !== 'undefined') {\n program.comments = extra.comments;\n }\n if (typeof extra.tokens !== 'undefined') {\n filterTokenLocation();\n program.tokens = extra.tokens;\n }\n if (typeof extra.errors !== 'undefined') {\n program.errors = extra.errors;\n }\n } catch (e) {\n throw e;\n } finally {\n extra = {};\n }\n\n return program;\n }\n\n // Sync with *.json manifests.\n exports.version = '1.2.2';\n\n exports.tokenize = tokenize;\n\n exports.parse = parse;\n\n // Deep copy.\n /* istanbul ignore next */\n exports.Syntax = (function () {\n var name, types = {};\n\n if (typeof Object.create === 'function') {\n types = Object.create(null);\n }\n\n for (name in Syntax) {\n if (Syntax.hasOwnProperty(name)) {\n types[name] = Syntax[name];\n }\n }\n\n if (typeof Object.freeze === 'function') {\n Object.freeze(types);\n }\n\n return types;\n }());\n\n}));\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n},{}],1:[function(require,module,exports){\n(function (process){\n/* parser generated by jison 0.4.13 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"JSON_PATH\":3,\"DOLLAR\":4,\"PATH_COMPONENTS\":5,\"LEADING_CHILD_MEMBER_EXPRESSION\":6,\"PATH_COMPONENT\":7,\"MEMBER_COMPONENT\":8,\"SUBSCRIPT_COMPONENT\":9,\"CHILD_MEMBER_COMPONENT\":10,\"DESCENDANT_MEMBER_COMPONENT\":11,\"DOT\":12,\"MEMBER_EXPRESSION\":13,\"DOT_DOT\":14,\"STAR\":15,\"IDENTIFIER\":16,\"SCRIPT_EXPRESSION\":17,\"INTEGER\":18,\"END\":19,\"CHILD_SUBSCRIPT_COMPONENT\":20,\"DESCENDANT_SUBSCRIPT_COMPONENT\":21,\"[\":22,\"SUBSCRIPT\":23,\"]\":24,\"SUBSCRIPT_EXPRESSION\":25,\"SUBSCRIPT_EXPRESSION_LIST\":26,\"SUBSCRIPT_EXPRESSION_LISTABLE\":27,\",\":28,\"STRING_LITERAL\":29,\"ARRAY_SLICE\":30,\"FILTER_EXPRESSION\":31,\"QQ_STRING\":32,\"Q_STRING\":33,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"DOLLAR\",12:\"DOT\",14:\"DOT_DOT\",15:\"STAR\",16:\"IDENTIFIER\",17:\"SCRIPT_EXPRESSION\",18:\"INTEGER\",19:\"END\",22:\"[\",24:\"]\",28:\",\",30:\"ARRAY_SLICE\",31:\"FILTER_EXPRESSION\",32:\"QQ_STRING\",33:\"Q_STRING\"},\nproductions_: [0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */\n/**/) {\n/* this == yyval */\nif (!yy.ast) {\n yy.ast = _ast;\n _ast.initialize();\n}\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:yy.ast.set({ expression: { type: \"root\", value: $$[$0] } }); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 2:yy.ast.set({ expression: { type: \"root\", value: $$[$0-1] } }); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 3:yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 4:yy.ast.set({ operation: \"member\", scope: \"child\", expression: { type: \"identifier\", value: $$[$0-1] }}); yy.ast.unshift(); return yy.ast.yield()\nbreak;\ncase 5:\nbreak;\ncase 6:\nbreak;\ncase 7:yy.ast.set({ operation: \"member\" }); yy.ast.push()\nbreak;\ncase 8:yy.ast.set({ operation: \"subscript\" }); yy.ast.push() \nbreak;\ncase 9:yy.ast.set({ scope: \"child\" })\nbreak;\ncase 10:yy.ast.set({ scope: \"descendant\" })\nbreak;\ncase 11:\nbreak;\ncase 12:yy.ast.set({ scope: \"child\", operation: \"member\" })\nbreak;\ncase 13:\nbreak;\ncase 14:yy.ast.set({ expression: { type: \"wildcard\", value: $$[$0] } })\nbreak;\ncase 15:yy.ast.set({ expression: { type: \"identifier\", value: $$[$0] } })\nbreak;\ncase 16:yy.ast.set({ expression: { type: \"script_expression\", value: $$[$0] } })\nbreak;\ncase 17:yy.ast.set({ expression: { type: \"numeric_literal\", value: parseInt($$[$0]) } })\nbreak;\ncase 18:\nbreak;\ncase 19:yy.ast.set({ scope: \"child\" })\nbreak;\ncase 20:yy.ast.set({ scope: \"descendant\" })\nbreak;\ncase 21:\nbreak;\ncase 22:\nbreak;\ncase 23:\nbreak;\ncase 24:$$[$0].length > 1? yy.ast.set({ expression: { type: \"union\", value: $$[$0] } }) : this.$ = $$[$0]\nbreak;\ncase 25:this.$ = [$$[$0]]\nbreak;\ncase 26:this.$ = $$[$0-2].concat($$[$0])\nbreak;\ncase 27:this.$ = { expression: { type: \"numeric_literal\", value: parseInt($$[$0]) } }; yy.ast.set(this.$)\nbreak;\ncase 28:this.$ = { expression: { type: \"string_literal\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 29:this.$ = { expression: { type: \"slice\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 30:this.$ = { expression: { type: \"wildcard\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 31:this.$ = { expression: { type: \"script_expression\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 32:this.$ = { expression: { type: \"filter_expression\", value: $$[$0] } }; yy.ast.set(this.$)\nbreak;\ncase 33:this.$ = $$[$0]\nbreak;\ncase 34:this.$ = $$[$0]\nbreak;\n}\n},\ntable: [{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],\ndefaultActions: {27:[2,23],29:[2,30],30:[2,31],31:[2,32]},\nparseError: function parseError(str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == 'undefined') {\n this.lexer.yylloc = {};\n }\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === 'function') {\n this.parseError = this.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = self.lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (this.lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + this.lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: this.lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: this.lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n this.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\nvar _ast = {\n\n initialize: function() {\n this._nodes = [];\n this._node = {};\n this._stash = [];\n },\n\n set: function(props) {\n for (var k in props) this._node[k] = props[k];\n return this._node;\n },\n\n node: function(obj) {\n if (arguments.length) this._node = obj;\n return this._node;\n },\n\n push: function() {\n this._nodes.push(this._node);\n this._node = {};\n },\n\n unshift: function() {\n this._nodes.unshift(this._node);\n this._node = {};\n },\n\n yield: function() {\n var _nodes = this._nodes;\n this.initialize();\n return _nodes;\n }\n};\n/* generated by jison-lex 0.2.1 */\nvar lexer = (function(){\nvar lexer = {\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input) {\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function (match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin(condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState() {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules() {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState(n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState(condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START\n/**/) {\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 4\nbreak;\ncase 1:return 14\nbreak;\ncase 2:return 12\nbreak;\ncase 3:return 15\nbreak;\ncase 4:return 16\nbreak;\ncase 5:return 22\nbreak;\ncase 6:return 24\nbreak;\ncase 7:return 28\nbreak;\ncase 8:return 30\nbreak;\ncase 9:return 18\nbreak;\ncase 10:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 32;\nbreak;\ncase 11:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 33;\nbreak;\ncase 12:return 17\nbreak;\ncase 13:return 31\nbreak;\n}\n},\nrules: [/^(?:\\$)/,/^(?:\\.\\.)/,/^(?:\\.)/,/^(?:\\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\\[)/,/^(?:\\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\\:((-?(?:0|[1-9][0-9]*)))?(\\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:\"(?:\\\\[\"bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\")/,/^(?:'(?:\\\\['bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^'\\\\])*')/,/^(?:\\(.+?\\)(?=\\]))/,/^(?:\\?\\(.+?\\)(?=\\]))/],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}}\n};\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain(args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}\n\n}).call(this,require('_process'))\n},{\"_process\":14,\"fs\":12,\"path\":13}],2:[function(require,module,exports){\nmodule.exports = {\n identifier: \"[a-zA-Z_]+[a-zA-Z0-9_]*\",\n integer: \"-?(?:0|[1-9][0-9]*)\",\n qq_string: \"\\\"(?:\\\\\\\\[\\\"bfnrt/\\\\\\\\]|\\\\\\\\u[a-fA-F0-9]{4}|[^\\\"\\\\\\\\])*\\\"\",\n q_string: \"'(?:\\\\\\\\[\\'bfnrt/\\\\\\\\]|\\\\\\\\u[a-fA-F0-9]{4}|[^\\'\\\\\\\\])*'\"\n};\n\n},{}],3:[function(require,module,exports){\nvar dict = require('./dict');\nvar fs = require('fs');\nvar grammar = {\n\n lex: {\n\n macros: {\n esc: \"\\\\\\\\\",\n int: dict.integer\n },\n\n rules: [\n [\"\\\\$\", \"return 'DOLLAR'\"],\n [\"\\\\.\\\\.\", \"return 'DOT_DOT'\"],\n [\"\\\\.\", \"return 'DOT'\"],\n [\"\\\\*\", \"return 'STAR'\"],\n [dict.identifier, \"return 'IDENTIFIER'\"],\n [\"\\\\[\", \"return '['\"],\n [\"\\\\]\", \"return ']'\"],\n [\",\", \"return ','\"],\n [\"({int})?\\\\:({int})?(\\\\:({int})?)?\", \"return 'ARRAY_SLICE'\"],\n [\"{int}\", \"return 'INTEGER'\"],\n [dict.qq_string, \"yytext = yytext.substr(1,yyleng-2); return 'QQ_STRING';\"],\n [dict.q_string, \"yytext = yytext.substr(1,yyleng-2); return 'Q_STRING';\"],\n [\"\\\\(.+?\\\\)(?=\\\\])\", \"return 'SCRIPT_EXPRESSION'\"],\n [\"\\\\?\\\\(.+?\\\\)(?=\\\\])\", \"return 'FILTER_EXPRESSION'\"]\n ]\n },\n\n start: \"JSON_PATH\",\n\n bnf: {\n\n JSON_PATH: [\n [ 'DOLLAR', 'yy.ast.set({ expression: { type: \"root\", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'DOLLAR PATH_COMPONENTS', 'yy.ast.set({ expression: { type: \"root\", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'LEADING_CHILD_MEMBER_EXPRESSION', 'yy.ast.unshift(); return yy.ast.yield()' ],\n [ 'LEADING_CHILD_MEMBER_EXPRESSION PATH_COMPONENTS', 'yy.ast.set({ operation: \"member\", scope: \"child\", expression: { type: \"identifier\", value: $1 }}); yy.ast.unshift(); return yy.ast.yield()' ] ],\n\n PATH_COMPONENTS: [\n [ 'PATH_COMPONENT', '' ],\n [ 'PATH_COMPONENTS PATH_COMPONENT', '' ] ],\n\n PATH_COMPONENT: [\n [ 'MEMBER_COMPONENT', 'yy.ast.set({ operation: \"member\" }); yy.ast.push()' ],\n [ 'SUBSCRIPT_COMPONENT', 'yy.ast.set({ operation: \"subscript\" }); yy.ast.push() ' ] ],\n\n MEMBER_COMPONENT: [\n [ 'CHILD_MEMBER_COMPONENT', 'yy.ast.set({ scope: \"child\" })' ],\n [ 'DESCENDANT_MEMBER_COMPONENT', 'yy.ast.set({ scope: \"descendant\" })' ] ],\n\n CHILD_MEMBER_COMPONENT: [\n [ 'DOT MEMBER_EXPRESSION', '' ] ],\n\n LEADING_CHILD_MEMBER_EXPRESSION: [\n [ 'MEMBER_EXPRESSION', 'yy.ast.set({ scope: \"child\", operation: \"member\" })' ] ],\n\n DESCENDANT_MEMBER_COMPONENT: [\n [ 'DOT_DOT MEMBER_EXPRESSION', '' ] ],\n\n MEMBER_EXPRESSION: [\n [ 'STAR', 'yy.ast.set({ expression: { type: \"wildcard\", value: $1 } })' ],\n [ 'IDENTIFIER', 'yy.ast.set({ expression: { type: \"identifier\", value: $1 } })' ],\n [ 'SCRIPT_EXPRESSION', 'yy.ast.set({ expression: { type: \"script_expression\", value: $1 } })' ],\n [ 'INTEGER', 'yy.ast.set({ expression: { type: \"numeric_literal\", value: parseInt($1) } })' ],\n [ 'END', '' ] ],\n\n SUBSCRIPT_COMPONENT: [\n [ 'CHILD_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: \"child\" })' ],\n [ 'DESCENDANT_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: \"descendant\" })' ] ],\n\n CHILD_SUBSCRIPT_COMPONENT: [\n [ '[ SUBSCRIPT ]', '' ] ],\n\n DESCENDANT_SUBSCRIPT_COMPONENT: [\n [ 'DOT_DOT [ SUBSCRIPT ]', '' ] ],\n\n SUBSCRIPT: [\n [ 'SUBSCRIPT_EXPRESSION', '' ],\n [ 'SUBSCRIPT_EXPRESSION_LIST', '$1.length > 1? yy.ast.set({ expression: { type: \"union\", value: $1 } }) : $$ = $1' ] ],\n\n SUBSCRIPT_EXPRESSION_LIST: [\n [ 'SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = [$1]'],\n [ 'SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = $1.concat($3)' ] ],\n\n SUBSCRIPT_EXPRESSION_LISTABLE: [\n [ 'INTEGER', '$$ = { expression: { type: \"numeric_literal\", value: parseInt($1) } }; yy.ast.set($$)' ],\n [ 'STRING_LITERAL', '$$ = { expression: { type: \"string_literal\", value: $1 } }; yy.ast.set($$)' ],\n [ 'ARRAY_SLICE', '$$ = { expression: { type: \"slice\", value: $1 } }; yy.ast.set($$)' ] ],\n\n SUBSCRIPT_EXPRESSION: [\n [ 'STAR', '$$ = { expression: { type: \"wildcard\", value: $1 } }; yy.ast.set($$)' ],\n [ 'SCRIPT_EXPRESSION', '$$ = { expression: { type: \"script_expression\", value: $1 } }; yy.ast.set($$)' ],\n [ 'FILTER_EXPRESSION', '$$ = { expression: { type: \"filter_expression\", value: $1 } }; yy.ast.set($$)' ] ],\n\n STRING_LITERAL: [\n [ 'QQ_STRING', \"$$ = $1\" ],\n [ 'Q_STRING', \"$$ = $1\" ] ]\n }\n};\nif (fs.readFileSync) {\n grammar.moduleInclude = fs.readFileSync(require.resolve(\"../include/module.js\"));\n grammar.actionInclude = fs.readFileSync(require.resolve(\"../include/action.js\"));\n}\n\nmodule.exports = grammar;\n\n},{\"./dict\":2,\"fs\":12}],4:[function(require,module,exports){\nvar aesprim = require('./aesprim');\nvar slice = require('./slice');\nvar _evaluate = require('static-eval');\nvar _uniq = require('underscore').uniq;\n\nvar Handlers = function() {\n return this.initialize.apply(this, arguments);\n}\n\nHandlers.prototype.initialize = function() {\n this.traverse = traverser(true);\n this.descend = traverser();\n}\n\nHandlers.prototype.keys = Object.keys;\n\nHandlers.prototype.resolve = function(component) {\n\n var key = [ component.operation, component.scope, component.expression.type ].join('-');\n var method = this._fns[key];\n\n if (!method) throw new Error(\"couldn't resolve key: \" + key);\n return method.bind(this);\n};\n\nHandlers.prototype.register = function(key, handler) {\n\n if (!handler instanceof Function) {\n throw new Error(\"handler must be a function\");\n }\n\n this._fns[key] = handler;\n};\n\nHandlers.prototype._fns = {\n\n 'member-child-identifier': function(component, partial) {\n var key = component.expression.value;\n var value = partial.value;\n if (value instanceof Object && key in value) {\n return [ { value: value[key], path: partial.path.concat(key) } ]\n }\n },\n\n 'member-descendant-identifier':\n _traverse(function(key, value, ref) { return key == ref }),\n\n 'subscript-child-numeric_literal':\n _descend(function(key, value, ref) { return key === ref }),\n\n 'member-child-numeric_literal':\n _descend(function(key, value, ref) { return String(key) === String(ref) }),\n\n 'subscript-descendant-numeric_literal':\n _traverse(function(key, value, ref) { return key === ref }),\n\n 'member-child-wildcard':\n _descend(function() { return true }),\n\n 'member-descendant-wildcard':\n _traverse(function() { return true }),\n\n 'subscript-descendant-wildcard':\n _traverse(function() { return true }),\n\n 'subscript-child-wildcard':\n _descend(function() { return true }),\n\n 'subscript-child-slice': function(component, partial) {\n if (is_array(partial.value)) {\n var args = component.expression.value.split(':').map(_parse_nullable_int);\n var values = partial.value.map(function(v, i) { return { value: v, path: partial.path.concat(i) } });\n return slice.apply(null, [values].concat(args));\n }\n },\n\n 'subscript-child-union': function(component, partial) {\n var results = [];\n component.expression.value.forEach(function(component) {\n var _component = { operation: 'subscript', scope: 'child', expression: component.expression };\n var handler = this.resolve(_component);\n var _results = handler(_component, partial);\n if (_results) {\n results = results.concat(_results);\n }\n }, this);\n\n return unique(results);\n },\n\n 'subscript-descendant-union': function(component, partial, count) {\n\n var jp = require('..');\n var self = this;\n\n var results = [];\n var nodes = jp.nodes(partial, '$..*').slice(1);\n\n nodes.forEach(function(node) {\n if (results.length >= count) return;\n component.expression.value.forEach(function(component) {\n var _component = { operation: 'subscript', scope: 'child', expression: component.expression };\n var handler = self.resolve(_component);\n var _results = handler(_component, node);\n results = results.concat(_results);\n });\n });\n\n return unique(results);\n },\n\n 'subscript-child-filter_expression': function(component, partial, count) {\n\n // slice out the expression from ?(expression)\n var src = component.expression.value.slice(2, -1);\n var ast = aesprim.parse(src).body[0].expression;\n\n var passable = function(key, value) {\n return evaluate(ast, { '@': value });\n }\n\n return this.descend(partial, null, passable, count);\n\n },\n\n 'subscript-descendant-filter_expression': function(component, partial, count) {\n\n // slice out the expression from ?(expression)\n var src = component.expression.value.slice(2, -1);\n var ast = aesprim.parse(src).body[0].expression;\n\n var passable = function(key, value) {\n return evaluate(ast, { '@': value });\n }\n\n return this.traverse(partial, null, passable, count);\n },\n\n 'subscript-child-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$[{{value}}]');\n },\n\n 'member-child-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$.{{value}}');\n },\n\n 'member-descendant-script_expression': function(component, partial) {\n var exp = component.expression.value.slice(1, -1);\n return eval_recurse(partial, exp, '$..value');\n }\n};\n\nHandlers.prototype._fns['subscript-child-string_literal'] =\n\tHandlers.prototype._fns['member-child-identifier'];\n\nHandlers.prototype._fns['member-descendant-numeric_literal'] =\n Handlers.prototype._fns['subscript-descendant-string_literal'] =\n Handlers.prototype._fns['member-descendant-identifier'];\n\nfunction eval_recurse(partial, src, template) {\n\n var jp = require('./index');\n var ast = aesprim.parse(src).body[0].expression;\n var value = evaluate(ast, { '@': partial.value });\n var path = template.replace(/\\{\\{\\s*value\\s*\\}\\}/g, value);\n\n var results = jp.nodes(partial.value, path);\n results.forEach(function(r) {\n r.path = partial.path.concat(r.path.slice(1));\n });\n\n return results;\n}\n\nfunction is_array(val) {\n return Array.isArray(val);\n}\n\nfunction is_object(val) {\n // is this a non-array, non-null object?\n return val && !(val instanceof Array) && val instanceof Object;\n}\n\nfunction traverser(recurse) {\n\n return function(partial, ref, passable, count) {\n\n var value = partial.value;\n var path = partial.path;\n\n var results = [];\n\n var descend = function(value, path) {\n\n if (is_array(value)) {\n value.forEach(function(element, index) {\n if (results.length >= count) { return }\n if (passable(index, element, ref)) {\n results.push({ path: path.concat(index), value: element });\n }\n });\n value.forEach(function(element, index) {\n if (results.length >= count) { return }\n if (recurse) {\n descend(element, path.concat(index));\n }\n });\n } else if (is_object(value)) {\n this.keys(value).forEach(function(k) {\n if (results.length >= count) { return }\n if (passable(k, value[k], ref)) {\n results.push({ path: path.concat(k), value: value[k] });\n }\n })\n this.keys(value).forEach(function(k) {\n if (results.length >= count) { return }\n if (recurse) {\n descend(value[k], path.concat(k));\n }\n });\n }\n }.bind(this);\n descend(value, path);\n return results;\n }\n}\n\nfunction _descend(passable) {\n return function(component, partial, count) {\n return this.descend(partial, component.expression.value, passable, count);\n }\n}\n\nfunction _traverse(passable) {\n return function(component, partial, count) {\n return this.traverse(partial, component.expression.value, passable, count);\n }\n}\n\nfunction evaluate() {\n try { return _evaluate.apply(this, arguments) }\n catch (e) { }\n}\n\nfunction unique(results) {\n results = results.filter(function(d) { return d })\n return _uniq(\n results,\n function(r) { return r.path.map(function(c) { return String(c).replace('-', '--') }).join('-') }\n );\n}\n\nfunction _parse_nullable_int(val) {\n var sval = String(val);\n return sval.match(/^-?[0-9]+$/) ? parseInt(sval) : null;\n}\n\nmodule.exports = Handlers;\n\n},{\"..\":\"jsonpath\",\"./aesprim\":\"./aesprim\",\"./index\":5,\"./slice\":7,\"static-eval\":15,\"underscore\":12}],5:[function(require,module,exports){\nvar assert = require('assert');\nvar dict = require('./dict');\nvar Parser = require('./parser');\nvar Handlers = require('./handlers');\n\nvar JSONPath = function() {\n this.initialize.apply(this, arguments);\n};\n\nJSONPath.prototype.initialize = function() {\n this.parser = new Parser();\n this.handlers = new Handlers();\n};\n\nJSONPath.prototype.parse = function(string) {\n assert.ok(_is_string(string), \"we need a path\");\n return this.parser.parse(string);\n};\n\nJSONPath.prototype.parent = function(obj, string) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var node = this.nodes(obj, string)[0];\n var key = node.path.pop(); /* jshint unused:false */\n return this.value(obj, node.path);\n}\n\nJSONPath.prototype.apply = function(obj, string, fn) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n assert.equal(typeof fn, \"function\", \"fn needs to be function\")\n\n var nodes = this.nodes(obj, string).sort(function(a, b) {\n // sort nodes so we apply from the bottom up\n return b.path.length - a.path.length;\n });\n\n nodes.forEach(function(node) {\n var key = node.path.pop();\n var parent = this.value(obj, this.stringify(node.path));\n var val = node.value = fn.call(obj, parent[key]);\n parent[key] = val;\n }, this);\n\n return nodes;\n}\n\nJSONPath.prototype.value = function(obj, path, value) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(path, \"we need a path\");\n\n if (arguments.length >= 3) {\n var node = this.nodes(obj, path).shift();\n if (!node) return this._vivify(obj, path, value);\n var key = node.path.slice(-1).shift();\n var parent = this.parent(obj, this.stringify(node.path));\n parent[key] = value;\n }\n return this.query(obj, this.stringify(path), 1).shift();\n}\n\nJSONPath.prototype._vivify = function(obj, string, value) {\n\n var self = this;\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var path = this.parser.parse(string)\n .map(function(component) { return component.expression.value });\n\n var setValue = function(path, value) {\n var key = path.pop();\n var node = self.value(obj, path);\n if (!node) {\n setValue(path.concat(), typeof key === 'string' ? {} : []);\n node = self.value(obj, path);\n }\n node[key] = value;\n }\n setValue(path, value);\n return this.query(obj, string)[0];\n}\n\nJSONPath.prototype.query = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(_is_string(string), \"we need a path\");\n\n var results = this.nodes(obj, string, count)\n .map(function(r) { return r.value });\n\n return results;\n};\n\nJSONPath.prototype.paths = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n var results = this.nodes(obj, string, count)\n .map(function(r) { return r.path });\n\n return results;\n};\n\nJSONPath.prototype.nodes = function(obj, string, count) {\n\n assert.ok(obj instanceof Object, \"obj needs to be an object\");\n assert.ok(string, \"we need a path\");\n\n if (count === 0) return [];\n\n var path = this.parser.parse(string);\n var handlers = this.handlers;\n\n var partials = [ { path: ['$'], value: obj } ];\n var matches = [];\n\n if (path.length && path[0].expression.type == 'root') path.shift();\n\n if (!path.length) return partials;\n\n path.forEach(function(component, index) {\n\n if (matches.length >= count) return;\n var handler = handlers.resolve(component);\n var _partials = [];\n\n partials.forEach(function(p) {\n\n if (matches.length >= count) return;\n var results = handler(component, p, count);\n\n if (index == path.length - 1) {\n // if we're through the components we're done\n matches = matches.concat(results || []);\n } else {\n // otherwise accumulate and carry on through\n _partials = _partials.concat(results || []);\n }\n });\n\n partials = _partials;\n\n });\n\n return count ? matches.slice(0, count) : matches;\n};\n\nJSONPath.prototype.stringify = function(path) {\n\n assert.ok(path, \"we need a path\");\n\n var string = '$';\n\n var templates = {\n 'descendant-member': '..{{value}}',\n 'child-member': '.{{value}}',\n 'descendant-subscript': '..[{{value}}]',\n 'child-subscript': '[{{value}}]'\n };\n\n path = this._normalize(path);\n\n path.forEach(function(component) {\n\n if (component.expression.type == 'root') return;\n\n var key = [component.scope, component.operation].join('-');\n var template = templates[key];\n var value;\n\n if (component.expression.type == 'string_literal') {\n value = JSON.stringify(component.expression.value)\n } else {\n value = component.expression.value;\n }\n\n if (!template) throw new Error(\"couldn't find template \" + key);\n\n string += template.replace(/{{value}}/, value);\n });\n\n return string;\n}\n\nJSONPath.prototype._normalize = function(path) {\n\n assert.ok(path, \"we need a path\");\n\n if (typeof path == \"string\") {\n\n return this.parser.parse(path);\n\n } else if (Array.isArray(path) && typeof path[0] == \"string\") {\n\n var _path = [ { expression: { type: \"root\", value: \"$\" } } ];\n\n path.forEach(function(component, index) {\n\n if (component == '$' && index === 0) return;\n\n if (typeof component == \"string\" && component.match(\"^\" + dict.identifier + \"$\")) {\n\n _path.push({\n operation: 'member',\n scope: 'child',\n expression: { value: component, type: 'identifier' }\n });\n\n } else {\n\n var type = typeof component == \"number\" ?\n 'numeric_literal' : 'string_literal';\n\n _path.push({\n operation: 'subscript',\n scope: 'child',\n expression: { value: component, type: type }\n });\n }\n });\n\n return _path;\n\n } else if (Array.isArray(path) && typeof path[0] == \"object\") {\n\n return path\n }\n\n throw new Error(\"couldn't understand path \" + path);\n}\n\nfunction _is_string(obj) {\n return Object.prototype.toString.call(obj) == '[object String]';\n}\n\nJSONPath.Handlers = Handlers;\nJSONPath.Parser = Parser;\n\nvar instance = new JSONPath;\ninstance.JSONPath = JSONPath;\n\nmodule.exports = instance;\n\n},{\"./dict\":2,\"./handlers\":4,\"./parser\":6,\"assert\":8}],6:[function(require,module,exports){\nvar grammar = require('./grammar');\nvar gparser = require('../generated/parser');\n\nvar Parser = function() {\n\n var parser = new gparser.Parser();\n\n var _parseError = parser.parseError;\n parser.yy.parseError = function() {\n if (parser.yy.ast) {\n parser.yy.ast.initialize();\n }\n _parseError.apply(parser, arguments);\n }\n\n return parser;\n\n};\n\nParser.grammar = grammar;\nmodule.exports = Parser;\n\n},{\"../generated/parser\":1,\"./grammar\":3}],7:[function(require,module,exports){\nmodule.exports = function(arr, start, end, step) {\n\n if (typeof start == 'string') throw new Error(\"start cannot be a string\");\n if (typeof end == 'string') throw new Error(\"end cannot be a string\");\n if (typeof step == 'string') throw new Error(\"step cannot be a string\");\n\n var len = arr.length;\n\n if (step === 0) throw new Error(\"step cannot be zero\");\n step = step ? integer(step) : 1;\n\n // normalize negative values\n start = start < 0 ? len + start : start;\n end = end < 0 ? len + end : end;\n\n // default extents to extents\n start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);\n end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);\n\n // clamp extents\n start = step > 0 ? Math.max(0, start) : Math.min(len, start);\n end = step > 0 ? Math.min(end, len) : Math.max(-1, end);\n\n // return empty if extents are backwards\n if (step > 0 && end <= start) return [];\n if (step < 0 && start <= end) return [];\n\n var result = [];\n\n for (var i = start; i != end; i += step) {\n if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;\n result.push(arr[i]);\n }\n\n return result;\n}\n\nfunction integer(val) {\n return String(val).match(/^[0-9]+$/) ? parseInt(val) :\n Number.isFinite(val) ? parseInt(val, 10) : 0;\n}\n\n},{}],8:[function(require,module,exports){\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// when used in node, this will actually load the util module we depend on\n// versus loading the builtin util module as happens otherwise\n// this is a bug in node module loading as far as I am concerned\nvar util = require('util/');\n\nvar pSlice = Array.prototype.slice;\nvar hasOwn = Object.prototype.hasOwnProperty;\n\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n// actual: actual,\n// expected: expected })\n\nassert.AssertionError = function AssertionError(options) {\n this.name = 'AssertionError';\n this.actual = options.actual;\n this.expected = options.expected;\n this.operator = options.operator;\n if (options.message) {\n this.message = options.message;\n this.generatedMessage = false;\n } else {\n this.message = getMessage(this);\n this.generatedMessage = true;\n }\n var stackStartFunction = options.stackStartFunction || fail;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, stackStartFunction);\n }\n else {\n // non v8 browsers so we can have a stacktrace\n var err = new Error();\n if (err.stack) {\n var out = err.stack;\n\n // try to strip useless frames\n var fn_name = stackStartFunction.name;\n var idx = out.indexOf('\\n' + fn_name);\n if (idx >= 0) {\n // once we have located the function frame\n // we need to strip out everything before it (and its line)\n var next_line = out.indexOf('\\n', idx + 1);\n out = out.substring(next_line + 1);\n }\n\n this.stack = out;\n }\n }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction replacer(key, value) {\n if (util.isUndefined(value)) {\n return '' + value;\n }\n if (util.isNumber(value) && !isFinite(value)) {\n return value.toString();\n }\n if (util.isFunction(value) || util.isRegExp(value)) {\n return value.toString();\n }\n return value;\n}\n\nfunction truncate(s, n) {\n if (util.isString(s)) {\n return s.length < n ? s : s.slice(0, n);\n } else {\n return s;\n }\n}\n\nfunction getMessage(self) {\n return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +\n self.operator + ' ' +\n truncate(JSON.stringify(self.expected, replacer), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n throw new assert.AssertionError({\n message: message,\n actual: actual,\n expected: expected,\n operator: operator,\n stackStartFunction: stackStartFunction\n });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n if (actual == expected) {\n fail(actual, expected, message, '!=', assert.notEqual);\n }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n if (!_deepEqual(actual, expected)) {\n fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n }\n};\n\nfunction _deepEqual(actual, expected) {\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (util.isBuffer(actual) && util.isBuffer(expected)) {\n if (actual.length != expected.length) return false;\n\n for (var i = 0; i < actual.length; i++) {\n if (actual[i] !== expected[i]) return false;\n }\n\n return true;\n\n // 7.2. If the expected value is a Date object, the actual value is\n // equivalent if it is also a Date object that refers to the same time.\n } else if (util.isDate(actual) && util.isDate(expected)) {\n return actual.getTime() === expected.getTime();\n\n // 7.3 If the expected value is a RegExp object, the actual value is\n // equivalent if it is also a RegExp object with the same source and\n // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n return actual.source === expected.source &&\n actual.global === expected.global &&\n actual.multiline === expected.multiline &&\n actual.lastIndex === expected.lastIndex &&\n actual.ignoreCase === expected.ignoreCase;\n\n // 7.4. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!util.isObject(actual) && !util.isObject(expected)) {\n return actual == expected;\n\n // 7.5 For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected);\n }\n}\n\nfunction isArguments(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b) {\n if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n // if one is a primitive, the other must be same\n if (util.isPrimitive(a) || util.isPrimitive(b)) {\n return a === b;\n }\n var aIsArgs = isArguments(a),\n bIsArgs = isArguments(b);\n if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n return false;\n if (aIsArgs) {\n a = pSlice.call(a);\n b = pSlice.call(b);\n return _deepEqual(a, b);\n }\n var ka = objectKeys(a),\n kb = objectKeys(b),\n key, i;\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!_deepEqual(a[key], b[key])) return false;\n }\n return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n if (_deepEqual(actual, expected)) {\n fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n }\n};\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n if (actual !== expected) {\n fail(actual, expected, message, '===', assert.strictEqual);\n }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==. assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n if (actual === expected) {\n fail(actual, expected, message, '!==', assert.notStrictEqual);\n }\n};\n\nfunction expectedException(actual, expected) {\n if (!actual || !expected) {\n return false;\n }\n\n if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n return expected.test(actual);\n } else if (actual instanceof expected) {\n return true;\n } else if (expected.call({}, actual) === true) {\n return true;\n }\n\n return false;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n var actual;\n\n if (util.isString(expected)) {\n message = expected;\n expected = null;\n }\n\n try {\n block();\n } catch (e) {\n actual = e;\n }\n\n message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n (message ? ' ' + message : '.');\n\n if (shouldThrow && !actual) {\n fail(actual, expected, 'Missing expected exception' + message);\n }\n\n if (!shouldThrow && expectedException(actual, expected)) {\n fail(actual, expected, 'Got unwanted exception' + message);\n }\n\n if ((shouldThrow && actual && expected &&\n !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n throw actual;\n }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n _throws.apply(this, [true].concat(pSlice.call(arguments)));\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/message) {\n _throws.apply(this, [false].concat(pSlice.call(arguments)));\n};\n\nassert.ifError = function(err) { if (err) {throw err;}};\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n if (hasOwn.call(obj, key)) keys.push(key);\n }\n return keys;\n};\n\n},{\"util/\":11}],9:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n},{}],10:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],11:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":10,\"_process\":14,\"inherits\":9}],12:[function(require,module,exports){\n\n},{}],13:[function(require,module,exports){\n(function (process){\n// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n if (typeof path !== 'string') path = path + '';\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) {\n // return '//';\n // Backwards-compat fix:\n return '/';\n }\n return path.slice(0, end);\n};\n\nfunction basename(path) {\n if (typeof path !== 'string') path = path + '';\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n var f = basename(path);\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\nexports.extname = function (path) {\n if (typeof path !== 'string') path = path + '';\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":14}],14:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],15:[function(require,module,exports){\nvar unparse = require('escodegen').generate;\n\nmodule.exports = function (ast, vars) {\n if (!vars) vars = {};\n var FAIL = {};\n \n var result = (function walk (node, scopeVars) {\n if (node.type === 'Literal') {\n return node.value;\n }\n else if (node.type === 'UnaryExpression'){\n var val = walk(node.argument)\n if (node.operator === '+') return +val\n if (node.operator === '-') return -val\n if (node.operator === '~') return ~val\n if (node.operator === '!') return !val\n return FAIL\n }\n else if (node.type === 'ArrayExpression') {\n var xs = [];\n for (var i = 0, l = node.elements.length; i < l; i++) {\n var x = walk(node.elements[i]);\n if (x === FAIL) return FAIL;\n xs.push(x);\n }\n return xs;\n }\n else if (node.type === 'ObjectExpression') {\n var obj = {};\n for (var i = 0; i < node.properties.length; i++) {\n var prop = node.properties[i];\n var value = prop.value === null\n ? prop.value\n : walk(prop.value)\n ;\n if (value === FAIL) return FAIL;\n obj[prop.key.value || prop.key.name] = value;\n }\n return obj;\n }\n else if (node.type === 'BinaryExpression' ||\n node.type === 'LogicalExpression') {\n var l = walk(node.left);\n if (l === FAIL) return FAIL;\n var r = walk(node.right);\n if (r === FAIL) return FAIL;\n \n var op = node.operator;\n if (op === '==') return l == r;\n if (op === '===') return l === r;\n if (op === '!=') return l != r;\n if (op === '!==') return l !== r;\n if (op === '+') return l + r;\n if (op === '-') return l - r;\n if (op === '*') return l * r;\n if (op === '/') return l / r;\n if (op === '%') return l % r;\n if (op === '<') return l < r;\n if (op === '<=') return l <= r;\n if (op === '>') return l > r;\n if (op === '>=') return l >= r;\n if (op === '|') return l | r;\n if (op === '&') return l & r;\n if (op === '^') return l ^ r;\n if (op === '&&') return l && r;\n if (op === '||') return l || r;\n \n return FAIL;\n }\n else if (node.type === 'Identifier') {\n if ({}.hasOwnProperty.call(vars, node.name)) {\n return vars[node.name];\n }\n else return FAIL;\n }\n else if (node.type === 'ThisExpression') {\n if ({}.hasOwnProperty.call(vars, 'this')) {\n return vars['this'];\n }\n else return FAIL;\n }\n else if (node.type === 'CallExpression') {\n var callee = walk(node.callee);\n if (callee === FAIL) return FAIL;\n if (typeof callee !== 'function') return FAIL;\n \n var ctx = node.callee.object ? walk(node.callee.object) : FAIL;\n if (ctx === FAIL) ctx = null;\n\n var args = [];\n for (var i = 0, l = node.arguments.length; i < l; i++) {\n var x = walk(node.arguments[i]);\n if (x === FAIL) return FAIL;\n args.push(x);\n }\n return callee.apply(ctx, args);\n }\n else if (node.type === 'MemberExpression') {\n var obj = walk(node.object);\n // do not allow access to methods on Function \n if((obj === FAIL) || (typeof obj == 'function')){\n return FAIL;\n }\n if (node.property.type === 'Identifier') {\n return obj[node.property.name];\n }\n var prop = walk(node.property);\n if (prop === FAIL) return FAIL;\n return obj[prop];\n }\n else if (node.type === 'ConditionalExpression') {\n var val = walk(node.test)\n if (val === FAIL) return FAIL;\n return val ? walk(node.consequent) : walk(node.alternate)\n }\n else if (node.type === 'ExpressionStatement') {\n var val = walk(node.expression)\n if (val === FAIL) return FAIL;\n return val;\n }\n else if (node.type === 'ReturnStatement') {\n return walk(node.argument)\n }\n else if (node.type === 'FunctionExpression') {\n \n var bodies = node.body.body;\n \n // Create a \"scope\" for our arguments\n var oldVars = {};\n Object.keys(vars).forEach(function(element){\n oldVars[element] = vars[element];\n })\n\n for(var i=0; i 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

trE zXi6_j2Tn|Vja3U%f6Z{KpTwq#P*sUc053NIvsqEQl1{#^Ro9EUUNmqkuzEHIay9#D zdoYlj{PQu^8UkxbNHCdt$w0$f0vt|G{iJTDPEyelf#kw_-LPg#KGM&a^}6AKU^36$ z_L7DQSJTPY3)@MRT{VthfjW=F^+R%KfHVeY=CZUm5^PSq zH^}8N65QS%lp6#Tr>i!OwOIKvw}idh9hw!RS(wT<{|x5U+m`cQh~1@_lR*;-_s#~@ zy`gzTn5XtRSBHi)ph1zC{kFF}CN0C`Y0G9^zCrL{i%5aTk`!795=!7$=xPkr&A@zs z!Pt$twgltEQN!?e#ciqf-b(G$^Zfec>uVVU}KbR*MKD5>LU6T-~Iap5$1RX9)W>xJh5{e*- zwT*KDTZXWs-E0IpUIbByB((mti;SqB%UA*Xxl!VTS`8V<$69F*H`cPi>@;0z3T~S2 zyEF?&)4@ctuFMcDtSi*B`DK_%Ib9c(GnQ=If&rb1r3 z-|4Jz^|@cK8cCI<&Zy;)J4l~K;2RS7eso?7I7WhZv`jmxaLwr?KdH@7WVM6^Jakg4 z26zL~2^5`3YMGwcA4zhhikwc6%JK`HfTD7)J^JXIP8djPQYeLH*e@qF^DSGV0cw$e zMT^ju_v55KtDeXv+votqz$V+_HdHP>q4O2qSB)$=)dGbN{0&anR{<#GU%+N zuq$voHA=(VH)i>I;jEzoC{>=BLod+tcSG)i}RZ>t^NcSs23JHr2OrcQ$*c2x& z$Xwex-(HT7BH1A~SHi-F70mI`(Zr<=pHoQsW73V*G6l@qf=^Hj8ZvsUt(%;+bzP6O zbwqZOF-rOvkD0Y~n8(c8nr5z%sR%wysIa#7na7)@W>`W#Agy9lD`5~veyv)7cYgt1 zKFn$~bA#>22?AE1-0<5;|CnE|%$B~_uj8+tnSYPZy8JBZAGL9LX8vCz@OrlVyM0HY zUU+_8vgIbJ#VV`oLQjO0xX~>LQw7slGSMr|XX^v$Q;ZeqP`XtJk#(GpWe?|LnZ)~O zfG*+lSRh)RXzsKlghkxKWD;83j)rGib2F$NwE00FMSz@_7AIMZ7*K#iQbT&NPa}D| z&{#n+yAbOhXNJH$4Q66N1RgqN=fI9|7Uux#ik<=!YAd|VM{qPM`3Qb4%zOk6@o<+d zX26YrK+uMD6Sb8&W5DW);7Or%%9sd?q4_zn`!``$c*+TyCrse@n5}nH;Y#nTsygfG zG*3Kxf(oqioPI5G0XH8EPa6r#sAHw)gZVBGi5kmYBbv}H^FBy6bcNQ=Y@JQg$1gZH zEzO!MAzBI#3{r%z`Ay7AWSWWb=S4qWx_P~q&=njK0WpK>w42m3Gd6x@bvEoQ&a*(( z@tUkvb_(pr3$U!S>U_S_0x}6)FlAD46e)r#r?z(tHuHNJoif`^rd?(x>>!_3oJo)b zFk>}|MnGUGi;B8Y-R+t6&K?wn(93R4eb#~S%CN$O?IAQsBnKllB>1v3-13afMb?~I zoIq#|gTy?#h_&pM3tD4AwfT?Yq`el$=J?MgG85~>Z6E@W>3bS_A_mUJF)5nN1*WIt z(bxsvz!%R8mQF@nh=-l--_Q;(@YMVK*TtfpceTxrmW8!;D}QXZ+xB=~(w=B1$$4*v zoz6>IcPHmv!;^oZw*+^Vf3d%~RRO(P=-t_eo=@zdK1rCntXL z?$OVE=#gX5meHw?{OPWTgNe~(+a9L=&CO}^?abRM*;AjZMOp@H2=-osDHbK?{Sf@E ziJy5~G!aV9qlPwMYbBN?=JBj~8pj847Lu>2#cXgHn7s|OW;W1L10cgS0F`?hS>oE* zt2x<>&d=INduAhTH3FJlBToFvJ;@ru9T=ul8bvWu47*_-nfY`GC-*tCFide4re4yw z!J)Hx?Go{2h^cigHHlU8N1C!nS>Z#e_aji$N~18JeKy?GyvYhu*HBg$afml%Rk$bB zz!TLobhIkG6Zs*;S>gbN6w@vdFnyR{WH}tPYdqDi9BxfxoJ2%~fF7 zbf|#b)mAJ{u=!)VnP}QS)@~&IW9>dEn?}-HOFTeh?YMaovH{B&C6?61!fZeIWjg<& zD`BQ8<6Z)m9spRIeG(Wv*20VkXhk%Wy0BHFb{9)%R zvaTnpCPN~RTIre4jD6B(TJ63>>*VeDa-faZ4qK$dfa#$^5~F0^70_Ww01XKvm2}xv z4aK2W9GWT_HErky*K$uq<1K&GYn|ti^zy(P?cb7|hro*2vJpIi%Ub6lKzWqWd3zM4 zBa0ZE0I4upQL`vnqZ-ydjsm~kCkTwg90Yw10?lsPu;YWawBlsrI{>3kU^t0|l>wtq zU_jr!4E%y%0XV2R2x<<3S_Z*maABB@Ti*c$H9^3Ffe=v>1T{fW)4~rA>8?1Fe#sYJ z?*)#w^7tlaVjyGULlrBQ=gx%rkYq)#g6`bMt6jN=sT+8Xi>LG|BzMj# zphHrpAm|Ztv=_py3*psDI`RgSu{msoqfSsL5_UnwhwF}N=cot@0 zbn=d|HWEyXvS`DsbS-@yIGMPglk;&}qsfZoyPBM>Kf@9%wfH3cgFvU#X^=d2@&NCWTOEm26W2I&C z$b_IE#6q9*c&Ie`dAY4Mmo=?j7eh*3@jhha;Ql? z%DK){9Xv2XUDaqM4Hed$U{-XvvBOM&6O+6b9Yomq1br^e$8>46Y?w447}N&=VlZd8 z^Wct>o<`pLlV&eJydWFI7fY)9McT#53)Uw6$>NhqwRE$M6k_YHLA*<6Gl(0Dn6Z%| z=LA?$&^#Iub?JoN*+3wuR~TkjXi#_Fk6;Kea{tJ%jnsP5!0Lwb5C@wqFOwsuZkZEP zcTTnQPeiT^u#9_IqL@uWF|9HQE!z}@4uWD`lh_iK61?SGqpa~dN+H#=j(*`20AWX@=H96O2ONEk}| z)3m0{!pzK=E~`??3lWtarFAF`gU*UUr{#8(wS4Y#Y`I>t<1!tBpw`WR8dTFVA_ra5 zgRbeptZ57=Yr6Ryn;ultEZvD*gW{$^4ZW-=F=xRj(I3n%!vu~Rs4qhCcaf`}e=~9w z-;B(IUGIu-_O6@geR)oMSA4TNX}iN7IMV7s*abr!xJc%I|3LcKt|H+9W{SNlIGOzFWXB49prcYt5n%@;G@MH4391oLFYiCdJnQs40 zB^}k{QJJ;r{Un&rB}}I<>}grkxYMij=x_8?dW?juQcXXD=Kn+i@q5bKUZpno`sh?X zAC#Li{cjeph8hU9BWYgtn2ep983^)H*Fkcuj5et<5Hz@K@zqP`sk zFByUl2hI1Z?jxG^34GW|4@WrQL!XZu0e(^p5(<2>9&-^>+L~)q+auzS{pywa)_jlP zafFzjoe=voff)(5g$*W2Mgd%e{~Ae~@m0fyqGFh*LD0(YC|JhYP3s!(LdoFK&{5KW z#wU83T=~Gh9#`UHQruhwu&Nine27BV6@*5GT#KSyle9yuQO3;r?Hf_Kh}{cml66jdN9 ztp21p1BZ6Ciz{k+UFVJB-=IyID;1x(Jf&#J<4O4nJsu(6Ll`#FPu}!w%A<{}vS@7`wT1+MC zhv}D#5aKS@fDO|DV+YE32)FljN@uKbmLX+Xc#LJg1L9NG(AYX|pgYQKjV2J*ohb2{4B*Jg>Kre#Mc?w9ehn< zVIqXE$Y|59qj15RMn6@SaEyD{t+$3L=+-O^{**)5Eyy|s0Cc6E8s-JU5no$;;)dXN zN-sX5_^1h#2a8?oqUTkaqxRj#+CP9W^%;i~`)Ar`2$RII@0ggtFT zK)J`L)o1KDi5YmXC1?|sXIS~lr40C-3e$LcBp*+upiYaU9`5C+109Y!g5ZgxtpD^| zy*BqZBU*{ZHD*pwP|i4zO8#sV>*!A@ULu-J>$ogkOgfWAw?XKPKiz1yBaa%OkxXYu zTWv$dJmIj$i=2B=kkUrItP8IYk|!ul6-&oxfbL>l>)ui0$P()w31+Zvss9b?I5F#H z)D!Ev@ys|RV_j(q2rn)Mzs4Rs+6Zf^?}*=6KthLC%^GpMx}83%%57nNDCgCn`SLok zlU?wr;=!^CYUZ3HgLA)3^4#D=E)sQnsxUZ@oaWHJ{gXYK_kI#Gi&^@%7+sGC8P%T( z(!R_(+h$SN_cLe{WI&`qCfi#2*9#7#$pj-z|Baw1rqU$?PvN;?`bRFsnf;dXNGC<+-lu`{ zIykX9;P6aq6ocFb?x{{cP;I#hGob>V|i1yoI#7z6y_Jc6}G?Phppb$osqjV|7@y8*Tl1&f1 zPoV$6#YH$O25f=_{B6cUaZ}y{_0mo>D)(~)t4SRyb$vOj-tI6RnMf*jga(K$Ia8nJKeysSpkzmBU;SrV>WieijCS^L|A@?1OX+ zFl7N8l{|oBAO5gBfTNP`Q=Z-c4hvk3SxHc|M$<)WSXRv9PPB$K?j_AU_~RzvVatJU zOS!^_0j366!LFqRbPe3Z@(+i&`uhp&;<1sAXa$qS0!?%H5DrLit0<#hYnTMi%y&9!|BF3RO_Yecy6-Ynb8$AfS`5YUA`SEiLrD0b&B>Uc7hd zG8)GTyI607&FN!D9&v|1#g{eMrIBa4s&O{3OlGho@k6a)09slGC{AJlwA27vnha01 z&lNB{CFcUj(heZ5T9{^lB@UXX(HTGK!((kr1yyiSUMg^ORmeq7>ef)Ic}=y|FBEBM z2Nl__CqsPD!LhdOtsp*nEn75V7P!bE_VIHr>es4EznF(^vbHC8Ix-FdSbRwzgluq+ z(&d)X3NIGOUK%9wg};0q>1^O}lr_ejbp_BO+8op{SmBKrC%!sH*QzZm!h%Je;a5b^^#<(7|7V2|Kk#2nMC3pk8E+8Jy z*8P_z^F*End=n=meQr7aGJ+l)rH#Pg8AcS>4X~iTNPn=CtyB$ZwSBg5r;LZ_3xaPv zq^&&)d^!~tf)w*JCJKlEOX^Su@&TWpoI`DOb3DQxVn4)%4+|Tpv3l8NT@ZgjGPpJY zTm(rg-6lw`8%PL(R8?o#{BWKmh4rr*@gMW47wfi`oTb0Ki_MdCQSOxI(8Z3FNP!Z3 zBGxPSbMg14pUHe!v4w}D&YBy4bki38=CLR@7bP{Z|Bky^Z`q>aV2PY()6Ky$IqS2N z6TNt<y zy5rjVDRC{qF6t&kkv}b&XGhB=oSQg53;%E(2DDP71>7zKIEAb6Su*vURINo=FuOKs z6BLLJl?$l;WPx`1AjJ&e4J|9r1B!;zpbarP>QYc(Vm$1RWoE)qGNg6%cuSIN`^f6HK7SD3qC3t(6Nty1QK?=ll)G!Bb41q`vMeUE zPsAc>LLUrtE`Gx4!fceo!=hatK2@=oG_i4-xe&|vv>j;MLF#YP$OvA-D{+tp#It}K zUbcpU)rS0j#aLu^Vt+EkR!&n=7!8wFfeW*!Di8)AyH#ls7X8%eZvgvmpu9F-5lNx& zj4aNA4X!VB8(dw$1#kQ1Ph`_-;4%wZWllM5$A-lz4OWbZjDl`#e7(SCm#H1FK= zfrGZc!<>`TdSvmN#m4E}IT_f|JjGg&lRa%F8BvEhod?NEwR@N#aXfdqhdp+ur_9~z zgP)R1v}iR>A11+Eq6P*va;60vTm+Vm1;~IK=lsyjwJEu?^WZow&C4h8>OQHsG3;IL z@04S6TG?%RKYKlmhsI}q+tp4{y_O=>cu}|8KX%A!W)4r^r9a8CEO;xmGjqmPaZSkO zgX-YD4ud@{ygb=WjW~TOqef9pcCh)}=-vKs7kUZ&AfXGrEJqlA<(=ihg*60gTDFZy zX!4t9xg0F;>7n7V-|9ib<0N#UVKd$6#zQ);lN20a#(SDeGa$(S-pT1?#rd-X zt+B|*$WH0}0kH9Rk-~w6p<`KhBCtbYJHl5-o#NKfsrT&Iu`fx&hepGDx4qi?x^U6= zO7B>)2myXLz8Oma2F|df)9bcpGTR{)8N~W!CPsVMLI!SgB3Q|gQ_0A>&9FNapP%86p}HuQ6U4l_hWZ0J>S3T6sE5gd^z^}jcv<6}@~bzLMSs9LaXg_wS!^Nr)>VwQ@q z$gGV7-uOC&Tqi0675tWISNv_dyyka?U(Pm_lWPpXb{CIN4A#>hJGnS|9FitmDdSqKF^ieE^#rO-J# z0*Q4`((rB@@M)5fcEp9om#b{m0S43{$&332yRiZSzFSyfcMA>VBi8p6DsU`d*LIWQ@|sNXQmiMePn> zvrbf#9~AY^V_lZa7!P`J3N?AY~DtNX4$+@9;rWcB>zg|Fb2=P+Q&!yhIRD;db z>D|6gy{PA+d$t0H(5iRtS1C`K_)dDg($A7i#y(buF~^Bo$r zrgVKOlVR|Zo)mfK}5ipA;Vo+tb6FKgO+r%jr471;8e7G1?SwpuJlt`v~ z+&)d(E2ZpGo@L>FJAEtE-5GhT4`aU5O`$aGPCNMkiWz7-yI11bTOJzVs2@2ltxIkN zl0KqrndGq&=hj0RYi&K$<>LPdQNO!a>UMz~N!|U1HAB4?gM}}o?of{Uo)!Im!@4BX z;i^OuUb!WGJbo@LLkKX9OdmS9084J;e2xo+^Qj~r+)!`22rW;4r&}n*&T_EowlXjQ z$@_Dz<5^r_%mFVDXfih|kkcqvuz+^qIx-2g=SC)5M$h0lp=8cYl;gcbdHMuIvF&}P zE@u#hSEo!Aj(XM7q3bz1)FJRWE0$dk^@#Ic5;Ae7sV*v4XA$QqvBPr^XW7VSTAU4A z&sCg}*)DO`!0d)E$HoQw&@GfgffeGN;B3x2DX=0rZ z)7eV66m>ROXD~VC9W*UAGuMgkU8$d%zdBfO_~c_?Q3IHnrKcr&A^O>Dz~J4iK|H&simyX!B3& z=k=sK!KPx5BAg|nQ+=??8!t|~UP$rNT~l@pfva9NvgY=?5f-VT0A zO75j<67qVcz3lxv-1}zF`>82E%P`?G)MjMJTiD_AG20H!DJsy~c^p>vR{} zEV9~|Mr=&??O|#2^Ub%>_b+%?Y5!9i;rC9baRh1{Z#V2r&7phPnq5zt_kt1~SFxpC z*XNR?p^rt$d0Qq}cpJ#`HnzBYXHRI+Doe%Jy>JWJCyIO%My8t1&}b#2eu|4NJ*0*& z_K~@<4e4t(J=8wy-u58T4lDvLq>niStt|y)q!$ejWDO*X1c43%9lEF7N*gF!TR6*5 z-DsU};J37x_{UkZ96Gd!@Q9(&$#;#uW?R2^|bwhiBW%| zJ(Qfq!68xlzR!DaKsuxJ2~R7DQQCK9i%p-kuk9_H3YDz09`zO+=hyE_g@{_~9x*};U?bCb3He?y5KKG@IU4pXo z4dj0D9pC8ji|;BDGQaq~A|dmOPZtT9U;J>9aGa;~qIB0c^GYB65((#~+lh`a?>kiZ zf|pLIfV|UKSi}ydyWU&Lz})e9;$Ys3EORtmm5s5<1jiN(B@6Cp)maaPt8xAJk7aJ)-=yM$LDF-$qMu2ZL{B)l4Cveo|wbO3JA@AYHgqa0OG#7UptmK#e2! z4aAJ$bq&~=&siSSz<@cX0(HI;T7m!w&qN|i@S&ccH1(!Is|)UF*RP>9_kxLx_T8eb z4Xs;{o`DJEmYjD3H8&0^rU?oxNGJu1&`?&JdH`mZ(4lj5qDY2#(9Sndx<$RD7{~{4 z^MG9i(5fJANW`g^5Em)xQAe+6guZ`u3#0+4@PyyX{Zr-|8%72CLbCK5$JE=?p9* ze?3|J=2Y9#2gD7o#8!hUPK zY~>x)}PQ+fB4Nwg;ThJ0nJBW%q*fjoYCdbyUnP|%e~9G6BUU0`sna&Y~GU5+ zLJ|YGi47*d=mIP~J7bv|FSX;BS$F27X^a4^3PRWi*z_x=jMAO5W5)43v`leDR0`rtARA~^a|%?KiNCGR%^zTHM8hG<1-44Z#y0rY&dh`iMy<~)147U2T4@FK#kPg^lT!*#?-CCSr*y`Io5VpILuiJcXY;|0< zJ>OqxlZleF0IAOI1B@Nnm-8QsW8RV799s6o}e=b1>OoE6l zFm_K=&0Z#HVkg5ic@q`5fbUzamEF8PDo%hv953H8p1elk2|ma(eNx7ubkZwwk<)%z zw>o70`Mf1I35&PbFpLY$$g|a#Tkg<|8=dEpqT@Z7e!7F{Lm8&c2aiINNI5yVCd2r( z*@o5v;VDJv4^Wtf7e;dx^{6m<#E=0zC6prqhH~8wjG_siP{u>7x?7&3`gW9JuzT~1 zbd)WqbW@*C_-lxGwYSZOO_GoK*icYf8)?VVmq=9^VptcHARJR&pcc)YQ%g0I-OeLl zX!W}_8qys(kGl+ZP<*_NI9+|GoPLM3YM9`EIp1h$} zn0f;(bgWZ3)*^LqV7~f-eCBv6fuP|>U69O+1#L7kg=(M!ODD71!vn+#kWUWkxxnHBy4@TyW}9X3mNU!Gxevi4*&`N3A!gNeu1--U z8ujx_b=WaTV4p54ZW4SON$WY=zyX?Hof1i-?GiAxl_3r@=0zL?D}Vuw|B^a=18Ai| z)7$t&IWWF3Iu@(n_{B-n%FBFWNF^h*P!RE$Y7NwuF7&j>vKV1sVsaC|nLxuk*`vSKB zi)kEi#3^#{KiExo(NCQ@8(rjGr){i;0Yr|2jNw>g7KbB|yv!{*d$g>_#vqUT!D^9C zY%)pRyEPf=u!+d#uIe$;zo>^z9BY7g$0oKS-MOj<_;#R3+4>{Xz-~)`C>G2h+K<46 z3_Q>TDjEym+L3)I)}xR1?Wj73a^(O1!r`Y3`?3tj$sm5)8koL}Iy^Te;7ix_K!U|$ zHn!m~C8xol!*leyo9EQCK6p-_@Sb|F!N6_V;_(U7MetS5hvs{Q#WUJPcnJe~Gp!29 zf81xR;qz$)Q-Us&HV~aj*R-UIE%=cR6y!e)t;>4orhR3bT=8nk@j4mA>txrF<&pYrO9~(MiTyul%Eq9f71vD!>D!yzoV$i z=*ksU54t#@+WV@S%TSjqEun6j+DZ4Mz(Aw8;cKjJYX9DsP7kZ-E81aHcME+5R%z5J zGHTBiSs(+4R=-3E5ul{S42c;=HH7x4vA}p`7kDu(ruZgzayCeIB8DOq#t|}2;!V#Z zU+}jny&dRK8x~VE4_dDi=jX;c3XEh2XGgY#a=s}v8v+@4rC=c9ThSXqJ`!%vM?&=v zvAxc)$Z+e1A2r07_ZZo1AuMvS69dN^e$^r-d(OsXe%L34J3v4NIHc zq=CsD%3dTBGJYmRw>!HTydx7D5&&z)B8EV9zpOd9d1{=t*D$e-nNH&!i_^bmYO0$3 zi@e3MSy&ui3~JHkX1JYovW8jaiqn6wDR7+r1M^*-7ypl0rRt(O=%>H=m(w1{ul^zT znO(--tO9uYAJwf6&6RZ;-naQ=t{iu!`ew@Y8z3$K$KhawB;GVao#1wdPuJLkoyMR{ zcUv4>7NkEFyvkq9Ck)c$*s`v|dsR3xNM{tL9a=1v#UAZ6?4tAh)N9@;a~1|>%0c`3 za=)mQfua_(nO`vil1VNZt#4h;OE>Lcw4bzn`=UBX^iNi?na7%Y1*cH4oT=%;%sn-u z7rd*FHGh2Wj_6DQt?G&QWp6X=>k+l79@BSIA7S$oHpQsp?B)f7Gn2FImaz-4iX^N- z%DfmZ*AqG>^KTGtP>>05(fClcAbU4ze$jAtRKpUbkNE@Wl2sd7n{wq{X`r^VCBc_XSH&ki;7O%u z?bx41#BE}po>azr@I?$DbEjA2HR?c1QOUK<%M|^ov&+F~^IJGvn6rSoOdybP7pa(! z<-C?0gS6&X1BXC~B}r_nSe&_HoB-wWt{Oy~!<6}*z{QQ5vx7=9&EQ$%Moju}P z1R-Z;0BPfIb1ntWlMn*5>y#N86q70o*a|B2S3rpFn-nAtYYuYEJ2=x2p@QsHbTQmn zpUst&y{3MSPyu_|$Qe>GxMpu@p?jE_H2>Zdt){xpV}ZqN&B5m2i1{;JP>aWX&2_)t zV1e9DMVw~L3z_S}gewC4U<`RSSO!Rk4}Lm(A=s6mbM&5uIYMb4cc(>|9?<+m2x5U| zC8rPacKXvAi1(^C0!J@uJOBQv0`WMX`YSyY}$$pN~UsDidxXAqV=`##<^GTeVI>^(~ zx{feY*ZD6%e@u-%sKc}xI>;PU?aMHzo(p}VrInEPDNHXg(&SZ$27dFC*4uqPFylTv zI~7w~wK6z#DkKce&3fz@PvcfxKYJkMlqGgArKnf{O4;|yQB`R_9}8Fy=41Xq$|2)A z5r*TN8N1mY8oRTA3eeLRHP2V=Y@D}N9#kvVn)6}u_^{MrgOWPywA1Oded3ZBD%eCY zUWMJrI(#Urg>i+oYHBel66Wr)PA{d;|4H#D4#Sr>>aH;cSBK!g_6_y8zy}>x7G|Vq z*eaza2`;0n54XG3mo|;;j%ry}Mz7vFhg_W(WOdf<02{Ymp#vkAMY%fXmFmp0E}vQF zd{^hCS)JKYC|WHl1NwR@{eg1F`y75&Z|DHI5Ts#d5wF)%_*x1-l32E!e%!HIMb(0ZMH_jRmg8o22tzuJ zZ8r<#^w+Yvoe{J7F3r%@Ucr0K|5J>C*hHvT)LU$UQ<9w)`J}c@@eG(QQY^+E@utda zX1$2~sNQmY|2eA<1&p=PC5C8Tr^T$e$sk&1mn74{vr9K=O2;^559Cd4ZR2w);xK2y zL!=4)8GohsD-`2v{Z0lTzN!|!R_-h^e1sX11uiBGEW0oV4boB#A1R7VyBgBK)}cyS zeznLlv)Mc)t7iV4X>}6=g29q81BE7Ed+ig`(&b}MYW4H(c%y!RD9^<@Rt|_;;6sBKQ^KI zIlk87zP`RnU$rKyTysl$V7^Jhtu$?D{)J68YjMIbt-0n{+BUzU<#y97tjkj`{kUyf z^}CD9&^xupFP^1w#TuMi>Dnx%(Hf^%+D?S+fgE-_#nKjA(^FdJ@u@+swMr0XJ4U^CXE!iMFfkfybtv4mY7mr}l-Je&25oyf_}B zM@ZH}h~|%QKR`CWVM|&ITL=bLVaw+whX7zBYTX^yYJMoPwO0+ET}76+udCiyyLwkyy$esj-fv{}GCFqEd#S5;`CRqRf@Ooa zY4LEvZ93%;8fftEs{cY)|A^H;8$O^41F;<@gt$*>BBX`52hiSk3OJ1%J9*|eoZsmpBe=`J=}6f0E(|4=g27*uZJhwU3Wn(9k6_@?D-~KaGTSBrWa-QlA=jw{#t$}6d<-hAgj0wgLQ|&nqiR1 zgX=d%#r-M(t(f)v&;Fo38BFNRErtS{^`sAcKvR{($zkt*%?;7b8wk7!Jy{_*O_~65 zfu{cMMO>+NZp!lpBj596`+F%KC{x#F!?Q5s&bxK@)iS8bDM);Wr7}XI@bxch{(D3x zC@n<-DpLQBS9(77kw9~;YJ%Z=+Vq|^BBc&Wn%@cu@)L6O#DJMsLfGO*Uh8E)H>kR5 zsk$wl?T7|4O1>yb_wkclu6Fflphz)5W52mXQ+L;i6~U!|Fk-$TrqqNxv@{|*v-JWH zCNbciRQ_M;zG={2MQM2`&F%hbzJ&OQ9HX0I&c45Q8RM#v8gITwjlACimeh!*r{AMS zICB&R0yVgk5!z7dCjx19_qtSfLi>in=6`WaZudBMG7GCYlI2lyC0%B#tt&%!h0ux6 zBQuyYrZE6?7IqGl`6}?>8sEuRhbcC)62fWMr}U4WqT%!-hn(s5 zpPzQK^i_F3A$8lQ_qc%-PYX~Z9Hga~VqWx*t+DvdnA2)><`VpF_hXq1#yTV+-%yx~ z(o%Qu71b_5l1W6~n(q`ScINV+Kv~WD z79X#cTSZ8tI|w-Gp2_kCq|!JAdP+IVKQB+$-T3Un-2V1A|y3}|KdJ~ME- zi{d3;8Je{#L;Gh9xhKFm2ClY|WLB-Bg7{v>d?;feV5N)n*oS4Ub|@-rSbX;OlCO;vEp-s7$GT;s1L|^}DN4uRmRldfDvybodPD(|gZ^ zKKiYCqJD^d6Ekblsh3ayjM58_{W8is}`n*d0o~YFC3p=$Y6D~7Xu{O+7 zwY4k~8H#1dUIeVy|4?_hdl`@o$so16jV`@S=weBXH{l<&_K%2&3M?7a)I2M&BVv-d_y2JDG5 z%u?=or3$*9SE}C=rF!`L!A||2D%Hs~-wlO&d!x~QJ>eSJ^t(OcVFsn_xp7PqW{0WJeAM)ZJLiKxioXvYEZ73PH|OAA+NS5wS>ZrO2G?e0ZV1{Z^ zZkn)r(WrF>)ZovY2{m{|4A6TDHF#13^cPQS#opyU$%_3iKEGoBd=S+4EC}ksfuK4W zYm>pznw=fP(O*oiK9e03s>4E`_3pV^+dtjWp?t62!!fMcQL?qIr2F@d{)gq{U{Sta z$`OXo4sB{zxo?oI3avrXvg}V&S-YXl3n{U^$E5z~Nj5R^bB$L3Tg6T3@4@!?!SqZ?`Qv;Xd0 z$p#i8*uenDUFbheM|Y-YiAqddHW1amg$4epDWGcy%@_09-TxbCdcz%?x@C{D`${#i zjkY;YoWzkYmb|TWstU(5OmQB|K6#Kh1;pQ9WAn3vjB`J<^RkCR>isEDNWtpB^ROM$ zM07Db6uGTdp{dK?(1>UYlKhB3)efbt;I+gDM9#aL_xGW}aaw&#d%$lXPM z$i1O$`+_;ikM9I`T4b|v)lTCcaS@v>xfsyhh{stqWF*db1L3a)r|l-%wN+7kew13p z?v3gMMw%_yQNVZ!`UNIbI_&Ejn!%=y5v^^S)Ahk>m3SR`s3T1TN02C_I;%eeLfBI< zsP$6lW!!tcViU50?(eIkEt`gDgS4J43@x*F~GsO741@RIT<)UW9`KG|M(J z;hSA$4@>BbHQ8aN-CxFJ&8zu5TC2sz6(Hoz7z&mz&gSB1gSUQRMuGKXZb{5-wt3R+bVdq#X743!r9Xi1?LjC zuAPE9#!=IHFwOHwn*(%oj%~XFJ92aK;?3#ex3l2sT@kShh)fk7h7y}v!Yw+vw5@%U=_K1ab@rLXP;(x- zREJKoy^yY`lj1>QtXpQzdfF-O;bIaWLTlSKSG1+QG}@Bdmz45ZnzB};G5}N9vVny2 zsXWwJ2U~%#WyWTZV++Mieq9(0wq_~du%%oMTa|8Xsh$j5h=^e;5Vjzw?e}SL@1zTt zql2JY8+5#M3rRe)A(UHM(g{6JaYCmMjyNVdzmvf6Zm!F?OKg*~*XxygMQ{Z<73iH2 z#O-9(9x>2*DW|GW`8pvkRH**7#C)q+ED&qbc-5y5WMT&MU#O6H@oXp1wf3#FgXbsE z8`>gb>3NxT_ATG_GowsVWuE^hP-^a)6$REC?Fp>c`2jEvr!$HdP%akmMX0?UBU=ur z*B;|psPC|q9r-uQd+GmDvSTh;{&ctiE$^^xk-C;Kz-Ai;nLBgQqW`s_Q|SJp$R$QK zLb-kTKuiZvhr~zflt}kV=Nd6uT0p;o?Xyi2UCvY0b<{Q^eZ6W&Fi5rF{fky3uEFYX zHTtJwf|?zK+ozEqv0|S=yP~5$62`2|tWx@hb|2(bA;;I%^d;JrT1|i7Tf_gq_ttP2 zk#CDW;~&Om|A0f!1bH2SP8PhRM@SKw3A13I6()4t`I zP^MDz8IDeb9B{TU8=B-B&$ds| z`iK?~I?Kd{tqjd$B6d~13L(V+hf!6=wL_f)7a+RR5V{jr<&$wyx?xA9ppGHmOmaKx z)^2rUu(bnOa~cavB2pKft>QABp=eHL83A+;U_^b5qZN*@r2V9-q=S$9+6fLx}0U%N|pXZ_6%`)lr-rg3NJl?@^sp z*F30s0H@mVe`j&*pH-j(H(g~`LMI(7Dx7~&Gj8!<$!JrPNu4KT#|ITB;Lz>neaJF} z+*ynce(u}SCbQ-)Mm){Ftapn~w|9%bTfLK%yPmiXX2$}TJIH(WJ+G+j@2g2DI93I^Z_n-s`CvZ2fDsFtY@;&*^X}3{umxGTxOgT3~Z`i^f zqz}@`{(`gHaEzu0C*tkZcqCjkoY6R=o1YFL3MV-k+lxsvPd9Q&QF2v`LgskT3Jxa`D8aT|&is-SYZ%Y#oPV+s2tbjfkf! zUE%a`P@3-IU-O^cxlcV@T4GX9Osc95>loz38~E?lAfBwqnbox0lXw-Z)kS7MHqLnK z7oMc8QvAd1K5i9i`AMIAR1I_2xC2oFTuWFMcPUShdYX3kQPm^IqK)Z%4$w=(*KJ@P z6m3rT{;z2?1S7--ES5j}=pS=;(1JV1(tjsWS24);YW|Gh>Q5>&0MJ;0?!Y~c8wxiKSxN%?S>Q}EEe^o?UDXzquu9LF?J>uw``jjJ@kV+ay9 z4YWc=?-(JijrLEqeOXLX+>-)2HLV*UUw^9)sn5oEawh}ez22_vN$=daW)rO8FwTTM zmNV-zrmRW-o}^zD^(m7ajD3(%H1u67))@C{aWGr3S{ee&fSPO6Y_IxN4%;xy>Dg6# z-yYab(B`%K>?-bWcS^ddFaymx?9+le#?&2nOJQc%xAvo(9I$N;bGs6tI1+{&@tP#s zwCRrVth;P`s*OJ3(F?GmPoV{ra5s?Jg8|Ih7=S11ud)Er1Ctxa(wAO202&O+nl7iI zk~c+@o$mN;;RpFKpleAV&R)wTHl;S#HGtzFGFe*nA01bPa10JxcOVYN*h3RC>UDVu z#~l1#U+#>a;&8X<0^LKwRPejvjINv^XLN-V7CX-9iaDbzqa|lFo5qvMtNeHHfiL=Y z=ZbzS-|$3V#|KyF{8y-TVm~zMgE>nzLRa9-{GgUo^+L;`H@6qMA}_RU zeSejo2^Bzshnmg=5*EpvN)aPEXYvd3pO~A4J?9j#kcn zrl5QkX?$FWyQG@*=Pq75^Fkw8$;JCxb4y!&MOB&WI3qL7EzDZ57aO|>|{#a!k{x+bjlGL z4qf6-zqq_wx=y0D2JKAoANIR*YfHjI?_O;<7I?% zZ0MA_;Hnnw9snHc$@}a`tIQKE7IXgg#p>VE=0EweNjTq{S+-8)Kx%CU;tQ?9o95Q$ z(u=c#bsZn_1`dDDz?N^%=OkIYD_MV#C!LHUUxb4pU1_Hi<>0}aMb81%<&lw{^?V9{ zu_Kqd!=W6_CrX{c4mIa)4i5*qvRtL!=o$*(km84zGH`9@^&7ZIj|^T0sL#~XC{61? z@?I4%>0=VkA#@_N5cLb;K-+f*D(WjQ@!#YbRo`l{H#c(uEIwepbNHXx!5$6}fdIjH zhN|jym>hPri{3UzwIODAIHXN{<-QqZnv|1 ztdC>-OfT%qeJEDxeVM?Cn^tK^kvk-PY%9~BY+|hGV`s+rfb4GP4dGS@e$5*qM+51{ zB#V3XG;I^~o%BibHkXjiiZQ*Mn?taZPe^2#a|eDyEjN44YLNVqovW+3{-*h1if|b= zGkiHUO{|R>1JqCY#Oc7yWd0;DOUXI-obw`4)0)hez_w|hsfgxhW5q|gZi`q?0%U&H zumG0K*y+Li=enb^OX46});u*fTLy=xjCp3vM;v-l`~47nui$j256fz#4p8qB58XehVb6XcU?;u+;HToX_8 zjqgtgPID0;K77Bw2!$x=+&d6>~P-?eg1&it24!cc=u;A0w%7JOxXjDl(o@vQYyZWzGp<`|}K0fr;wh zxU=LqI8K;55fk;g`%WspxclZns`bqLcpWAx{CJ{p4-<8O75@(;=vQ~%C}uFsBwv{s zGKIH=ZufXwe!k|%cAW&v%P|HF3Ux(Lm+__fTFh+H=Yj%O>#!Ystp`jo5eQcY{Ne=h zuVP`-V{*sJDHrm+o^Mr*c{Gf!231^$t!t1IzeojBpW$4msB#sxjtP(DUE|oN^x<#I zUSFJ=a$>;gdg;vc#i_?(c}vx>HO_c>Wn0%&5O!j!GznRK0;=G$#7}}XmdJy`B*2A1 zxcUkkO?0V}bucM1+wiL;8tfoyUW)=L3jIjKxPt!Jx_}N)WvFMts>O;qlXVbJZ9q~T zmhl?P-qJ(_WXj-7KV@PTr;l}>@x-%+&ui=Va-M#gOs}V&SoWORU_377=^9JaL4H@; zldjmh!rDx^eXgjyw;|Oh00fJjIUA2guFaj#2-kDAd0o+_Yh6~MYh6={D>OrZ3vhyf zX{~L;eF18zMuM239cm%H;@oJET2odgH)0Ezi1o7;bYZac$278FYH7VwR;HHY$W+mq zI0vG;lIc++2i^vY01$W47Sv&piJ?ghD#E!D>NT6-DXn@dSU^q&#bF)K=-HRnNzE!? z@|bW09IL!CSXGWy+`e@FW>%q(dz%tZRgBXMw`guG1JhohzEba$t(wb=!n3WKK}CCVgyaT2+Er*+#i&wt68ke{fr;9K32yAq&O> z+^24L%lo=b-p{gd*E{#O$GS~ECW+hRIn8dE%b=(1$KCYK`**na+$P`keoD8=TLlv? z1GmZdWXN0KHhHxW&B&15CeMYt#jE@_`FM`|-(e?r|9f#CI?Aqd8T?>=!TS&Zai6uj zBi-(RZ*FPN!-7u+`PUvynp{skNEXFP4iN{rrL7ke$-FFu@)8^Y53Zg71uTMANq94#FXd~uO zLpUju_#w(AgUwr603Cul+(AC?9?l^3&B@YY#9~?4)gV=#^leCp^lWR@xm8Eu_!@OW zaGb=qw)$al?t>zd0qXQ`+`veON*m)Q@#WkvOx_99OMF`V(oJQc^MEqsW!g@ z3iKj`R-0%?4x<_qnYqN=Z#8MPnatm2=YM+^2tglwMF~ZAQ8?$P(#0)Y`fWXuTZNmv z;gAd(JoHw*g)Nj}0uM>kFk(8CDs?S4|F{WWLtB0=_x%N>G!NXZZ`p(>Odrm_9jf{R zoK~)LokQU&p#RKG+YM)rqwYBkT4MlDj2Rk4gfr)aK;15s5!|-mOy3>gj!i??Ly^{n ziJ<4@^tU)IT;s0;#asvM>O|2qX6XJJ;-autppmWnRkPuxA6q0CW90xP??x0|EkPU$ zBLMYV5nM!8nHv${2|%R?3jx^};#vcQq7_c?bP&W@A#5iho65U}lYWgo(3L?YsgGxa z3YG&V5{xEOsV2`%4Xn#yr3f&Zi8YX7O1+M6)-|dY!_cN%6~XaoaV4&k)GlbvN32d- zDc3uS5HyjYpD34n*psD}jgd0m^o*GkYw?U*2(t(?b6mb=lkyhhV`$@J))CN%WL$>K zRm|`L{cwB|T!n}z+(+i2Grm~QQK#|M4l{Pj3%~45yr?&1uVl zPZYRlekWZP>GdR@v>Ib|*THJq!`yFN{^JYU#rlWq06!2?Gtcu(=6pqHkZ$4M_I5E? zVj4_mhTGr84xCG$>(94!^KR9WS+ z2}H)O@G;>_s8xmiphK)s9UblL!8+BLJ;=fs9M58BAZ0*keh!qS3$R?a9f8|bEihI( zqEJ`ONt7Fl@OPFNNExAYX3}8Esgx6KBX;~ zP(WNBnp^Ec?@IHBytJN}k5;Es$t9x~(Vu(!1}n1&{7Xd+gP@%>1a4d zDRyZK73oVFEI{jw>M8<=6u3EdPG^x^L_~v>$ZWxo{i-b^B=jm1l2Upnu`e3bwI}^j z8%A6|eLN%XZ}j=Td zA>|wYm*1QA(*EZE(BxZjSMpNG%TpgqkMgSdDO8@`XofoD4Od86B@cgwN@{afqI<8@ z-Y1kboIC46m-RQ5HJCf=0+;op%Gx(~*7+{$1Ijvghq?C3V7*^iPtq-}wN$sZpF&nh ztgP==)_87Mb%7;W-+2mIbzLP{|K$L+4$WPwuB0UESCzFncUG(=Wj(5_b5o0aJ=}4S zLgE{{)sjjcQzi8|+nb{jyAsk*f9E@@gpo?!`J^g23F=XH%DP)w2j>J@b3JAKu(DR? z&WeUr)(4@F^pwvOX(upPQf>nU(e5m340MBV+TB zw1vf-e6bqzPlmN!wVKX&Q~nmx0MK{~;@x8dlxJgFy@}DMN`dGf<-Dn4F;> zD*h#wTM_NF!Axh1X~Hw2isH@WjyJPhJ&r|7#Li|nv5~>gw>zzxss5|TtiWMey%gZ= ze$*U|QQ|ztDT0*L3}YveAgJ`1n=S3%+F@$O0l$F+ZH~j#xsqOlS#TKjV{fObA0GxI zQKw>UK2gOF*}luI#0X)MUrA$b)ciDMCk}x&jZt&X(hHEH_R6F#Zw-T63moC+Dd1)PTY3#@dEk1?S;RVi466ZX-5^ z=?VW(kWgTeXs88g|CZ=SKqRzuvKxy&4z zoU5xY?B@iTniAfiNnP0Qq#E`^C4>EPGIhjC2K(h?)uNrdz*Jzro?~B##|h^P@$jXd zKsUsI{T|eNS;+%v%#jSh^u9n}&+nejMyWBa zCGUsZd9_sFimIQhB*N!lLElW6G~Ns)$2!Z^y2noJKr+Ts%huw&v*q}~r^{hv1~{18 zT-fkuSQMiS4*aeJ6WwPEcx&CP}Fx}$I?q~FT= zhi*P*PHP z!VbwX6w@%pm}mf3#Z(GK?iRa(70DVYK(sEqLn}r`I2_%O?~d4NB58~@Cp zD8lDrE%{>Q)r*tu+^Zk!xpqaJ8Uw!IO4LqhsR?~lkM6o&Yx#gKu{GYtuP{T0M2>Ci zAfl9@dxc;u8eOw^}rz&zup$+c#i+*Z!4^o?d7jLyRI$6dm#tv$p8K93@c5tg~64Uz&Z zb$fcY^ab(S{%ry}Ri#iTff-L#Z5TeZlfRf-6V6ld*5YMxYP9e;9LqMxoZml%V@9O6 z;yL5pL?4zFVHnK1&`jtyMzg(v3q~y{OzQqw#Um=k;-L%FolxsAs2pBHLS;3BtKcNu z4yqC`n7`nwunQcBM+vnujk#ykqTCc}-Rygz7KL%m0KmK}iYxe9!Pk?{94+c6I6$+>j(UiD2oQj~x{;);XOtDWqZ)ZGD2 z{E7jW_H1<yw*)2@yY&Hxyry4hv&SDuc#M|us)KntQp-j_ z!ORG#ncUcPOd|w1x*8y_1#&swfruV~K@NoMBo!zLXMuGi`4qX-hPA3Xj)bxB0U{05 zq&1JP#-|2(DdpiB;U8w&#VBlt|6*C=A|rx)EX3DxF(UUScfK46_;UxX$6YEBOZ z2=`z`A!IP~!1fiqy#E%F+e^7RW6HtiRaDmZatN1*?cl(LJi(o?p-R50-fY&CqhUjR z4*X`3z`O4*^A-LzXBFXdA#RT*sYK^SURsMqly~BfhvXqX_skI%q;QYUa@aHS$gHwy z$H|(!KWUU{NV1`d+1q~EV%FTe$4tAE^T-}*Sm4nCj2CG_Xnipc@lB!s)CfgZRt0fS z{E=VKztv`BiA4~(>Ba;RF`Q5_ad?1ymp_IqoK*lD^9Rv=a2TOhmfW6xWGZE7z3PwS zsZ0z)Ev9rqKFF%|LUDDbsfa?|PKjthEl9fZEDP9r6#C;qpI3da^WJD^S}C+B&n~n0 zmukUlEuk|331k|23=%fcvRus*eMPb{$+{H14?BYOE0)b;M86HX_dKykZL2%-hr~o$1 zF`SsWt>vYHllmQ_>8JziVhkx{93AGUw)CfiloT9#I8xb>vNBMMa6PtWDRD-u1)Rg9 zT~y`Fk4D)+DQltB!9_l2Q$s!#jRvi7W+lKvR%mXyaXnaYt&}HzhMRl&V-~z2x+Vz| zEbYPYu8t*_MD9>>amBeEG9?>gTG*~X=T`6NX_4p}c}o~pIBw9<=Bc}=?<6sTsOZLo zq=f*7n=k!ny{B7ttI($XR(7`5ds>@ZcuyzaSU3#idzF9?@%Pr)v|XKOW?}xQXddV` zZC9|)rhTg`^B3V+iX7H%+EG#KWKGwo2v)mUvIBm4tJ-OgzZ8fVYr2yjW_UMu@zqZx zJw?%of)~y1qLrTwjc?*9%tlmb(&%u@y%f#IxU{TcK-{k)!4R%Y+@2=GoF_%phYkj>qf_ZnJY{W`E-eU7VaSb&-A6?Z}zAC!-!~rngU%EFv!_ zcZ*pn)wwXUk?Nk!7=}ex+f@0z?cVGmwtMrD2Fc$1a8!f1Xi0o>kfv)6*rsAO?-A@O z-C;5Xp#AJ0Z1;FiA=>E|3NZoVv^O8AWyr@-T4rx2h67LVaRB0?lg8 zK^& zd+9X0h!-kybc5OpDfwSfh+;quD03;}w|=O1%c{5!z120DMuH01dq}f~2!~BjgiTYa zY0ImR=Cn-Lk#6lOOtveUZ*W~@Qz@Fydzse8+l-H5fn@)|SJ@?m_Ap_T`wO&JS$1~z zGdVpYaHD??r76Fa0%vD)Jk*-m%KNkRg0{hH)O4A_MYoIPW})d-zt$g>K$4znA*#SBjXMLZIX0yk!!pir=8Um{qK)O+v-yt~*V!_|t??_tNTenAkS z440Y!7rG<>|8fI9p8`C+4az|vh=4VyzRu32ZB$_{{{1tnmheWWQboLbDr4o$0Qk|I zVq6QyY~g1VFL)*>E)~nT?egQ3i&Y!p^6Zd$ArE$bm6}XDmB9mGTlnbkb_7W6ycAi;nRH(uATijw3uo0>~BB&*t1Xe$R{!T9vZ#@ z;6M%9Ya(JQdY*$Uml{sYg|L^^Dz%*bgxY&!YVYzi8wlY9Pyc2o6yKb5Uho=l$Utz- z(mmX%a)XBrr5EQ!sG>TeG8O~(l2(NM+uu+Z$Vymz2SJAYkBpm~) zjE8-xxD^Y;mg6ax1Y%dGy)^}{HEZ2gVI>7YBjvj4Wm}JrpnLQj9KyN8GD$p!mht4g z4I*%>(?V07Bw&|TYr+7m0H4SM6s`835g1D2=njJ-g$R|Rzf&N%rDZP+g56^ftR)bj zo|*)~%_^at-P566HEE}Kmh>!1J0*F`MMbAuIEjz5f`-525TUM%YN-toO1mn<^S){< zc$D|rSCM@u^h!@~$Gt;?kUf){l1;m@%v&}LvfWpYG|cS|Vo^1Fw6AU$re)q1%b4Ph zt5wh2$e=Nvv9C`6IT4>Dwaku=!Qx0Q8^DhNTjLmbVDTU}g=ktdNa3^mVS%JMSQ0j! zp72YLJqK-IP{4R9Yl%PJuxnByXy%~84mC6A4$Ig9q?UE}b?a41EX4~S&w7>q>agn- z{={(Ht6#Prbb8FAdEw(*uP|nUWw3yP4AaHmZoN|748}0_6ai*eexRqPaCP(?JaaH%Lt-D&BPd|CH!Qd!V*3fRA9CZslzQ{02t^Kpo=A} zF-?sSE!E*xtX8U4ELy6G6`Q)#YN^tS?X*-_Em&id>&9piv{^9Fs$<2XE7DxU=sLBQ zXPtZXGp$%@snBn4T(L<@WlURB&%9z8=#-YqEA}ughkooxEqlcZW?r$HN(uDcidE(= zPor0?x*9ve)QZ((uh>>g6$m_~rHYj?tx=xXL%M~!o|ICz&J>%jEtFMgFFddpYNPAw z&wGpWv3Gm_mOziVU)XD;*-C~VCb}oyMeZX64zQgUyB5V}pnup@EW@LbQpWGZuPIl+ z0JgRyUVv}Op`#!(djojaBQpj7r^3yM;pEDLVL?l%|4Bl9$tvLsGj}eYxRNba7)8rk zX|IvN-Aq}ZAZu)&(1HH<71`DGfWP&L*IYfSet?S#IgGdgx2P=#j}Ijmar;UrI+{^q z1rMuzqX8brs2b(1^4%{&8#K=c3{N?4vGMac-O`}vzzy>1P{1bOsV> zNbMD;-+}4?G$f!S-4_iAa1-|OP!}K-NJP>^@)v5EU}BMlba2*8HMjdMgG)Oo&A|UA z1qzx0eF~HFdwg|9b}5-2XwhY=&r42E-?#I3dzvwKRt{|RwE6#pk>zsC=^gnfR}}); zex!)w8KK9=66wYz55+UG$3T|o3s@gHD?C~fmUz6Q!C^-1G#xCYqWO{s2fl0z#Gjb; zISm_dr&_Z>16n1E&}5yrCXJes{2oBv9KGrK60l_hbjPF01W5puKq=@R5tI-Iy1G={ z!BE8=WFc*{wB_o-1WY|}(PdB2@{a1gplwrw!UV(Ha!vlUZXRmEr~z z8*E1eB7T+e74D0qJG|oibCunQ_iANuHgYMBdn}do?-&_l`na*vpLI_v4B_N7EyK^~ zB`XekjrtCd3-7{CPqIAu(T4sExJ{|gNVqcCH<56KUC%1XoY6w{L-#CZI(>GM%pS^X zEaSs%vJ2fNCpPO`+cKxtq(HF}gK!$BK=DdiqwBf_a`ddiaFLc|Zz4g9JKrG~1EFd@ z>=v(vMye7K%dSrg%p`qcvu6VC>iQ%|Fx)O}itivAT3mVomqb6d@i9MVDomv>WV9Z~ z>ZBIL(o3_o6tW&AwpzHsm4YA5yYKOmk_*`QFqcA4=2hTI)oVAQ9jg2Ls#jU zOp!G77JCmp^6P*dWJ#T%#twEKq1Ke~f($Mm9E9u}c|Fe2f+pO$le=fw$P|H6D~cZ+ zFPi@%^A(^bGtz*GD_5JVch*jNKr~0WTx|FU^qsmFB#->~GZEuNAfGxu7_OkiTU%or z@df)@)BtU}>%WmF@r;bL>qYw1n#IWXDjxWsEZ@Ae72q5ryI`_Yx!M%;$vMuR7Fb_+skV zP-=Z#>K~}=Z}JN$@qY3yOccC)Q(v8(qq7JQjN>JNo*rey?ZKvjaEBcc7`kCZqCL&c zfTy1oMIr4N+8Q=p#VT&2Zjs7yH@Unye+hjEfs4Mu=$#Oyiw*sRa&~=803A0Exp9c$ zCfo%)m@*Bf-*zyS0G=_u2Q*olXXaNPowEufE_ZI~o1P3vkO83-ri{cSvce>HWJG{o z_tU$t+6i5eofNzy$7h6o3UcX_)4`DJLL3I=93U5OMevHYC17>Eg)Jy4z_AOxG1dW# z=;HcB7ujIoLVI`auIF~2U9>88`{?R>U?UV%Phv}A6M^v9rta+|8@_EOKOvFsc14&u z<>Ul=&r7;t^NDO$48$hW9-J``u_R{9E6lRvi&=9$*f!7*!Rlm&Fm+cu?Oc&INWLWC z9a*6Ouo8usVLbFzaT6Z;#J4KYjwac#1ZjYqm}ix;1rv#jIU=HP2fg7(=MK<8?QnSI zv&gxSg;^frayF6I{0#LGXWO~s>wt^S9bfaZ$bWqpU2&VI&+cq-7wSV+@F*q;{uEnt~Y68UczjefzK1!3w4fAGwxi>zRhxlP;; zWR&ra;=F+}jtTJ=;pycHml;L7<$z-jsM*>t=Mhu@RNY3@%OWBn98t9gfLK6arQ~_- zKyFA(B496+#-9@QIo6pw%m=HAb}rfky#=F4%tO_E;Tj5us7%jwEQ~81j4Kt>()GTV zqGRN<*27PM88lLnJ&vw`7oa-%<7%ZDArJ7YM?(o(y&&`=e|Nke)@z?wFDVFAjAf?? zOV%?e;?boJrLM&J4IUqi&*b==G5|jg$?Wt+U4iJ)Ul9ku9x!!R`gdOKt_UhMev(6Z zRg3SvY1|)R^j6(jT2_tsws+@c{_i0195vmfu7#D~DSl*AmR@8EnO<1=y;uJqre{!E zR4ZCHlbTM>9~Bb0t}$%f#6JfNmc-(T9fd**qF z)Y7GFcm)p4$ZVbU8gd38>L zgAw$h^?vOG^tZtdO;fI!V=|&+hz33`30kR4BxQ5M^&cQ= z8(PXBz>aTcJDXYJ*BKSOk~x;4`Xw}EmUQ|MyUG>nwmFcc1+nOv5I>_?6qaeA^aZf9_|w{>!1S-}9*}R-3#2{CU1Pc>VT^ zb`HPR*Gd7IWPX?2zBt#M!4@uF25f1b=cF4U(X;vPBt;T$!7Ngh%(6b_n%>SJ&=CM2 z9Auj8TJc^$!A=fgDOW0s`rD zH=^$oB8l0Mx+C?1$4WRdbCChVsvM86%_ridBM+AOASDr)J1r}g>+F11z~y3#;93zB zF3=xz_X7Bf*e)%g!}$xokaRtoYxdvw0TftlWiZCgUEIK|Y6WSpyo!Q?4^lVj=opWc zfQ&pmhNXeaG>xjG{f5d^kWY~lgz21lr;h{Mc!OLar6ihy@aa(*rh`~r@PKpdSe;xp zbeFqgCy|oE1#Msy(!8oi*bUqx6EoOYry^Mf2Cg6z9VkOx$PaZ{9-%G?Q6LH<#D{!m zUGgbRy1L*FxheIU>KEM*cq1Av*{R$qe%YlLp^gK_Qo0jqpzUo&uhnHsE8OTS?O6$I z;_D1CLy=?@7^2zjKhwv6W+$?3!2!=$L9fYY;D|ca2gGlqXVZ)7MudhlvQy7z&qE!% zh3VqwB$g9Dq>~aa05n9_4GT`E2>Jspk~HGHCOB0I(bY9CCO$~5F=@SvfT5&KmPnt3 z!y17YKrl7S&dLCQ9GL{#=%75NX`7Qi^|LVA#P=ohF%tENBvfu@6ig;3A6kbr*s-{o zVuIFYON^k$e03RiI@QaO3@7Xx4LLcLajKIe`0iCYkdy(V1(EF@OeqDZ#-bZsrvxL6 zOK^pAJ7I#RJ}|-Nu!dJQ<&|*sDiOI{oNh-xQ>k(lkcX9|2CdK?S5USQ@5LSL;;{Ly zD@TR6NAie();lFJ2wpt0vW5E*I(p`PqO8K-sb``rOVKtA4Nr_c_o~!%19Vf(sy96r z6c}JZa6A=BHU+&*`o@o)S{9T*HjMWoRl;3;9Ck*QTD>Xu{+L3obm3V^N}S8MoF%^t z#TRhVSL&W^VF`=Yg+U?`pb3%M*Iv<}nVI!b8~^aFZwxM%yxG9#(M_hlv~}(cGjMx( z$arfDt#30~?7t|cuG$4fA|)M4+UB`GIYLpHUlEz*pqXL_%@^X7H;-PvdO~uN9eBBK zZVRKGU!pg-UXlw8G=Hbw>QP?(7yf_w$;RcQS0*+;l}is2Vs8#WX*>MFC+sGaKne#AJS^|#W>r-xF!)|5e%aVV*`_=JKEAp zN*~d&_9ND6=*y&)Ia0@J=%qIn2|wx_3ys2DX_9q$NN1ewtbHEsjVx?51^c5u1rV4g zt$+nLRbCZIzoy!%-$%q@p6+DM5&2p;{?zq#@%+4MetVYF0?)j0_xmLfHT!MRVvJK5 z!wbz+heT0Icm_jJy*|iZ!{Nr!;>LomYtubDRAxj*3%J(F?`hf{?hT*qdj6V0^Q+VK%*%ljqrK=YtJ znD9gW-$Vuk=P0lMmS z=p=znm_22i5o-}`+9U*vnDRY70JXwU)n#I*(XCiOle;J8)KZh$dafN474RuKKudge zphJa++=NDDR9I4-Jlp6nqz>w_AxWE_;c(siY>&Yb=>D_+4n}Q5_p7ickz3WmN34s>km3z8(V}nxnMS}-56&sT>bv=E8w_Or4 z8O0}SoqBoFhL?LbHp%Xkntb@EO&;i)OaSn{WT>v|!)}l%CtBCn2R42<#&)7p&ht(fRLb9tqn;??Sxv-f0Y?pSlP|8b4 z83t?Qrf=tb4Wl5tQgP>EwQmSPgjBL_#LwGvt!EDb60nMy?5*s^h_{Y^4`Ii3|4t=7 zs&=1UZjlfsPd>iujnJ*gLyv3tWOgi^`sz7u#5RUS5A#p8Z*d;>U569%GpIMc1Xr&) z^5>xZkaPwYY`-)T5ZMTbz~~D?7bJ)H`U>h%j&&H@3Q|Yb|X`>?1qO@7!28R6SA;%s9tpJ+utLCQ8}JmmeuRHN5Dk zWe6deB&QShNn)6dO;OA{EVCsBKN9xC)z_Q(8t|HHu71vwwh(hSONtG|pxE_Ut;8Lw zAgHL|O?(rX>l7cOi5kHZWe8H*iIGGiz!Mr=pCAt}5+Q4&_eN!EU}m%DJ5LY_OX3uAyU;$ydK8V+3s( z9cRznZ1hVV=z672s#iJ)lP;tV(f%gdobD9@eCieJ zg+A5uNADHTK~o92gwWJv4PHS5*Af`d!S`i)(i<|1VuRG_=q>ZJ`n>>O6sDaZ5EiAp zu$zKuilkuhEOiAnOH54K|IZ!%Rj=rcQ42WWO*KX*S;|0Z3H8M_Ae1brG{FBL6q8Di zV3W#~zK_%TLoPPirMVlZP~FCC&rz8-*xSRN81{cqXU{Hce(>F__`#ENi60i_ z7ENbSTm!7r{1s{b=u$#aLF?1zlC#v+VxYH#+p zzYW&o0R%4TT~AVWuT$f?8u8f{>Qne1+K7|~O~oz=e!lP)*c`yKCfvA?Ec4aY%k?&2 zLS8wRF%AiAqH=Ld8D4!BllJ9yZa5u)~h z>XB>`4up3U3cpL$6c4(fT68KT^@^g&DG-Rj4OD+2{eqs#v(8S4WZyzZc1d$Wc-1o6 z>bJzsEfFO(%Cz)!V)|kZQsZxufy#OHHufM!?1z`8tOQiIhk8FkbxVL(A1X2{#rN(- zHIY?crSJN?SCHpk z4Fw61SHG%P;c2=i;YKDk_L=H$WlqD%&X8jU*sis_ThNiws5$u7bsa2X=rnKrWo{l5 zlBV;WHRBz~-q_2A@9F1rQXZfzw(h`unz%B^**V!#U51*ecXo+TFFdJv!w({|eyWhO z1S_&H1e9%z5z8hvsI^jIRKj@%?;${!STTy2B_w$@(?6i-qGwlb=riWypio#U5Y*fg zZlF9xW`c)K7Jz_(i{P2_L*@ziz3{$}Y*%E3`Rj6*oHT|s*!+&pL8`fg9pPJ>+N_$@ z!AC4q`9g?^@!PIOkK)i8#h9iV#g}$9+A#tp%&F7}YqbS3XJbIQ3s!+rzz(KMU!Ry| zit3OlWu6U-aof|pC#)2U2LB7dTrqcSxqM4Dj9`PUhBytT+UdWYBtjE01^@6w(Xo>W z{t3kJF^8Fk99UuqSS(7mYqqM9nvUK|wB$w|){3OVPJE#bi`_%tOyA^DM+NSpx~s2~ zrBV+k`^vV9nNIEJDbFFsj>l~iMrh@{HeTJzWq39lm?Vt~MesJM23W{? zmx!)}EgXOK=S=Cj_bz?@>Hj3#RvqGW~ykL!rO7k>X+Vq%-(-Rlr^-?ms>Dg$` zTregtRi;%Ju4%TaA-%?<>OBxK$N{xipRm1#-534}BEi^Lk`H8;vDCMZ26y5&^;I1Y z#)tAv7$E!ZfH=%z^O{LEFV#s2dODC8%L&|280eGyByFJ5q1>5$s#Fs3jmR$c0LaB~ z<-0h1$x^P)pq2?NzR;sd^B1+Xb}oEKMTNTBlld!+t@PL+L{JLGHZev?#PAPO&Xo?xPevS@4D*?pC-152g6xo2LSF=2K+~zbTu`+Yuc`}M< zpFw3jX-?}k-#(%_?Fq?H^9m|U+9Rltw^e4y0t=f|h0v=oMWiN8G+4I0LsG#BJZ&X~ zGD!+@a`J)5?BUYzmEMn7qblWmFM0=oEKaR7t9>?YO8`<6})8vV-=oZRrsbx}*v{LWp-09ML4vLXRZg zt1i$%B8VO>!xrh0ruPIr632*&<1PJyMXCkEF^4=A)a6O4jd_c-EFw(Ol*f?1uh?Gw zwX|St`+8OV1}lxq`C|yWW;)KjffD!ZCt^itKUzj9Lr<5~vg-Joe8g7bof@{~Vje1M zrWdGAF;a7>lyI%tf7?3g|C_zP4!V8L-kj?8#R?sCL9k!8U5VF#Re~3RL*hX&jwqWn zS9H+OgI!d7pPxZ2Jwus>V{l7qlv0QTD^ubT9nR;ubSUqWAJ(P z38oKq1?PfbLGg?I?F$@Z&&gilW{ACU7CDVlT#Ry)xg(fAUJ1Mj+0;(|7|71Bik~kkhL-lzhRgh;`yL54{j^{d`VlG-s!lSQ5|J zgQ5hr)~fon>I=}%IG%-*(AX8K5B20o;sLQat>k#hwt%7g>WY}*LdFec%6T4YgIIG(KXwZkCg5omuT%?jC-$m(SW;R;&x22|&l8#`Ay< zm;bqj3U(|GOI%Wbt-QhH!Z0iM6uZd4CeTS>VuTfW@{EBduA>5e?HPsZ+9!*7dGg3im zr0iqFCf+(+gv*gUqclQ+i1FzQ1WYk3f|JHq=knu<@p;d3NqR}6JL)-MkNn?E1Lb)J zkXHGShURwEc--{m=YsLUJEGjV0KD|Zo)z_y7n&~tTepZ65fmnPGkUEPYS#|up=tCQ zvBsqbxxtaf9`0o^8fp_LE>|i(wV>)GVhK3m(gi7KUTx2-fC}T63I_;i&8gx{Udl5l z*f~zZa1kV=EU){fsTRxw?5!V}!Q*dh(q>T=z!?5XFV6Z6R?nT;u5~#o8|l1iNdOpB z805B*wjCnMO4Jk*ePIR~d|+ZdPyeO+|Ig~?xxAR4FEh^XvAuBq0{QTUu%;@hjf$l4 zRD%~lo&d1$K1pZsKJFAJX8Rx!purQlCM_YLwt!?OQ~)}uR?#fp`7t12MyhZ1aP4*- z9AuBVCYt5fB6Ry9a}yyqNjR)NjNg@_07EZ$tVE^+yAw(`!TcNHkvqIIumuQ zIqna)0u%zoP_Y#+!V|JqIVbKishwMEzWi~htli9tKwCi-Ly=}XM8;y3Vxat&Fmo<9 za>boTVB!d{1}44X#MVN!o z&k8JI#}?pCV5=VkPgFo4HJ_=T*cUjb-|}^mTa_voM5W*9e1X*zSagw$v4~RPjy%si zsAsu)C03J-uo(WgUcN~xK^!SSEq zq!Qwgl}3b_u|jWiJv*yZT-aLV$q4+EUa@ZYT;&BzBha#!N=GI5o9q&7uV;|9b3=Jm;?BK2DREMUsyvp<4+U3zw zq(vFGRHz6L&)mLB?tm8&$Yg>SQ_DVyD=1B`s!qk=qS5rjO?r5G7KgM0=5aMhE<1Qf zXI$A_^W_YGJ23BU*AjeN%+Ai1;&wbl^_zmtqwPTFnh}cbX77FL*h%0ZVFXWxfHuFz z1JI^g0ddR^8I2ecWabu-psEpVH)iKUzOmwdd(w$ zb>DU6S(!}qLr(5%_9VcblReXqdRI<7Iw^)JY`_;npwh%(_OZV_q7-L75~$KVNVrzB z)O<{%QYgsR(mokJJar*fL2CAg;`kI1E>Cs(dp9Hy34rl3ssxlm7Fw643K)+59^2QW0V}+k$}NYJt5d9;QyWw>{gk0 zT#0WLcQPcQ3cRv={p_YhB?d>K=j}Jo_1!bBB((l;-*i>B<)1BksIXbO2KoSxD^F{F z$eN5Lx4O$WvuyY@1fWqENkPLnyu$$BS$&=h?yPSZ3(*BliME;ZJsnW;UVF-A@5R7? zu}&=k$@^JNtrBgSV4#InQe*|=B4zy+at!dyrFh=EwPt`$LE+iH16J#X0%w0x9}!+` zxXh7Ap@4t$?Grs)`*8NY9b)S-;8Llv;csR(7DI1$5NyWW& zj_iZr-4pIEr5BTjk@mJeq-QkOJnKab+{&)z7uMDYKD!*sBZ7${(R>|z=0$J|{79*& zjhBEE%6P%Dj!`UYaY>2rI+z)8YOyr=(cpb zD)F=p##?}SWF(!V3`SIozQRm!p^#iDNf?m!(QaIV3qW~>>NzY(U^=3~>g_-o?hAs? zH<3D>Zy=-rImjC{AAwS43n-hIaoTO^nK(C?0ju1SRG<&4BQ`8nAUfyd42SESrqeM% zAD33wwuOWE1Y#d+r;*;m&daQbZ8WC?g;ZJAJt4;xQaVBBm&}TDak?_IC1*fXv?}6$3Mwf8>fZM!KyR+Vo%z(I*xDKXFqq=Z3b9QO{r1rs59rpC_M`<{4 z?c3*0J0Dh0t(tjMA^C*LG%go~KN)N4rspLlHxU$d(HP1~s;Q(<;rArx+@ssnrG0j)(1HXax+(#P7vz7zWc8c9yq5$6 zC{|qtcZOT{m^%w7C})LyC)v+i?o2-8=FUJtY5prXGLm(y-Ordre`pMejq7q*B`9<1 zs-!;l@nEa?g`W~%)$vpM9)7Ag1(re6&5UW^Z+V^P_-@Qk>D@FxC3$`Fi|6`o%uQ|h zqN}iN0d7ibH>EmZ?Tc`W1c;X^#Y^cKJ);@MhdMuuU3zK+R=8mr(NssC?YoYlp#??b zH^tDr^hWrJCd>NMeF<*x6h`bS=3cA-1&Wwu}1I-!;XuGT7RgLbk z;mtK)`}DenIjQl43G8yL$XVnRm{|n6TA9l@Q&_=}k7T0jb3xvtu!@qLNVuuRs36Gd zZRLV6T%DLxwM@D4Q805C;W`}K9IFc2tuSo^M{5O>rf<56Rg1rcbJn-`5aadX&~9?Z zc`*T_rtwpvB{+xsZpMJNYWCKTC-I>nUCnBhWQ6B&4v>6zV{g#!0?8RznIQw<-^mo2V*zpvY5C8w+N&HD5yasN+_b(B^BmG!h2S1Ufo- zTv~x(*4FY>!DU3{w69YLy~7&<9}ft~hp!Cm5e$;+VdnkGN)B}xGh9mJsBKI1ABfm{ zt=Z2g8`24L}7*FxDeLg2BscEQR~w3U|DaVEZ~cB=X~e1ns9|I`&2y*6|S> zIQnf!CjQQ+RsrErYpY9o0@2DO8OPqogSGr3aqUtYINJMP^aiHF{|xj7zts;Xv}J^? z$=xk@?AHIV+5MsWvcj_}!*q^WnJL#Jh!I^FHp_NSfQ@=`(rC z-7m-8kh{5IvuFH{1SMaMF{va<$4BDsS=^ygd?@ZP7a<=ue;9Xj-1TTF?&i5eNqKwR zsTNd~Z{`j~e6v~hj)D{75}{P?D{I5#BvLeQgTfKxBJz1Ux8Ho=KB&}^iS8C}q9VWA zowwIHSGYjDqg-?#J(};Z5+I>9Cn05U91P|~Jw{LY*n{_F;Ty$0+SUWy6Il@l$~-*2 zDOPS#xDuxn(F=LRikGLeGBa{@+G_JFiNKf9!+V*dNYK2O7aECZVWfVQ*}~M3XX>+T zC|#eukw@AJh%Bi`Z6|_c;9qT*!!(>x(kb(UuAs&UD|dhbGdEm1>S>QvXRds+gduaR z7=|MlvO0U;Xs(TR9$XKLF}HHGFN>S_Fslmw2ulF z$L4b(1FK%>x-nn^B|P^>gX+IS8tdK*>C~XvMkqC5Wny#Tvsrbk&2JuX+eN4Cv!@b< zGOJ>NZqt*RU%hSiKjN~KkRF&v7<@@t+`z)_h-)db@{&Wj;IDL?6#4*{f(;ME{BhL%7M2199u@Ws7 z%j18w(8x~Q>NYa0O+}Ird?OD%>?S4o)SVK3z`|kT=mSq+D&Tk%JEAQ1*ggvVP$s@2 zGpl4tDZPcZyg;5Ig<=D36qDa5Q>r8glD~@WFxMzx$9L|Vn&U%qJK$F+ZXGbIX!ys= zs1semn9M7z7q}wWEGYXG_BwqxxN?;9WucNV_yVy@we~Ej#Y3bU0Y^bftx~9liDN+O zY=MDZ-y?ERKO>*rWdTnfk5|fVfafZznb7DR*COdkLspllT4E00x%;AUF$(sFVpBkTUF=?Kzp;8Se zRqw_nq>y%M(4f)~siXrMQuP@*i)fNJ4C9BC(M0jk;i@5{p4b6lmdK7ZsyuKKUdTv;ovn(GVPfIzuVWC;@LRCrPZF@@Ek#!U)QM@d81hr|ZroI{y<4 zasIL$%{HvX+NHFiGhPs?g-VlAc>mwu7ycAQ({Bzi=*X~YXc!ln+z#YM0^04rcT zY2)Ho#AHv8w2D}|4q%J`Vc=}o?@p4wO6nanhHV_UDZvbowvQlZD>r-M2xess zxDd?r>Tc-{MlB;sJp(Yn*%@ZtHT0k>S~s*LUn~1%bET7=v9Djov^q`+zaqG)qPn#l z&8tlk-?RPkbFo%U9K@V#5qf8~V2N&+H>&5gW!o?ArCvEN)ylC4Q7P9UK~-Rx6+~P& zb|*S$oM#OKWy*^;&~E9&e`D1&+b)AAwf+TCx1}L$q9+x(id4SD9!Wd<{X zX0Sb-+oy%b>D>P&%AB6W6CcifDs}CC-8y)w3=7YjI-Gk+Ly|-CS;b3zDV_a=zEWll z9d1onQm?s%?|r&x=KWZE3tdd-PkaBFIDcA*aKILXPn7xQWI+%jfI}o_hEBv9spX?% z;<0#wISz4fOxi#>*?`>%!h6)9`T^Qr24&hiS?)v%SAXEtodPoV&=jr~R9xzJ(-!Ec zwC|%$)d9$=+MlOpE*8k*K>L(um)V+_V zm#TO>z$Z*YZa^qak-`Z#|N0;O@%5j)-1)K=*6ICX*)8VCJ^EfF3C~-b-RO zi{>M+_BoGr-W2denYtacB-{eH^JftR)(@--X)%~w+YZ5Bps=$2M)F0FazT;qM6(kJ ze*-v5!Uu9cI07Fx?i+aHtPo^_AU+-$QStG*?4suDd4B1?I(S}iZ; zj7)9U$^P&pT9@-V2l~i1F<_HIm<+ayO(`yDVr#k7*?+XI=mSe!`|T9gBZ>~B>n`*!PD$&?symuO3RGJ#JvP{?cKquX#LfLYwDS+M>C2Vl5{OV zfPK*Njw8jk9-F#_c$hR-CAm6Hr^p)U!*i2A5HKY{7TZM6$_+h>3Q(q~is;V@y9YA~ z4@RF>);{pb=Re7AnY&TN8~akZFU>ar1n!mFVXvDy9_{`Vk9zTFJ&R|z=-D8it>y7- zzn*PQ&m6x&kiVXt!ZW7|NXh_P(U{4xYJmP6@!i8yMBEmBFog3mO~fOJE{OQ-Mk0>d zLd1G@BM~nV7@#dC;&U5`xOWFq0E&7$(^BLZnA=FiCCQ3g5`j*1+mFhQZuf*x1RRQP z&zn})0}PK09E`qG>K@>OW>^!7aq#3%c52*r5J?E?_^d!;- zxnW+agF&lvD8dh-vetqqD#8LT z&d8P`Sz+m9g{ql0lX{}3_-&^5I_(8`nz-ThsfLLGXFlafL}PbJO5%4vR9#}3YG2g1 zuBO@ACR{{9B5#DGBiAAe<%Vkk*= zBLAc+pqf-L3(b_^Sp9|lqfCE9;G~%02LQuUyi!(snmYX3t9Z*h?Qr5*^~xb2f3_E<#RF|*tPD*Yc4r5<9KA~QaW6hEK)5fG3Rw`U zxqkUs#ar__7bkWXzhln?5+>*#7lgBldv&FT8?udtNj}#}^K6jD)?94E{VEg*GS>aA zL>(QpuIHpn@LBU{3s}DBNEid|2_=_g#o;fD)^eBN$p`6-N`1=Q?A5R6I(q*udBag# zW|ufh%db^^R7Fk(E*_u*?eb}xE@KGpCo+LpR{bG+2LvLzPhtmy2Y&$&^E6l(Y1-JI z)lVeYAXv?I5?o?BM2ZK2{Ms*?dv~vcMHPm+sz;qAHGrO_Qj^yn!SkOO$kdv0Bi9QkaM-jli#^Tv4zi zMakU9hx|`YAog-Vr4{`YblFCzahF9_Cc7-}HchEdF@v#m=h}6OmB%VOwh~rotgHlL zXpgLjqJK=H5B$m(H9W?WY_Yy(xNqVl8-~tQs~YKPjMW852X?+mJ&LfRW8V$rlUx7-KnD5hPr>?gb1Cv18UEKu;A>`cva z$Tdr1ZYMl*mn=gIyPd=&#GQJSDG&rN-wzNO;8z>5DAug+H#)SouAUAsf7DwT|Ibr(WAfUZbQ2*9GC+QFn` zFeumnrN93I!B|@8@$&PzGsRDLNMA!z5T!VOqjjsDLIW1~zwF)r-1hF_y`2<=J%RZ& zCXF>=$Vo@mgdr>)Rui`67@9DY7Se=S1!jdC!pD>*%zPPWUJ<`0S;;!CZAa8`Rn~FY zeMBKX=^o~V9Y?#G9Sm?WHj&QjTw03xYb3`~7`;lr|n6b zF#ZeLop84hgQ{KKd$@L*2(*AgLlj3jYUYSd;OQrGA}(JU$94E+Gf zMrPj~rINZ)2p*_s#nHQBX`MEKq0k+k2}sx;uGD{G2!= zl&!Ou0FulC7$0!|>gh*-mxNI(`Hej1@5^-e>U!o9dmFJ$!l#K|iv_y>%gNfsH)u32 z0anU2HT&w3zW7m@sI{?*vx5Qf38W5-U$(YrPQ1{ZhKo8vvB*yCw`oy7+R(orJ)zp! zq?IoFH$`oUBU=WS)XVpp2Yj7$uBY6R07`Lf^F5M3GM)AGJ$%4xpiE_P_>*s=bhB-! zb*&>j5b;)Z8j5g@+v+D#>(%9pIoYX3>ELG7Q;9Zp5k>)n;A1TaeD`Q~*8v!;nP6=~ zu>E(r7*)&wT`qE)`XrIv&L&(v4ud2ujP*11qNa6uN2r$ia-UO@@<2j`KKvG?kM6M~HcL0GC_mDSG- z#I_zuCOnh++2Ix_8F|B0NH7EqQ_pAwMns7_q-~b1O5q!_RO!?&(2dFTpxt3gaLa%+OBiMX*=&vB^c7)- z6QOB5GTh0dp~*3MiH*bAPf7rG6O7;<`%$_vJy~6Dyx7AJAmx<8s)_EO)%K0mWw&<)YUHL?p)Ar)B=oI7IkQx zU(n8Nsg2*7Q1QjWvx=`DD!#r|e93Ze6<;6T(vsqYichBBgPn>GeCSksT%+P6cwfVg z%32j)Kh$pVloXK6##O2Z^;%y-El~5a=5DOTqdsf#_-(a#sU9VUWPX#j4hqS8YwY^g z*tzWx!-WFvL#gY+*U1H}Av0NWf%GcK7vIQ@#{7G~`5H9Wo$b2GR`i%=24aP#?r{rz zQBKP?hB8qGecj`9L_z=+q14ogYG787GPlH}O(^dAO(^cxB1RJ|U=?m@z8k`xyk(rT z1B2|>STv}TIz5k3Pgpq02>sps+@-6?yp)cy) zax>r7e3B(6%aF{~oYrt9Nh$!;{6(kK+3F#+Rl7xOh`^dzx%O(ebHeppukqijuHP+~ zeQTOn+mivI#kSfsUj}`iyn$t5Q zar;=cesSVFv93A3O6B8`x~fA)ii>a!(j@WU><>F^W}<_sD(%?j=9tA|`_y}qf|6NqSg0fDNI#DwlgqSl3fg1}_ps6m z#x_ayMe{82NN^&T$Le5$>*OdLjf2A-&G)|@0|%2L}Ohf=Cjvgd^1I)`4g z#_Qwg%xCC~f+(auc0@?(%!O@d_C#k|K*_-+5oDmWwU||$To3S-)z^8|8noXvJ_U7v z3Le&=&NW4Fo#s8P64Z_j_(yZF5;5g~88$J1(O5PDGt~gq1{b7iLm;DT^AbdGHacoOsYL}>)AZ2Y zO*PC@0}Sp&-E{uLzx3N*%r55QL0!CnWizjH94#%WA5fo{*0a^Sylm*hWlHX&0Ms#O zsWPy4_#*jaAr9Q(KkSD1>|rX*E+l4~`ZKwf^)9@^`M5;wC(7X~n98Y$3cv7*Q-;+? z0LuXUMsfE3vX}`1+T}s>gqbVGCqtmYDKbFQI~s_Q%LNqpN3BvZMxJg@alhFXT+d4^ z1UGZCO5yEzlxjgMwxWm~2tGETtu$odhe5cKRS()-tIuTKiNDYF78#ZCnOTzCCLQ7x zP(bt^&1#;I_g8NH?JsIp9{jFLxY31geuz1mZD!IOp@#?lbJbf4@K{=PSWj?EOfiHF z1WxE>Gh^?0y(giVLHsDO5VR~I5=0Qi9h#-fNY=pT)2jLO{jzo%Q_sJw<_V>M}E*-fM zNfa}EK>BFyb4*Z|mio=|^l>r~?RBsztPp@mLP8;iJ^Or+VcMk-X15mST4?w3fotZF zFil>mtw@-t^bph{_GW2>-cn~tFiq(x55$aUgX9Nc^p~t8!+}7$6_rGFGO@$C9;Tg- zluks+NY&=ZQ>ADXyvuzarW&9ZlDW_2hda~^3jfQ&k2VbnF1#w`Zek^(E^PKiPfl(A za*3wdVZo1zOEeR-!_RqM2CVHEi8eQ;A%>`~Sw8S+ZfwN^u_$R~m@x4Q8g%u}^!sO? zB7gE%XacR<(i)fjRcV8ccg(*)Uj0+%}1`N-uA&kW)R!u-W63 zR*&d?ROh{G8mN_sU(=V9b{ybtec7F`Z9`E5j|}yW#^e!okO6HcN41y-EJ_VebxQk) zlJwZaLf^;0WCN3m6zmu~l`-r1=xG)TWqJxrfFI!CIOVH^@MIH5$MKro zgzC^bD0EJk0%_uB4ycvY{$fKf>Eg^}t72)pF5-62st~5Bi)>Yg6gI))l{+{y?jRdF zZEonC88r7NITcf@6sH^x;M{Y)4# zxF)yeb5!*V=AMV{<3rSS@L3{M;8uPop2moyV&7-?5lndP#dcyGsC@2{^+2MOtp6eo zng(vASK`OV(Sf}AAx3RmXbUajN?hHfn+jCuBRnQ)BL)!QNZ*X}64nqGm1+duahLcTzh{0V(LVMO^mQjTw*v~N zgbzzNdcvrgSRC@Q3mW~!fjTaY8h_LjLAWdwxFmiU1N?sIG7E@2tl2Mydni!H3f4D2 zJt&rC@)hUJPoJ$!@DHVIPmYa_=tPaTrMXLbM96Kc5pi&hQIz@8Muk7kv-ml4wRz$z zNo|a)U%^IBECnx~1!53N1+&lI$WOI6&-0lxvih7%x@8|J2D^H8S?jsCt}XsjGKH7{ zZ$Cx#sU}$7!&l*f*J%zbnEM z@FDz)yp@a3krc{)!rzltD?Ev8-(gcDuqF0wMqB#)u+Xu!rBUt21KF@P9!5-s@fLOx zSwMj}$gAR=^K@Qv^PmhK3O1qVEk~d{?)Ph(XFFNfFB4JPIc83Y$b6P@$f>2|)Z0`f zJe2lwDV73OfK2pUN@;Nx`bDm8c1wFvH@sH2s3qkmM+biK3T1z3IE#r_?Nl6Byod@_0p1jO>s|

Q_(3OySU2%z?9`PIrN(+mI6I(6ihEM(z{NhSjxi(|`?me5yZi>y+qso?)<@zJlUEJt;Mxb!`t0T!23af}Xk_uF;fo>8KXbS+Y~02p;ryVN_pO@P#{cfjs0-z3j& z$P+h1gybP1^j{RlD4-j7mZ9-iyUnA!*W;vj$dWckNWOLJg;xJ*Jcz|#3sm+_yi`|e zD%4X4p=$+0jFX)_6+CiKkYzJywHGxN@t7n>3<@PbX*qQdpS++M(a54>8`G)ui^?OQkkE)+9MLR7T1ot+atW9_bN|^AXf=Jc$Rui zSQDD$)N4KVc~pFz(j3*RVgG1}QDV%YfhIAG0!>DmlX?%wJZ#{gVyk^DrldJq zPSTvfV8S?&6mdyO5$T?!xoEZKfi#F(r~GV`=BSSJG#Za=cfxk`ZG6eHkq-h|NYz6H z5EN7{A;_8ivCJlpSwtvgHc{yj0v#ie3~HIp)hy96c-^bcQ3J~w;)KMO32~Mtl4n^( zDb;&g@-2o3JT(>xY5ol%&Eq;$NNY8VUpj>TC({2fR9^`6)KUFEEwEG#Pc~X-=&k*c%=Ct z7_DvMnOCBr1j>EhDTKPVaf{A5B7Ukj=#(=iO_G{sw(I3Hk&k-0ws|K$e>3!95>H`4J0h zZyuSreQxu3d-oTUK!!z9j`qU?`J3xc5s-cMK^{PUreSQ41_FQXOD!A;#wbCxMKI%C zXEwmNdww_=KNGk-^QaKMNj*4D2s5EA5b4u1rvTg=1Na}v^dG*~+d3Xx%Sq`9Y^Gp8 z$Y5?qGl_T0vi~GGpF<0IaDegsZS#MfZ}Z2@J6YF_PIT&>!Zu!mDC~peM?l4cTBU)t zm3F``;<~no4rvL20EXZ+;h{dvO?{BH4@n&?<)g~CC14TYsKwc#a-_M#Wev_{cuEX4 z8x--fmSvEL)kQc?e~61W6qgLZFyHXgiy6qRc8cmovE%I06UAC)UdjT|GRQ!l$k7I(;N(yj&J5%Aofgo3QB>9AT0I{Mbl zP!k}54V8(hY%noNy%r_uNwhMIW@uFXOwFi1b+4o}E=h-N6A3A5XxpL%nt{@~LANE) z7CL-vadriY#{bCf*fDn3gWba~gaRwnC}x$J0!Kb+Z)2yqm+W_7i#;cWPvWBsvEEon z+m|v#!j$nqHrvzqg^3qVv^*Y@#Qh;AVzEu9;h6V__hnomZd{}YfGSwTx)s`~*J0VS z1#=;caBM}AK1Tzo8c||`=I@datHKr$6x1dR5~6DdFz2amJ(Jyockuv) zi*_jdNwG3C3$fs=)6=yVT&{ND=`_jXc9@KN$m18=Tkz(g75T#=&y|+qU}xaC|Deh( z2}-=@5*5>oh|RlL#*PV-{nD|m4m9xR-tdj_einvYbqHf%0G#^q96%BJ5o4o}}+ zx2@lDq}JV!ntqVfL|uv`Ai9!zj3IIr84N=$^j2b-t55Z^;ltv<0A#2-0wJaM3&h}n zXNV-OwxB$zkuVgnumm=<9t;)THw?QEi4*x~>4ScmNS~J_2uq7V6(Cw6CZItz%hrB^ z_y$$0c@P7HQrPRvfmh^OxtQgcj3EBTE6@DgSfLAwc*2u56V^c3Vl3cC`U>kz+6jTK z3c=Ds0ylgmVvWPg z`d&1&KD+&+VB_Q^jQGOpl0ABtKwdbD?)~~vl`nhwn(;zmE^-h!S}#HZum~6r@k6)_$sxrt8m4Y zKtcUFsg5gyg|?h!S|nT4*!S`B)Id9YaCn35+Idb8ys5(VKp~-_{2>+en_yj(h#I4{Ir7lT+t?V3nt&ty{Q!#C$aPe3-k5dEWmwP-F~c0d+5knHC%(L{ zHl_3j=2H5HRY2EC=?`aREn(fq4Cl^U_b+*3vh#G0iqIev06MM|SnzZNu{?sBKPKj! zY=*gzYF6h7Xqvl3ub&a5KA1JPeHF5y{M^4$6giw1Bw5NfrF@kKu@rUL2m{PYapQVl$ehYq zmpG&COXeZmMXn{8O=?04xwdxJA=PbHZPCE1q5*>HCmL|Q$jw{JS~|)Z+bXCyy1a&J zf4;o|{byvTP=%D-TCU|vw=*L>n`-1Mb=fuYc9}P!7W+u2lw3=e5o1>-d=+ujys%oG ze}jq;P1o{8-cp4&eGy{KJM>y4&Rw0h4p^ueZS@%|Ydz4w@huP;q z)$6b!n(-wx_-jld_@SEC@;cj5{h&9hlqBTIHh%VTwGA@CULUD#rSD+<<<%`9U`emM zkE5KZqnqM(>9Rub_}L*DP%L!;S&~XiozLk!+gNnp>P>f@Ko)ka zp6k&eI{1f(j)~X3>4~(mi910(mRMm(7yJM4FHJA6W?xB8VFj>J=O7e8=CF-f^(O{c zEmv#aaqZTwM{JG@Fq#rBOkAteI=fjLR~eH-&0;HMvMc+!q{UL!H2&72>Grd-!69}k z-^&h6rV9CyEvY1ShyPvs{gQMD+Kji!mWkBd8+IBW%kt`JbJOpyXHDreuHi_2Mz$4e zt8JI5_!HL(vXp&&Th`%3$v7FFmNE}!0EEHz-;9T)H;BoHde&~~6s$2gn!r9}JK1_c zFrEGGP+G}_;=Aq2nXQoF^JRjxJ&T#vzB17ef@D7#>QRBU(X4*1dG$Vgf}HyE(d;Kc zseD)SIVkpOO4;5ck+sG1M>CRwy4;2mDUo%y^6mRR`TQTPXBRUoc5sjBHJ{IvmOW0Z zb}!iPd5$dBwb*NpR5Q{Y1?S>KP9;f9HT0Mp;1+90=U{iwr+dbV2DNpBa06-v2%7Ik zms9;9w^loSpm2_|hLf&n43=%>2Y-g7d$sc2wNMnLVQT32Rd0IfpE})a4-hpqc%rq8EB}-gx^H96Y$gLf*^dy7qtVr@IC7GQmIxhn^T$yR( zlTjjzDk8ld>F7BV>=n&8R_0F zhW2@jH(1;KCTr71Fj)-cw3BYygja`r(N)-%-_-b^2gC`dyJCuUIGpEE=Yr|E zuk;UG!163r#Ux%&AS)z@SHkaVy3j!QRe#T?thwUP$p1 z?CXD)^mVbrFiM|6kC1GE2O$|}QC*`{%j9OxrCsUJ#f7>t663VK14WmGJKFs|%$ zNIYtdaLgyR#!>T#f!OD8$0tZYIxY4Wx#l?sI=hJ2s-B|2q`B#;O^(U-m_6OSWWT0j zHR#19Sue@-GtDi3iIPKlJMlzo^klTRI~#LKz? zbQ`3_Y1#-XtW5}y?@KUCc&N!WpUG^aFkcet$a3MiuK~LvII1sV2moQ5K=)Bk{(;6v zrW$8X`N-TREa0kA#D+A6nl`D;ds-=^i9Kjx(WT;e zQ|(O~Hy4|Oq%!NFGGlf`#?Z7uAi7XRXIU4si(P7~FsDbvcJle^$vf>8dh&Y3P+rQn z$|fy|L|@3n^D2H1P`=lElQINP+IJVx4KBc0B63+GmZB86R95eh61M;|DRF7|sHiGR zppa{p?B%V%DmRes^Xki{Pdvk!PGulih=oZ|L0^WMyjA?Vm&GgG%MJBJq*!bZqIE_p zEOY5FN&sVhB)@C_%bd-Ptw$R#HA3ipB@;&7pj2urWHZ#G z8yItBTEL`0U*JCEnoBAqC1oxl>_rA z@j`k7=YGP*U!XHLM>v`l&WTTiFT~vq*>wlSN=mrQob+U)dAUp2MmSoCSY;g+PfVT& z1s8`qC5Z@+ax%=doDOqcaG0w$LMmY8Gt#fve|^5GFXtFFowzf8^^@|QQ}lHj0fS}R z1&Rt}9i~85&7=?NkX1!c>$g$EhwUKPH*P@j$l^M{z59xABS_{%0V4hx4XwZ`N~w5Y z6hJnIvCG%C^%KS)n<)Ec&ug@2h~(AI#Lfl!u5gMiFeAlLDBvvih2$YDWYO-nAr0Z{ z`|NXmfvFB8$eTZ+?q;FV3rQ9vY1M;g#Din@?Di+$Gn8LbJtG`ejMik&w05oX!XkT5 z+A{>gZtFc2{DJ~);Rj-M66htg8}-3IB`1e5glUR{V(eH2o#j2H*%i)>Z^!%Y#qegM zJc4{(3b^q-*3Sw?K}0~BJta)bEqYRq3{TV-dmbAFp9MWUlovRO*}0hN7DQVaSKY;U5i<`DVPN?&^rw1nyjtZ z2+Xv!iW)Q;c2p7FTA1!=Dbn}9sXIDgDD|gQe_qCux4u#Rc_~*E5#cNCUyW*rD|vlf z>MNsU?Mn?>q)|jm$m#eX`nvXuW^6=jm|tc&jTDTQwGe3x}JWg zz&tQLj^hO8$;Srf?l&DjFmIx)^L)gNKFz?~-}Ur61?KwnIF1vT&p9?QAMLt$Y|MOo zx)V<`FmJxKo%Zh(n0u*d0x6CYn5P~anD=*GJT@>NobJTa49tUFPrp-OuKm(K2AI!2 zHZX6a;^U^7)17#lf%#C^)9)0R2d2kyoS0c38<@M_eEh(?iLw*R<7o!w{;sFrDKOWk z$8ns%eD1M<`DoY0V=wc^r#ta91M}v$wA22b0&_1lO(4Z_0(0@$z`Vcf;<17G;B+UB z518+q;4@`np2+oj?*J6gGq!BayN*KIC`Z2Msh1>)z zYeZZnH7N|d@Sz$OvVybMH(Sf)vq^HLuVD}ETq$XR(J2UA!`5R*URJBs>7;IDG9}3-y+h!v>gaMBnXk! zK^pCGK8ZTLRNC1B(WG(OWps(?7B922ztS?)>K)UBN`s4fwYt4%P!n+-_8vei-GZv_ zrmsdA3L%{of!R-l+R!;^JP&9kr1Jz2cIdbE4@HRpW0mwd>nT4ros4myUwKx<}6qhi%hfK%(lvP_$sM!$~PQXc7#vtOgi_Iok{ct8{>Z)hcSO z?4Te4AfUh;7z!3cT7_PM0VeDO0tc`s9gOV%k;7;6qB>y&j#mW66fz#*s@zdyYpvZRsoc@)qT3HHyty3nn0|Nmc zk<940fb+{o#T;Vegr-^#fjzkXqrKUHJqsJKXA*ZJ81N{#V>A}-EId`Xv+xw+&Qk%N zEl&w}wmenf+42;EXHU}qj+1Sm(SdS9c%;A4)eM_}QUl`ftStRjn+rcdD?O4YvNL)F zZNdUr51>t$4ABnhn3|3PoAfxNkGIayQAk}ZU5Tni0V9$S>RcT>rKQ1hDR@oL^^*mu z$->|%#h?kV)N_g`6mfKLND39fs3?r*99B00nJ#Skv36<@L`LBa!}}F<=Va`yF5Gdz zxS(M6I$0k}(X4KcdZ=of&gq_Q2@BJf<~})-Yb%-ZT=$oDKWFb!8lG~}?;iTsdfW3N z((v#^e)qB#0d7j15q|gR(h1-a`8m6+_1p%QP$b#!o{ngT#PG+i6uEXz7R0(_J6tEf zd#11LwjJ*OK*@IcO18r`cFKk^C~1BGFV#ELF?g9l!X5=Fqt)=KAHH`36k8agB?b}> zT{s#HQ|Q7!7Z?H;0vDzrxe)Y$Y5-+4TM6Of{Lj>wJfbP@lcvcYHE>(9EwV6X=!R@ zNvTO`sfnd!`hS1E*L6R;H^x!g|MmY5w)=FQukZCeU*C(x1u%&0m1#?Y8@|FV-Y(5z z6sxFwFf>6`P*RLbkt+x^%b;yrvK^q2NJw_ul2ug&tlPpNM;DF^3!Q<==<2YvWl0-D zEj}r}afI>Gasphs>`pQ`mp=$qnZmZTJBc@15^|0$uChBxZP`(6F_wyD)Y+U^-|#Z% zxjC*8$=pLRs=6=F0*@BqZ5j%`)u@Sh#E*R(jz@zc?M48qI;e{O?oWPnT{o0a#Gg#|HleNLbuAd{1ypIe0L+E*Lje|azM#A@6_uxb##p^9$Bu2EUBX_jc|^x z=I<(B;f> zMO`Ionb(}<9{KLO5+&INCfO1{zhv1Wy}*FQgkjxynnx4i9kPnq#ixJ50C@Vz7oNMy zM0@_gj!^9|{)dVBrGM zKa=Ae5|5Zf`UXN#uNV(?sZu3HDv3%v9$Ug|=PqC+vaUGeV=hCcUEIVPk$p|rDxA)q zQX-wOzlyEFNuMT6vuDm^RTkp+aZR8Gp;#dr76fAnzR}=1eo14-5D59Ouz{;G9hPIQ z!t0Sp_^vs!f^jEPAb5{xB+vo(WUV!(i>}8Pi*_+k^g{@U!3bQ|$WU})WysFvqR}ex zY}M2VX2toHc^2l7Xsen+MVTpcQD!W1v*MCgVel>H)1(n@&XzO{Fe3vpk!9q9AQZLS zhlJsj-nN!46jp|onbS;Fh&O~unUN}Vst*yW1E%X}5DP@(3vqE}M7)VBW3f@$lt9=D zP_VVuH^61hcSe$lR09>Etm#h7SWijW2RWy**vS%g%;O*;l0uC_|S(!;36P*fkqTM3I5w%LYJ z2eId{hg)?TP=iZA%)RsY;1qpM7QUWIoSd(x{yuB+`d@h3A$|I#p0-b) z9@UeK?pDfOdfGaDTG-|3%X->8{WibL(?9;4{kEdZ)35YYD)T-)mD=*36+G>qmicEr z^-Z51(bItR=|_4h)qaznN@Xt4(~hJpTppo4aWmi+WaPsE3+2kXuMHOoN0<=hBX97; zf)^SAShP^91T)z8b5N%u7y~dUhVB3$A|$b7temno5|_2%)57@;z@!l_-ppj3hDkfo z*d^A*fYvA3BfM9Bmw^xu!F^bizM0L z$YRB=x#%Gx%V={YEL!Iw?#Ug`ED4gGllQpTF5gQuA~-#*BJ_$ccS3J|iuKY3#TObg z7r>}SvZRlaz`~TsOU1m5;3*>zHouD2LqfM7TPS}Ok(agKP2`oRi(WJ%^1|mCE2>M7 zioAvg4a6PZaE-;g6)bH#?`TSQ;a4n=0@|u))qz0(T@XIYIaK{l*vTt`w%GJc>nVt{ z&_>I*hl4&~qc)ji=dssrdpz&#>@VC1NF=RQSX98Tq8%xPHUNC5;LMZ~j^tbJpcXv% z^CKChKAh_Zk^rJ08bDhDeiex6EOz{hOo;H&{pVCwKz+1hucE}Wov;l0mk4Ey9HucF^p(}ltc3rdkBpj?(x+}8@x7BUv@Qt4dduK<(2VfZa-sp-kG#IChQDDADndJyyvVaKAl ztJ#gI;zPhBw?CUS`l32aRJhVROEM0U5~L~AAC4ttjSFos0#4|oJT_uFc|~)K3SE4{ z04@@KluLXcU3vnD(22NsaGNWc#!lPqM6;{FBSpoz!NHqq#H28wNf@tyArsf)hl2&6 z0hVA;o%1eVqM8c-%orj%nm|Ebadr$pLvMFQzN8LbAA|Qy6F( zlfteBkUaWorlm}3p<$m|oTWS+5uvn*(BV;V5Pw0KSYU#nv`DcLjI~`Jc!^R2C>OjH zulWHSs!mc-HG@eLlS>&ibv!~pDjF(3?bFR!GNxXKmm z^0zxQ?uf53PL#<)l5qyOy+~f5>SP&zEbI#}WnN>sCKrc7O`2{GVmA8eYj#Yy*g_1x z8LpE5rKvPR!G36Q(*A}QXH*23gSPOt^E@AOpc=>^+4z1}vyOM68Mv0)e$@FTy?lwx zM4&p+3u#le&Y&2pv*#=;*|lKxSvGxccIGC@Nx2eH(K=-rnmW}iS!xDbdK`UWQF?u< zlm?I&Gh@+VKuH-ri81ABu!;d^S!%>G3l4O^$u2;lFqnV@I-b5WbOrF3v|v;!$07jF zp8K&zVOXkoU++N}wo%4lSXR@%p+oS^$axxik-$qu=t3EDi78+fsgExwT4N$!DWg7? zp4AYKz#k`S4ldD11400^_9e`dHi+{k!3dUINgnATiHmR)94rX2j$PS9 z$Angl4qsQ=7+*pv#cI{?bCZ@51l0=#u#YjrMZ zuNY-ZWZtYJU^Q%uM2cl_*c`!|7jD$buHkMeSM7!{i?-Vl5heS3#8WdRSwTvR)74`+ zx29oKrDQk1qJX2vMcU5q<(H;dqoXreFF@>MNarCe^Qka3m9wJc^z3(dFs0$5+Pn{BNSip^P=PAM z&dES!V$5{5eT$0$3+i1YZ8i?Jia}Xsnx%aFVV)WC8rMYUu*8?bgXxV^cED^)#SH#q z$lUN-@6q}KIy8r7v%MTFNI|Sk01SN%Cqy=CP!H)(8Z7c|YHSVsD=ba1I1Td0jp!D& z3gIraX<{wh1&BW7E*z09^P4UPQ8)5d%3Jij=|YRl_$ALmK3s}wgfTanQBCJRHK2lV;9~J{)gBj+1C7zH z(q)t-j|2zt_tiiLh8N)X;Yk(XGKcn75W}R4-UadXh#X`W-UFrS-qS8Ag}Nr4QA(+~ z=#~-|TA*Rd;aX^KEn?K!)qQHiW06fF$2{fkeZVw1(&n_!J>MNJVQWzkBhH_KHEfpT$Fvn!i6BNHy}%w;f(&x?{?0jVP(_W=WbFZ?U zTvRTbfDtG8dTna3O+ANbgx&6_Oz@ofJ zRO8$s_M{anZm90Fn!_5#QAK&OnMZigfrm_GY)AC<_@0rZK-wb239Jz|Ca8Jb89GTfyMvW#!ah*(CM&Rz%nN+Au-QI|zaR?i?yaCHo_#>Bd7bRx+z$fB|^ z$S-#VZ4cD~@BfeB`fuu_LuR=eP1WE4RSTvq&Xi?Pqhzzuo1siA5+(bc_k!sFag?Ca z=0(C0nMMJM7zN12Vx7*>IWh;4kztB|>G;e6)gXRRZoLr>W9p05*+k4*yt!TvP_Sf@ ztR;<=A6ofAa`gg`<>sg&vn5(tR0|gK4Y4{3g^MC*GlOXpE~mqeiLN#Uj@p3!Pbb+X z9A*mz>fCVT4|HY2kqA>U5;up&Bf0-xadT37yvS8_J%VeK*2M_`+IlG@!r`*ZNeZ(k zB3x;P8PB6gfg!)05)Zldx^#A|>XN&M4;6gB8M@Pa zKxny?SJME5eW7m#(P&|q*j8c*zbHvjHlbLp1gN;6*kk=iZRkm>Lh2dlwR8dOr#qVn zT`|q3)6#4l&?rzR=+hLO1s%d4|`dz2#fX$}+%KK9jTw9xK&Lgvs6M zM@c&{Z2FAkM+0LdAxTr#>gsSjx-t4 zuOQ|uQ|(XYji*4ZVKp%R27hAxsiDTetY%6VHz1)xxpsEJ^C z*t!?!mZ6jNI=$7$lX$bm@IbrvsJ4+yx?de^JDG5KcNS$^ za*S`c2%Qgi204@eNyIAThLIE+2c!kr3^d!;9jf;Hx}RhLiS#};&rG1S@C=9(LgL?x zUbsk@blBvxbO$CYU=h=84jm==3#5gCH(V(Mmc659W^r!ZJ!c9 z0}z;VttzB*0E44RniR030e}d#;KiRRR_2N_(?%gINYDro^F}nKaIw40h?a9kG%j{PvN;J@VOdLBq?Knq%UaU3 z?69Os(ps%0P3N!U+MTtD@w^%f8A=A*3=5JrdgV~DCRr$0kp$C?*kQ7QT@YU2V1TqO zTTHYmq2AC236xMg3)(YZKFEGir1VmrORjNwguF#)mhtRmj_$=johJ26`5j%7ib9o2 zU7RNM?D;iH>ZBw}?V>qb=#x@Cq7WT1EWW}oYeu9Du(tp>VLUHnOcePB7?8o=I6|?A z2%5~bI8AeSkGintCS>%B#l6Er(Zo#>_b zpLHr6W1QJ{ph(7jItu3Y+yfM}k#h6N!XGp6pA8DgR)(>WJ6Gklsko%2mRFl|qN@Os zWabpt-RUA{W=UR zA4dCETEtK$Ctthy0%amwS-fKLBe>nvB&;cvLObMYXroj*tN@f6JGfSZ%48?Ogqd?1 zE}>uI~XC=9TT6??Ty|(RYmpTx3t4khy_2ntRnn5|GUX<@%d-FOF&)!YXIr z9iA5Q%HvqT#AKbWg`K(wJBO1{bRIO$TrpoWLAk-s?-~%5t=3Y&tMs$EGly%|s%AJ@ z@V5?CxFwLHNzZs(bMHN_(MkdRV7cV(ca{XnuE{H0%o_nXlQ`K~h$-0v>HEvIbtj~` z-dUInEptQh6RleyRH|=u0jLGweDkeN5pJv{@4;rgCkvnDTA6;gs=lxDJfcDWUk6lBvwPFG@@o6&MLD0fLP@as_ns6|y3 zXdanKfiC|uuFg>?#1C8=lzUdRvWi9-w=5nF4$oYj?VbI}6PK2gi5!z4USDM@nN)$S zb@G_5Q^m?jYaPy8u!9z0jcAMG47=3I+J zVY9;`Ylzj{*;)0~^b}PL;;tyrFp@vWnt)|t8F|dI0K8I-x@%%zd(;Kn+DL^8VnzuT zYgnU)9|gRTmbY6-68jt_osyX8%@C?hFQB0vc!G%JD@!_`&T(E8B=;U2ouFabfCp|5v_$OgC zhh~@3o&sfh??(DPFj;sLL$1RLwDh$WZgMdzt#C%Q^eEs|(NL%I2jk0frnJ^-rubin z4E<BySzJAu^co8HXa+EPk<%Wb6oo1=3KDIVlH}UsDeew$5JPK@G#?Lc0 zH{-~)89Xn#zWBPlbbYyGxj9<*Dg4=M0(xP=|6f?`RR;ThssAWzq7wgTWSQx*L+jlV z7XL0H%L2|T5;_WSX=1f%rJX2~m7%<7%Sz5mZ?-9TII?L48bjklGX2uyC?A84y!|FiKqsq%wUi0rxgBaG zjNn)rp^Y~l=}_h7qmwK*O#&g@w&P3R$v`?Q?hLlNwG5~v+-qf^ zR(#cr<-PxW>vWOM2qS+-Nz_J6?d{yhb2OHQ3ibI;SAu=M-#$A#yp9G!`y>u1wZhYr zVxUJuL!HL;DqhnVpuuD=+g+ARe&P)5;g&A+c`kWSFX#d<)EvnwhBktO3oy9341=qg zFjxt+WEuW-C8+eQlagY#HB8BM`bJ$<*7#K`>gy^>@hD{T*B&H68>}SX7aOBFlR2L| zfF}^}G8jm@&VUbG&#HrM&b*;%Wm`r&d`VGOkM}5PSKzfWpow5;HtpR)IVupjYQA8ed z^Fl;Ew?8DPJr~kx-g}*lAQ~&$Sl#J9NQ;;Y!){Ka%Zg&zrrKMvd790%oyN8pCP}@S zj3IH*nOE%0T@$}@sC9I7|k6c3U2=&;$?cc| zVo&j`RbW5uN%Vk7!2(1su_-iZ8Gsm44I5xpsn&%SfrG~Qp0dINA+n;KqRGhHE*u6R zs&W4umOWkvzpZkHW*#Z6w%xIPLL#PhVALS-nm~~wX0YqQmM)JJK^#uWVVZpulR~}_ zmd{#SCGHWoQEZu@1ws>3E^}aKS>i`fMQlEKm0*^fUo4wnc*-xGkIOCz2QfelkC&M8 zE#`|OXyC)fkcSMAy4BLx)gmDCOwk9Lk2J(ZD3K`svi2hB;3xSom!<~1hsH6;McAtD zxS=CRipkSloUpuHFZw4RlwLf2Juj+~m0Vnk`AV^4vM^1-;DdF7coC2}Bpiq(0EN#k zxngy$#9bdF{BMiAb}p1%Y%nQgpdm*;jZ~Pj#B!;aYmBlE1#>AXIAxmrLJP%QnourX zos4tgX^}C*_0$hM=0*fT2b;QHO6n0~c+k)CCGH$uJ32Ras~uBnTfh1w5*o08u$^8J zHz5+)0!(92W*c{lWrb?cela?LfT6#Ulck>FkB2Y;hWn6`eEM$NDnb zr{%^w(LQKsGE67QGhtePo&pvM?}R9glP#-4dLxNp-iP1${U5eGfyTvEp}qO~cm8tw z%c0(E;oq#7cjxc7)r-yDiw7TnXa0?mUTo%GTzBQSFWpJcm@ZYuQ@?$9rF}QrQv1ctibR%nY{%g5+euT`k+!f6#K|vhYqo&Kac=wpB@JVuPS$oCZGvScB zz&ML7LlJ7T^5pOk^wg}9*J^{ziloVMt-eEu`Vr%8NT#ci1fLYJPkYrj;pD3Y2A40yW~YMC1)fQDnvI(6=Z# zgHD=WLyIeZih^JUtXzTtb07x=W3a3a;&+*&_-R#y9hB$Wf$jJgdS0$)O{b%wg~Ah_ zpOnE4h7t~u#=|!LEz-1!gEK9j@syI!coytSFpiLf6xG7ak4{KYUSkCHHhw--O-Z?n zk03_Ea0j2%UyG@aI-P^4NW|>Wo760aG@cen1XH(R$0_b}$TDJa&He@q%I)T+KXkZF zP*1ynNt$P{k*LlEa;$Ok&2iOHe_pXYFMZYC-Vq#EozvTj?A!MC@VM%{Ugx{Mj*qJ@ z)9a|~Yn4*Ydup0{e(eDZE|9Rqt`0T|-E4{6tB?G}^U=1>n9QVw+HHd&Rt?00S6(xNGSws1Fn@ z)rCjapPWacqm@R`-kA(@sFInjqAW$#TeyV9$t8k7t(8t2ViZGJiYhq=9J1*sWKX%T zcbF@1Xu%CZL?1|H%IYPhXjYzvI~h7&k&9}?q!Rc5W=mUXWdf+`15gNL7?nPFP#E@> zL}(0c4Cci6+Iaql4rvmTh zpPEu_Q7sOCs{sLu{=_;*D`dNw2%_mMXe*x{dVWZIHP@fqa@09<V7fRHK*|F1Viy+b6O#B7YVNp=e)?5n1imSp_mjXTA%}m(~Vd1_obuU9E z2_;Z^RAytrGIbh3!Chw0SHyBP(M$8gng$ znMkkzS(P!%tlDx+cOo5k3!K2rzYfJX=>iZB2@T=WwkcJ85?CsJ^R6=n6zp7nqR&BK zy`TS+t%T_8#lZC`=B6Ordbj`b$on2bu5_EG$7zF;LF6EmlQ<}khw@+Ma#D|4t5a)L< z0~qCSFe7|pqo+-RrU?bX6#GasStvXf1~%|fMno_cL(&`H5M&unhs|_^pu{y`(fE%+ zL1=b$8%upuQmYfd0}DFWl^#>0-CQ-bri77UF)3_ez`tvr$Bd`V?lhQk_`P3mFszqe z+~!|A7&i|L`Ht`ZFyuC{cz69Mp?C0#E=@;gl)vcGB{`Za8^bdM>)Zf{NO+UAHM}6f+Z2E%U zZTh<#vFYdcZqxs<5u1K-?>7CP8?ou_z1#HnHe%D??_CV@{zh#2e|op+|JsO6Kd*NI z=HDB!>HqBAQU72gHvOaCZTf#UV$(0`U4Z#;BQ||r?>7CTjo9=Ldlz8ZC9z2!+XzhW zCA~Z9=WfKNf2ntye%?lG`USn)^m!Yx>HqFsSf9TUoBm$!HvRmK*z|w(ZqqN=h)tj0 zyRd%YhBp0C85*+jzH`YfDE{I%aAcM`9{q)L!P5Z==*`ebhYFnr}l2paAbN)dL+WPKa&pBXF}?1aJc~*dy=-()b zOtgrc?GYw}Jo#0Ml*iQ;3lnvp-^12-R z+NHs!byL%rFveS>X-%zWZE5`bNS7*YEsH|qFTFEKWQEqSw#)}~T;EhwHddAdT$6zz1zGR~%T%2F$c&=G)DrCF1A0PxJu>LG7= zrqym&IO9QTLewPD%&H)&vB;YB#Jph%aRw*XS}|ds{&{=8I?eS^rWr~I-#z*9Bg7*N@DwCIjkC+K?9%2dVv4K zBH0n58XE(wSAqth1jVk!zuZN>CFtqhtTN`(>eC`n5f&eVdCOtP#48#NRw|3_AiPsv z>~jbWEkA?+q6`^1fi_ow4xx1p(mD2G88j=0EKE^$k7IJ%MGp~4)opW>>E@nJgIV4i z%$QIG9iR`CC4{5U?+&cXgheP3^M}l=xP)L1(e@$Wf!%|5mTC0to-Mssl~ohPkQV^2 z8l!<%l;#{hX=Wic2MkOn?pznQ$5!KDAt_xj3L8}n3GY74*bhjqS?b~YnlSRA_E5EB zq+}eJp?3WIwP2Vx1)js=4{k2%4!Xd0W|_wErz{5XZ4qlt(;yZ407Ves4xdW7Z7MmT zE_C#*;Fv%C;-E@Z@b;pzT4zBQrQrdWPA1umkHtWqYQ<=N;a0!;yj9y8}_`=fVhEWa%#(s2B1(IfK%df$8MWmt5BFDGE;ke0-D4sc&Eu85mYMuF; znnhDDsX=JT{WBea3v$E6Tf_^r0uU)df-qwQ%K8D45&~0+AzUNV;5IEeduc@6 z4a26)xFA7wagiy_uPK{Kfy0$*Eg-;FK`uhfgJmBTf1)Vs>=0yAGduEShL4g>w4sm+ zyL)m3$tPzfk>acCqiwFIOx}f){X6-Ji0!n(>4JCZ=;9F)x;(kb!bG-j9ZUq{%RtI> zF7hl;OXh0g83*$b)=!5X-(Q!d!22>y+uaOU1euJZ$R^DZtEgLZ5wO6M4l7v3 z%-%XFv!GPkUZ*}m?Nx-2kYKCItv9uyR3Fe;_;Q#!@Hp;|%E3LAIJv?q!^Xpc$fe5m zPr(Crcd0U2LOhGod$%VB@(`V-7tT~b2|yE*{AfRuYD&O6FCd6b2}bv~BxlLL#W*{g zTR1fBh*x{WShyg73fmx9R{-=-1!k+V{+%n8 z+nB>Dl^2T!udFj#T3IPtnxKniJRC%xg%|F zf{hj~=3kfc#C-YX%%Z>pfpjKv6sZcL8p;;`NmV9<0t}N?NdD$z3+>h&+QLjckMBz^ z+4PY9=4Zp_D#p7uzo43Z5XY$AAURh-G`O~h$W|;Fz5hEc`=$pn>1mt*2pA1CCluqM#nk7BH%5W&FLEPkeMHRKImM>0H-zx68KD;i2dkuz2}vtV(zr7E*k8`TnbS0T(+Al=yRGB|EY zF0f*}9f;&oq~oe7{;p`iP;+OC9G7&J@K;o$f7TB3kMmoOwHz4+W91cCBGj08DGh9f z8=HlF^$CQwjF02GW!~M&rPG2vXgM1t_A&NZERy#Cei9_?aIy!ZVSU}hQa@g-MVm|4 z#?HTPj}RMK`b2h^NuYV7f%6u30J_A~tYmYvUM$v&GQF_Condl^UR3A>^()1#dZ93! z7Mhb6*XqS)dI77a6kpSeK6>H!*JOcSY_1o++Vk~-y^&zzY?zxbbGE zwtdYIhQoF}ZC&%yg)l7ht}TiALnOfq0lKYDo|)NNY#HN^K1$57CSLqd;Znam7G~Y! zAO-?0=0~{@ZcJDkrDDa4nY5OdAYrN&mj>PdBSsfA2}BZ4e8&=Jf*TO{3aiUdGc<7 z4L1|RwBYw|c*UJx7ZgJsJj9-*a2||euC~4X1CCFF@6fHCMFi2TZ9iw8$bjalw*AB0 zJm#Tn{(SbSiM??C;Y?7tvDOPFNVK+cGf)<)ctJx>u z{nDwf{oM2B&*F3ichf4U67OTLVN%SAx3mio04j!)ApXgY)2F~*IQ^iAlbCJFW_^ns z0mR~Vl8=B4qTsSwR@5kO)F|JL8qvC$E?}2P5DkSOxp0;3t0hPjP11xaMU!%RKnnqA zo4#`0+XD&u?=|OokGl|?4A%>HGu|(OB7|mABxb{=y?9aNuvhT8T*W>LfTIj1HZLHL zB7Ql%0}lXR&wjrp{cdPz)$dpP?}BRNr)8oDCX-xJT7BNC!C2Nz0cm`Z8|jvkT|{Oi z@CaJfASFm%!Wmb59&$f$C8)sZ9?gx2(2l%cdY{&q9hz#5#bm)-1w+I=mOFe*za)92 z#-bXg)(F7dEq@@$jgAO|pvr}(AxLEz%yOha7*HOl`N0}IX^q2U<$9M+7oEF4 z<-vox4QU*M23lQHsT;M80_}oTOt1iMTP}qxFTJ%;b^)=0V3Q=4eWIlz4@lBYw$A2O$~4 zuI>*~lBo-<g3=sWObp#Rwq)7Mt8O zS$d18g-=O<1+$=mSF@z7GRo}dYOd3AbrVq`y}6`|(8;4zKE{=~kX_PJF*f2CP__U} z3|C}(*7b#Lk9uhd6w}KAj$#0Gl}s-dtT>SM7M~a{)H8o2y&dqWrZWiYYsfBq`2B@6 z(DjB+f!6EB9D3jYdCw9~xOxNGZs5-#CVl8;6JKY$Wq9I}5k4rVW z7v`4q`ZP&PjUlHoBU7?wXJdAwBfy-|5eBjw9pR07;+A9&g{^;+L=L-kY{Q$>Q(+sW zNgt1@b?cv}X&-aqHoQqaK!I=41tB^ER)w&vL9U^mDM>Vwokf_(<7dhS1_4V~ON?Ll zTpbGim%@rDV24ml=GB?JLS*6)Tvs^DPqGX69`>KZXI~W3q0&ky3OKHS_AYe?KoGL# zfbHzi6w}BWr84$Kngh|5&7y>MCGE?WIJ&bLC_q?KfJ}S21O@3y9fkud8k$IMdUA>D zsIU_asEAjFkSo*PfZH9K4wK7!Om?0|3(PdspIRdYnKoo6L*t+8Ko3Jk1Kni+7m#bw zA+EfXs2D43=f1;?bUyx?@Y+BL3K_hH@JkrWA_JscnvhE3Qt~iVloX0(*pW6k&R>=) zIvZR6`&Dt#K8=YR)W8K9$_h#Ws{8p01H=UL$)tej_q`;~loUY%T4{lBrH? zU?f3NUN)pb-AF>IEZ3lqH9!+Lq&=(Q+9z&=_DtA_?U}F<+Ec#~+f(n_GsodyuTPNf zi-iwbw5xR2hC70Ig_a50Uocd^oUJ&AG?2P);}a-DZUTYf4MV@Imt3_D7?wWvJXyG< z_8IB)hEf!uH=JvWNqmOI90}q(!0<9(2%*av36LEs%$CL&(P?5dju<0)c?K)p)-8zG zVvLYnF-8LItCr=8<0S)hnu;+JD#l3AHO5Gx#V=-TElD8#kd}xU^1vBU{0p_lXbWhX zexNt8Ls`8V!$n<&etPE;xBXSmZu_e!D|w6nGI7}OF@l_6$SbN*D8tHgs&f`>iYzxn zcNHW?UuX#CI+^^XUK)<;8N0KQb4v6&yz(9dNG0d>F1vkOvW`&8cM!ly>jW?Yh1MPbk<0W*QSQTxsA>2$4P--GUyAAt!~n z7wD7e&ebddqI)Ofqs8mAkwnJx78<56zE)hB=0|{0hI(1iupsLEnT&!=kxnR#sRsb% z`L@Np>M|Y^ZdUXtrQkYGe7c=DC^)dubvn9WPexUWj78^Em(j+XVIsBkX;v9QP-O9>d~8r* zQPv8U=M+MnaY7Hs#J?7<^KgUUPqLisOj{5s;{;YBwUO036*{dFo{8(d!lRj;D;$o! zt2vET9i$O_(K+D3qIE*dQg1zr8~~Zw%^;5SvYrX}QtO%KqRKP}&U$7T!whD^=sjA` zW-^uPUgsiDmvqj2m8`_Xd`1~KX^@;Gx#>Z~BLc>~{)mxwej{Snm^o`Z7~#s_u!1#l z%sQr2)`Y=(VV(p99t>@n*+zy|y`VxDHxn=+M4!BU%Z3L#Dq}H^&05RCk^v_==2@7J zNQR7#EgZsb`hu`fV7I7fY^}xtsg)F6;%lOMF4Tv4t)(bk2_X9PmPH|y76DDw(K&)n zryXMLRHG)kU`{m#B(;~0AGZkTFF&U?m?Q8y&YUx)N}4~1#ZpmdGpb}!B6^P$&Zg4! z)4e1phN2pJ;59IAX)(bX&OA=lULRfp2u-P{Acn%c1IKhJY|wSFKA3+UXJ-~06+F6s za$!4mCfJdgHE;yUT=TK1f^ZnT5c&mF1pQ)IWn!0~DdSEFb8ztXDla)x8W0JVM7oUa zps!tQD6}%JpgYFND3T`gFXZdsQWR8>gn>lhh)rBQL4u;;pj!kytwvUoffe^GCkItr zRIdhw#p!VJOuv!^yXh&J)hJ&LO3}RLY9QKfH$+A1p0bJaZ$f`($B@g>owL-Ob+#fY zwj>;+DZ)t^Y9kZyRJWZEvN@!F0%heAt6bW!?^>JDnag%-)GU4do3qD{qJKPO}(7jE*?On>8;QH4to7 zK%b>Kt!9d}YC#U_MVS_CYEHz5P8hyeZh8k!QY2ku=dW-c0_Q1EmQSh#^rTQ|%~D@x zm(hv8fxa0SG3Q>j115)w*|Fqp`XsWR&2$=Ef1!0(uqBkLBVnwmR+OJov3EANs8`Rj zY=)Cm5{K2cG~!0hGa0$Va&r;y z=%w~Tp}}#TSy?I&b(Y}|b&5DnczWco(f#AUn1!lR1*D2DM1vj_U2=9n2}$<&8;Dj; zYMSDtmpe*6rZB8QdSsIG5{MT@@+6VY21dQ}SSB(2UEYNUCp4lqoOe`zzU6e_5xU-d za)*5WP)s+Kw5izIyun8@p*1T^-nz2Gx#ZdleBZn@s?NNlZ}P=MkU@@+8;2R+@Ywi( zPwtRSUXd#m8cYxEgm1ZlAT*#h@f)|rh$orNH$f8VBsslC<`vH_KMQ0ZFVTuC|OqM2+sJTJ>OsFZM!Ag&8$mTlJwDPJ_t=<-~);^H7 z&7>k5`S@KEc6M4%!tiZY~fs%8I5~C?6xpFzPr;RyhxuHW0QWV$rDSN^fV` z{xPqR;bHPJzRAyELsb4`=`WYasCcoqfr5DKxV$8=! zXhWb`bA%^(jdwximgN+QZ3T;smKPVcC7ReS9S?CdB=Kj;(9R&)djRvY!dSP0mItYa z0TFBg%uJM51-%uzPOT9|XO|d7$&vZ=f5~)gWbq#P+DXQzdo}Es^TqU3Ryux z&JW*)Mpg_u=^M=10SWcrF)Ulo!_0s5~8I#tO zJ3O;5Hcg=Idk|%N>uKrAfGqnkz~G?s;7KW%2I`&jLBaHN(=R}Izs_f?^vWuYY-r1Y zOIoF3BKRspZMBe^YB@!y%FtICa_6elovV^N+nU7GChx6UrJ-Fj7-K4i( zHkSt0V9`~{YSnNmynuIf@9bqxDpmz}zxyp$WzP3fuI{dv+-X$xLY*yg1&KxP&h+M*Yuf$4p zT;z=V&i(a3uV~#F>s5X`i+nvRINmMClr(f(jz$Yg!)_Enw8772N*grnT6wnY;*0Ph zJZ-(2edwB6-NT@CWBRV_#**=@nQ*f)I0%xD&Gdb>TMaya+!{tQ?!Jwfz>QmmOo6S9 zWJQ~ah?y6Qy)s{y(D}M}q9yuMIJq=?4u4Cc5!LX#L22g14^U8P=BUW8Lzz61%ir!0 zEt4T9U5^{70a`wzy?&>h_(sDuKPK7_8e?l&W!*&iEQJ55g9Xk2M}y?bBAv8 zFPa=bh#2C=NSQQ78>!WA{A`t0Z={lM`^PFJvjWe7fyv>wIh`?pAxjRJzGy*JSR1$_ z5ah+dv;=ru=*tCk-jY=37t9xzQ_L^$km0Q9kqqXifuMH3-ChQ_tpm8>s84w~+8#wHZH4)BWSCY_?~MU;aufNu#r815rI<|ilLQp*LfqGSF(f#PP&zvg10QFbW110h+1TKr!*lpO5RZ}UwS8}h~t+X zYN4^O4mAb-2oe14jG(da$HY_snaCAlx0M4Og-sWu?-(l+;ZJgHhrl>?DT@DYC-pdo zI0BP|Ibg?WRfL66soehnLiv4oEwi+%R7dGN^<4ZL@#>Oo3TrO7vayGPpDYz@ds{-{ zu~cI?1}w4#`$=52#q_nBX0OuTH%i40b?rTB{fd>BL=VNjSSof+!?60+mi1ih2c=@| zRJTwbm#YrKiCwrPp;kY;A5Ri0oKgY@KpD%qrq`_Y;D{XzGI=3fFFX?0+uyG{IT&-g zob3ys4A6-dESbf1d!LilkHoN^=k0^Prf}B%2%s!DoLX9Z9)Pv@;2hQ~ei02u@Z1a7 zg+{UTa&GBu#IpBZP1&Vo4T_U=*BJ+bxLb+?amfW8e3Ewdvu+oBEHhcTBq z1#UC1A7iM!=7MD?b#0AM3yM$kUIs+ox`o_%uaPxbhR#`ola+k3P0(^~AnAMpi&;`0 z-Iiv<9~)f$0?PYumVfoeDF0V%thT5X3<14o8cXA|oKM;Izon$B#-cc}v{G&S-3&l& zrX-=fnkW{Cz5~#(d67S)u!P7BT4Q@HU8I;AgC4mR8?SRrsoavp0l2tAS=sTTP~0?A zoo?JM70K&Tkxu0BMS9-GVeF`;v#Izi(=MosKsf%PDT#c^g4R;W0@$>%j=cDi*J%*G zzy5=;PUYVDUn=+Z^)GiFNBHUg(g;8DUu*G;|D_f`y8bOb3c13t9JU*a+#1S(nk8Xu z5L`!S&g_cHrndmE|0L&n7THMIG_r2ep4O&jJP}LzI&zV(qeJ?(HqF;j3mLPXM-*Bb zBt#|0y10$bc)}Gq!sVrI1%v3c0--Gy8%PABG{hu+-}YcwAV?_OwV8GzwLNLcxwnu< zgfBSGF&(U96{>#6KP;0MohXapf2fd)lv-I0zLEQ+(A%=_bfkyANnA+P5oYvBS$&Tj zx^o;xv{H^E9tW2Ao7X7Yr3Y@qv!6$o(3sc)2FUr~A)4S^se$88V+s1v&|M0gK~3YA zNJ$dg!r~+nS024TmJ*$j$8Vgu$}BuYX$#}qLA*L}mqA#s%`hI%WI|jqWJ0f-fo1)C zSc9I{TvSWR<7bi2Hg$K354Q;dC6=Nm`rZ%qRt0qxc|M*C~BF@ogvbW5C{x^U1V(@w&D9a6uUmP@(M_ZUN=u8#NnD znQ)4B$>6eEI`vpvw`eZ*idHN@wpU89tgXHk2D8q{U210~?Zl4Ztmj&{^p0{3GQ9Sb zn&{_4xhm#2@d3Q3Kx|ntEF5BzzgoyjaURlJtmqilEMOlFW*H3i<(-OtH!le}b9aDzrI+8dLbZmI{Z z9vNCgYms)6$fRyNq|^k#0npYdrkG7udB8{jwZ_^|n?@$8abdc_z*Rtl+b8BisL3+G z;#YwI1-|f@bnGAkEjd^!EYC_V1bZ~}qcj)lCf@D3(0hlQLYap{JHdc9SJGOCfmpXC zWg4i86As*5*i6tgVP5Q2iX`R-plHmQhF!9&?V;g8PSk#bpZG*du{dpNCF8N7JWnNZY$6~KrTd^dt zVh?s0&qYYH@uYr#d^zo?3PoQy`9c63#+S+Y!cwJ{UAB>l@B;6GP=A`J)`?qaZY-#S`!3`}hF3h&(A_3I3-T zXh-8fo-8yld|WWu?QukUUEEQAw>j$4#X$#MShc_v`RuIXphG1&YS-w} z0B$FN^N}M47iVrD`T=oxEXtg1PluIuDG>WR(J@p#y5W4HSnYVGfhCm5EB`u38;hI|rI*BFEME#aw(%i7P+2 zH2)@fDkFYjh(b)0;tlAAvxRKtG-D<`c>A1*C0>JpiRYYR@BnaDP3}JPj)I5I6$%H^MK@r!Zg4&hjR|*y#ddld zH*+sGHq-_6K(q5Vnk-cTFGghKh0b1jGcXQ?1RAxzYH>*x$ouudNGz66Xdph?jWzl& z$Gi7+Q6^|ILOG+7bQog|tS0;KML1G`LmDzhANz#y@yW83vpxVLchNwKDlQC(Fo2)A ze3%6TJ!vJ_SzBDNKZWiTQb0@3S$j(WyksCVWsDl28p@foU=eN*6?7Y+w@qx)O{tVM)_Y8_f@QSN#f=z5U z-$cMdBD|^i$fI$yHkdXF%|gOD^v-KZg5b(8PiGXYOVWp(`{+-+rkE1SH80(NOnzbB7nV# zd^I*Yeq`E`h{$TI8=IiVu}Ok1xWc*aL?J&p+047Gfu0<;M`-!X0grq+uZWt++~*K{ zjX*Xd0{eMOXf2$A(szgCmW3Tb(m(0A9{JBXoj*_;&Uw(SL52%ZU~B~`fVy9H(SO2QzMFu>0o!WI+DPIZA zQd8Vdlc5YZgKMFfP_WlPDe*Hh^P0YP4-FJR(G5Dh--Q%u22chQshfq(>6$Y6?F*~P z>D&bvBPj-@ijd2I02bIYm_YNsig!R^w2=~Z`+@3Q?H&tmPCg>ec$EC?tjTUqhKp}w z6f7lf74wBoFR1;{k;N_M!R?@aDx6+Yv6+EFDmLRDE+=pynxnU#@My&KQRhr0{!=^C z<&{dBNVBVC<}-|6Kr6JGF)edWGJ)b`i9p(zrd}JX%S5Q7Fb7VIKMcv#&B4Kex#{Zc z96*)^AfMS226^Zb$%VyP7^E2o!^hV}76VM6L`ME;ADHw15$x2k>8dc4#1YlY^^2ir z(tMa2!$C}*589*oQ*4^TP|^wfNgUr^Cc?_iPhds3+>t&%sAqk6C12RhL2ik-J3QzZJB1zRU#FzW?7uyPsEk6?MYXIc3Oc& zvqBKkbB+gn4qewRM~Ba$Yxf+3*P#oYqq{foFEF~~Zyln-x4hYrQsIQi)Rj!E=VyeW zdCGaS#2$KJNm$?+I&A(=;1Yxl0$S^vPd{>au!)0`eBm}>`z)5F0I)tZQqReH5q)2rLK|8kXfL2 zbz7i!+X6NHdoij#;KJ%0QO3^acJA?H1MGJd_?OoAYO^Px6(v^#Q&!V#1tnG!?^4@4 zQskl;wZ?{p-3_h`p!Em2b+pJh5PK=9cp-}I=_bHM4+{eV2emd_RQt9GWLkUiyKsN5 z<9l|642_K(YHYwF3tX#0(>w7b-v^-&VggoO-6hVT>+1dtRk-<0ks}SHXELz}jlzo< zrd(Y*`TMzawq6PYS5w~d0C%`-!qpWhcgJ-}S6NE8<_7j#$8>Vn%htQPj=+g_O$c!D z&oJRSpsYgYYIpLX&?&R-zyg?YRxttWADGK^PyGx)wPtvE%dEkI7bm@?@FM6 zyx{L5dzWhaQtE;JOn9mofE}1A!WskSU;~OKwx(mTWMtJkwl7YLM0O>V$k(Y#Vl*us zMQP^U`jJ?w2P;YtrVyTmOu7^yxz*7<-KVK0+19u!ZEt>$SX-0PCur7^?UFm5gY(rE z=^aT%En?0Lxn8By5mmLwmWHtByR7w%%O)xk)S(rT(qwpzeT3tz2PC4bQEe$N_TGLdlLz+(qh3&1)#hiqB zTMO}m{78a277Cl%n3s~_OgSSB6+WM=d6AY)0F>Y*$iWcZ=yZds?aI&Erfc%;Ts z;U=Y4NNJ!|x05A^ABd{ujKX*6+T^Daleh2*UI>E)$u&B$1gTvthU7irL7PC;pAAs& zD^NW7()VoG_Uw19y$mDLmGS6rALHNTsyn@Y@B$K#Un;meWLUSUcn9m1$#d!zz`+V3_aUa0hGsviG^&rk=4fIncBHSb>iT*Mms)+c6_zHu zy=$`c^&MSbZ%1xNjO^l-GC{#%cG{hbe~>Tu%%c8Q8$>StNv_A&5A^)H!@X9oIpN-_ z@#DXZYk!xr2N$+>Z-pw{{xrlo*QR)9I{HT5R*lR{V3q6;+{c3ITgps>Wh4?{Zo*5N zeO*+Dxw8r4B88N_$Vy0sEqwvX?z)^c$&=84u#nU;WuJlx#&WQyc%|NPa(gD+KvfD50 z`uuXPu(>LtNcK#?zWSW7|5L0;vcaYCH+`azDa;QGW5rV}j4hK7xR{Pf1(9%vTuo&F z-qs@=O~R~7rYi8L`Hk-mJB#9RTA|YABiZG-%)ER*+%?3X`e9~cQW(GAmxOqRvyT1y{x&3x#Hx{l?2kqw@eFgXRmO*L>y`y(C5 z>UP4%=0WmJJv|lJV`mR;$+iZ?jwpqJ-!&SCTm~#>gDfUdc&_D-&YUM{^-_==UsQxojVqC zL1@1~Tj7rTqg^Smy(1|6B0s*dxphWMeX*fwX7iN#3B{KB@iSUl8)nuw&Mr2$6erZT zwzV|R=0ja$OMTsh*=M)4%&4DO*VtO$G^4Tci|d;`m=?r=e(H)N8d|3{*3B+9Or6$P zKefK8t*))1xrqj}&1h*-g-yl!mKNGDqp5z@wEFRF^%ELr4>`WIzNK}@l)5Q(&11*a zHBA|^Ys-w*wi(lgv^6(3j-OQ5(9}AlwXJSkWBuS+!}c1x*B*oGrcwUj33V-JH8c%r zY#2908FX!J8E^M`*;3asdq`blWAk`>O{W{0&fK-7HMpJjPNTgqRbVLQI-W!{?u;X+ zskOt0&uBWUrEc25UCt=d_PXL3M>IFppHZAy*Epj-*g_rU2N#84BOr0t|XbaKT;r^<&R!Xq!|VtZAuhY?x3y^w=YhC^nCq%rFcuUQV6?tEQb;*U(sO zYc8sZML#jai=?}s^gFMbKApSH5${sn@ZuZf8%jR#zFirDU@QN-HP^oU4&ztvxADJV z=2zweSz*YzXS(@zZq+$EeD;vZt<6o->e?o`;jV9_V?(AkPtcgOMX?RXt~pnH`aG29 zov3Cze)Xf_?8oo+{O-VSe}41+cSo*D`w4zO$*+F8r?1TYzXgh;Y43)DqQFZ(DJW{3 z^pk>QMUX7UO}6mBe(O71!}4ynwxu)y1nYA`y<54%i<@p5%;LKi&IMdmnx*1X}2v7oNv@ZzB23i4`BKI9s$p^Sx{Wq@bfvV{bL%41t?Yb)a+${61aVjSN# zwzH6?8B=M=G|JE_U0WHibuU9$j0w4${6aQq-_vV426=#L)wk7+hzNO?7#!a99%JXM=)&eb&^7;ujhSMryBOX)gXSYIIiVjwT;1b>o zC!}Sx0HA{Z^m&$luAe%sZFW&Bv)Iyb=A^dt`-OZLAxfX;^DGLGN#9sMv90v|%5Lee z@abFXn$D~*w$6t4n3ZkcfKA-|rRCpB`fU52@Xs@v#IdZJe?qtXzv!0#7604@%hjaC z3db^j%JAY%uUX?tEL|ICKghPJU*Lb1MiVz8V%VmQ*Y={3z$CTa>U z6eakG{HJnFpHoVkKBts6rI2e|yLFVEG&UYyC(iYDbzTy{2i~ z`PNiVo4JniY11~RY13<(=X{sP%Ad2A@)wZy%r;m4E$dkRr7n+^|KeK8zg%g3`ztED zj(OVd^qRK+t1gd~|35xYnkK!bX|E=2qi_GDbu9l{m&eM#W-a9}R9fHuW$Re}w_P49 z|AV!Ze+y~rnkLu;4BRXZ%6VSf{4Vl&RKXaZCmomcnvTyMq(y)+_*p>OEX=2A(`%aN z9+$`3f4|R@rb(}9+QpImj-`@)|%vB8TCOE-^$LFADz^*Mf1$q7yXQ4Vsnh2y2tbfQ1PQ_=1(&;Bn-=BNYfb@9)_lIPjHRdDvP0LVu;B{Yl5X_?fZ8GV1=YA)CUAp>~ z2IRailo)5|Kk3Cor1fdOlz#1F;`rVndLt5(2nrN*Kf&=3?_yX-4 z3xA=RnATE1b8HXoY@IQ#skvopT_b7IJcp4-W4F3IU#M?sPSYMvS_!zTOWV*iv7xD< ztv*eEDCsqit4q(gmD(}dw|(L?2zAk1{qnsx!A~<*I&ZcNwxO|u7cmRuK#ea z^~cPEdsZtt#6X#F}5@;!%d8;8{amA?6Zrd_h}vCV}+L*nkLlGva}PM zXEaUdVeZG%)aD^A^=CE!*0XKy&O}QwW8ALeo2L%mt$zIYy>{Pcp9$mksUJUV_s&Iz<@ zF2BMVt5&*ZZN^DkyY;6sj^+1ip7rzpiURC;+B=Q*rV23OIQ;-NU6fkKHczcThm!?UtY1-Lo+OduGbu;T*pCoz)TxF?8EC=UG_F)6g`Q^b<(GrgnWVo1QjZxt8=lRC>}aC7s|WZF71}+y0=^jf0`7 zuWNdPwBkw9H0d=>`xxJ(zy4HROH1ACvD0TXx7Ckzy4qmJ?VR2x&68f!ysxVsmk(*J zrR_M+h4i9#>G-7Aw2t#i z>EUD6(ub>*)+-$H+dH{BEib*M<=&{Y5*}HYLrJ@)xw?b2n+&$ZF!uErLXZQ?SqnVCr25td>b#u%(qE+c(rcRkZnY16=Y$3s9mcBi;A!$~v4%Vk zr+p$#eup*VnBOR^)GT9R#z;Su^lO@jzh~1sz9u+>JZox?l#o^jMD(OcyPn0+m97(w;oyy8XM`hlB zn)~CW^Wl1Q=KV3;A0u57*JCs9kK_LM%<~D{A7t8VM_Y&^^e!y!$_)Hh;7n^~WXYi(|v(N=$COVTvqU{umf?U5}br^5mI zr^6cB+8X(8@7%)?&29E%e|)`M44>-Cl-tib(^n(RvKiL5h>tpH$JpdhjiKfrU=VIcUr>%9d^@y}rh?AUoremjb9HIy-DEoF>bLm8*@P5eU#W#~s&UInKg)r`{5!QUA?r*I&? z3eY)m5^_rGG|Y!K^XZKCFxegqy26Id{ILkjjrB*1GENBUGIa>nMl{dBwBbGiiwA0@ z9o31*js&q~9*>>Y*wA)h^VF$zN6)~FOtX_#AhDr!ie)rFR~EZT+D0_DrGPswQ?Gc$ z@tJ3}L-UmOU2AS)=J`zSVG&E;tGP#p`@bU2dKNR->XUIWi*|?xZ_hP-<`@~XTBgr? z@+`PapNI1-nSWhr@v3Wc*YWEow3+qJOi+kzLwDV44{x8fB^<1zAE(oveISt1zo*Z; z!E{M)ls@mvvvf{pS9kFiIQ5Hz#Rej0rvU0o~n3P6goVas^% z*(t^S_A3tUp+g(b+~1=HqOS4G<`$&dslr*06yx9=+Bb=LDC0VrU;XeHOyReYU(w6e zz5lN^AD-KLDu4G_*;cm|qnK)4BeH zj)=~uo&e~s*2xLv(AE>=;4p9(@{Xx?Jof~y8W*ig{m4C}IIY=0w>V8RYz@=&m3&N! zGg|A5%@gJ7;d~qLH)%6ZkK$RA8pcm5p4B{~aY7N+-tx|9YOR}Ck0(k)T`Op+h($@o zb9-a0^Sz?xfQm*8Y~t+~uy7d-5)li#yz`}|##fS;$g8gJM6&tGNN z`k(zw*W%cPQ7zXMGe_;M>kU`#FqLb~tJe&@f$Qa;SbG0+T=)3&yHhF;4BD6PJ^SJ0 zz+mAE=byO8%magEN1Qoz$@dNn_PgSYS5ErFfi;)hGi#^Yw;6HNn}2-nl^sTp`0}p~ zFMsN-_7VR$^be0kgYOw}_qD&Cec-IWjJP5iIOww%7f0@y+x)@ z$aA;)x?pgemgRc4M zLDesRXW2oyIWPR>n@@ju(0PYH)>2pd`Ga3B&VK6sttK7Zzv09K7jO5igYUe4+s{7p z^Ismk)1lX_yzsm}qrN@n;kS1gzu&0Ww%=jzf1TDcs&3)(rL*4s&ZybT`u*d%AG|o~ zu(O{!`O!DGJmgzr4t(oJQw}=h(a#_E#<$Do95QC%-FJOv{+)-kF1vo=Zm+(2$YsMH zuQ=!Q{)c{J!a0v@-v8)BJO1;#nZK+%|Indlf3@$y_uhNx{!PDYY`pueLx29$z6&n= z!+_Dr2is5n^Y*8V{_cK9{c*RWE+4)1;jf&s|AeKZPdww=w+}!2{n1kw=bNs7amZmK z-g)SiSN=Tyux;*mXQ$I&x%#mF*G&8NjGdl3?25XH7dEuy4uALk1OA*la@gT5?_Kut z(s50PAN=oqHoxybHypnG7nc2Emj|9d{JN`$AJlf+W=Bl8?v?K?ySVm<{T}<>bNB9g z))AHaeD#usf8BP(%?JMOpXcuQ$0M$|^4S?T+_>$L_x$*ftuH?8up_tZyZIZ>-G1(o z+kSn^o1g6e!y`}q=vPlac*E;Qe*MAo|M;VkRY%Po@|oZ6eAV$sjs5pqN5A>OmyYUx z?OtEm=Jy>(jT@1F?;G2^d(;SvFhdi=v%{$bV`M=$&A9w%&n)s;toVb3Ms zd+Gk49^JU)q$lueJm#^tcm2u#_TS@}eZGJ1)RyXoV;(zsmrb^qa@{dIz3}7uKi}}o zF$0bm_~4BfR~);j?(g5f#;|US+wG`_ijFR{9P}MoAHm|9s7xC zkDa#3y;~i(^I`kkbMd5ukK6US3vc*-?b*kj{qU7LFFNE0$BkL}ep9~}|8!jI^u=HL z#8-Aae#Jp|ZTrq|k3Rl}erLS+<}nu>|M(|nJ@dWS?mPZ~tv@&6iD_>izxfM$?)Tx7 zJD;%C5%ZqhujbSfo``>W-KQ(AIN`%9A3b>Jp^u!f-|)pJ-+#@&PMA1g>&5S0KlH@* zzi#*G*2gEDxO~O6Z*K9Qub+6yoe#ac%l=QF_~vP!Z@v5Q{7F;x3@)##+vlW5YJ-&x zKW;whzFpdf{qdO_Px|a03m^T>vKLO;GZ{5&%YScv@{)mrU;oRP15bXt<-Kq3yvMAQ z7hN`Uiy_JPPkwUyTN@r&@yC-7SlD;z8#ios%8|>qfA{8#4?ku1orba6olIcLC} zz58$Tqf@>$_|&p-zj@=7^FBD~z_Tl=PrY&9Ay;1Wr4vrQWYc|reBj_qPQB_+OOHMD znkA?1SN!3MF}Z)7diX6bSMM?Zb7O`c^7F4Q+`VqhoZlw*jhg$_F{d80)n9ga>G3hM zTSxzL+7rQPCm!|t^20yed(`M{&&#)8QpFM4>x<8gr zUAW2V-l5@s>=C0vyzPjCAW8WUT$&{CV_uAOM{^*I3C;n=uGgcmR z-Nh$-`B-gd-=td4=hPpp36jOeP9=g-{p?`J&xLG#YfKJ@9jmH&QX*Na-m z)Xh5kfCu(mc17KDV=fzX;P6N5D)+eSpU*7&cin}-(_ff>+HT{%8_fUut9RFrdp3CW zqfbYc=Vxn+78@%#DrOQ4Lzps$k`K4SbqP+lfQQRguN>F zTK>-mUY>B^We2`6V^P2QzOBa{@yrWH)W7lA%6R_4^XgZ;zuPwT+b^!Kn|019Kl$X} z>h~*L_TF>PR8Oq@`44{hBRT%xbJT-jeBU~uxls(<*I-GW8wuP z%3eMD-a%(Rd+4Wb|KF8$XI`|^8>jqW`q$2UeZb9ce`50|&)oW~iW8q%5Kemj%Et#) zyuRn8&4&MH@5k$>Od2)f!*SpGmu zU!6O-;-xpQ)&*3qs96EH8sPAzgAy4xIUyO%g<$Z#n$Zd~z8FIPq-k&_MFH!e) zRqXUM!fQxNrl0aWYjR<;r7^|x?O4z&Ihp&OFV1tYc5bbC8hkFu_1Y5mdiw1^5p{=+ z*SW75=X%|;ysD&sd_u-G;(cD1-21Vg>5$a4f_J2$7e)JJ7w;jTZvMvCMcx!A z0;}Gh8ugAVGrq+2iQWg_^X;XluZ9nMkk8415nrDx*~9N64_EovZgT^fJgt-*TV&yVoao9Oqxqgy&PVf*>~lJ^##;xRDv zlho~5nsq$q*J>SfX6jytA0afkc=z)aztee=Nq&RE{vOdk#SPJx{(>^?d3c+P{3a&&$^wrC`O|gFy$JNEPITBP#0DiBi%0CCJrv|# zqhyts6dYvlvNJ?Mu`Ve5uox#r>}-&Q$=Z&CbHw1uEEV|=gZjZEYUjx3(6PaX&hL(% z(rgLVQTka&e|9<8k}BxRK&(K>w|MqL`^!y2ei#m(Jx7xkq9l61tBUSHNcUIoW+TS+ zknf+<9IEvtL-%A6@19M!4W(1tQA_2Y9jcQoV%C!}5L&yIqrAz54$JdJC8*9QhM_N_ zDv!Q&4VyMq*Vd~n4x8{A;(BX17M7MuF~cd!7~b+c%I&zy{&11BosVXF{K92@s#SS| ztHTR>KE$r{zX^vZ#6T1aMv4D0O8(z6Yk_1B&?p{-x+#W1Spq+w3|Rvu;ZA^Aev2Ol zSn4<24KOsuC8h5JSnfBhLXOA_$o`818lh?oO_FG_FF>H18ZkxjKmUs&BS%wEQc=^; z{>no~&%nsU{O=3+uj2oG&i^Yh(8LcC)BP%Dbps1v5ZDVU^@8J9Eu<>#8b?_pgKYbLW=<#(1da=z=8rgHu+>@SN z7LnThzp}z>46fG$JSfr%Zz>2w2lNo3JAr)Y_%&?@QW_U$S7#qS`v6;edpmo(KlL;C z>;ahy%;%i|lfd2^2psHvynsLlnyUj=v=<;D0OgH8|AIt=E?|imp5Q}?fF_EUyCV=+ zLsR=d3jwQPe6C=k&u0TB|Gzjj5c}K99q2ib%HgW-Q5uhSLo&7@$Ntp5vQQ*meYP9wN zKB#tZ+b+JYZhYX`lG<#uJhJk05BN|g3`kqy@* zkOca|Z#W%<|1QA*fg8 zdfMrIV^fMd&Ru$X=+G(?+Yj#}{RihP=L@S2j0~H5;mqS0gH+WVO696Y8ufakx$CZs zW!Pr%95>&&Kb@f{kL}*kz?V@|VH2TxxlDBRZ*fl5rZ&UbcA}SNE!Z%8$~*?k(~;$` z8<#YX-^8ik5@)|As5fxpSo*0meHS-}zR{>qz56p7cWep5x(L zWm^`fIZhOc$h+4H$i)?Oe%LyC1V72Kl=j7hJMBui(>eQ5WsIdrZ9Vt>pE_AGfRmEuEj~@%b3We5c;=-l{LlOhMn9N;8Rj z*;-VBirP$1dr632jL{_Y9sDWLLwt1OdP-8_{(Lm{AZ>bG+1iVn+A{%_`9GC7DT*}i zeMk>ob&D21Str>|K-W7up7XVPa4OH(Ur5jeJF-|hKAGU^`n7A<7kahVoRd309Ac%u zlXzc=NBHWd4y#t<$q}r}mRp|HQ3E~cF)UN!r$#-NtU4>lgR$&UNnE8x9pAl}tA&WS z&nVWAjk5CS=2&%l8Qp$kby7@VKoghA+W8pGW4tOq(8}WaR)xE&3aEXuSBvf*m-I{2 zvtctjC+AN7x~=sj%gO^ch6dcZijQ?e{oU!Gc$%MT2Q6_^w-~3W(>di4itT+ToBGSmlSL@jsqP3p_xNQPnQOB)8ngD&3|h~6{ha%$yY zH8+_FSB$hK-j;1N#_TP$L}2Rd9p?y<%sZ%Sk`Ue#hW!?JQNkd@A=l0&6kh za3AxzmG@`0FL=%HRbds|JOgwln>7zra>lrl9ptjKz1KBL=tfhX)I#66oX^Vf?(x}! zuap!N{i&U|uCw9pX|NtDw!LR`>Xa8#R^1n_0mrK0NG`IeK$cZcT#7JT>EcO^0am$i z>lbPFn8xF9ZikKJLk0Nk$-C#BW|B*|cPR&~NpVNKCv&;Y$351_7V|@FeWf<1Rc@#C zF}CXOIOVm&!Uno#mWE1BgfG>nc_hT1-1emp4L@LIplOmq;dv1t|^4< zab*!4S@%jlSD$h-mFe^PZUS$!hD7RBYEduYGWxIGZ7T)tDPr`&okj%U=2Dr<)2 z+nN+DN2f*JnAGx*QGutt-z`s5!v%=F*|61C&oq& zGek^$rgUe@iFtk$v-;F23XgiAH#+n7YvC%6xZD3DS!Is%b8HjW+O4%oeA~lBvIP86 zjZb>*L$mc87%|#cPGuiMv<%-zxMv98A__d6F=#e^q=Gqlxxrjc;lIJ0#HBU8ooZjRh(?6I87p+*UtU{zy|Xy>6%%r`_kgW;bx1 z9_w~WU$35-XOHUAL;dk2)$-4Q-uu!R*n4|FD^3K`K8pR?-6^B4#xlA8UB|c1ifisI z3|E>QdU)REw)F2FG}s}S=@BM&qL4jGE7Rkg*EM4EOF{c(pIa>Xz6nI;7~i#I$-Ol5 z@v*#Y7KOoH3KuNt1hc6Y3luq~W;iaHeplys7ITPlIa~~{^ZszvjV{z1j3VW5a?Vc7 z;g|ak>XbMR%nLlLKb$(kK~>kEKl<*(IB(O-`vqPVcqJjaqX(BJ13ARPoH;tD;(n&B7TdYC^myK3;3!HM(os=o&%d{2Qr zBQGm?kfwz*OL7#yjV<%{tDPG4a+P2WOn!A>yZre2g_WBDtL=BNDK(oTTl=^=xfYvF z^V`~SjVIdemyxX{V_UW)G&D4VmoqvyrPGA0+GOr!+JoJ=t7v6QHi~Zp)ty&2h);3c z(Rt!J)y@`P?YUf!jvUy}miIPs^qe94>gF^n4YhMFu8Xp&o!RjGlH}RX4C6izxhc=` zZ+ZER-AU%Z=W$4Mn2n-Mw@>&XZhKVM@%-6VMwY_$&;Xx3$NL1r#)EN|Aw0*dx7I~^ z8EKoOYc@2(ZQ1D}`!aSs9V>h&B=AVCKZ?bFAi!|&c88-ogX@7EHHy6Jp5iY{Gx~W= zJQ4?w8LzW?>FbkYzD6JjtZ<4@^wf%DEwgU z-0V*02;ep&68nXkEq+#!^||=st!6@kuhSY_WbbWrEM7Lp

H+tlj^C=c`Y~zBBWZ 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 literal 0 HcmV?d00001 diff --git a/docs/bench/bootstrap.js b/docs/bench/bootstrap.js index 6e2a0d26..3ea1c510 100644 --- a/docs/bench/bootstrap.js +++ b/docs/bench/bootstrap.js @@ -55,26 +55,26 @@ /******/ "../web_pkg/jsonpath_wasm_bg.wasm": function() { /******/ return { /******/ "./jsonpath_wasm_bg.js": { -/******/ "__wbg_error_c4abc40e0406628b": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_error_c4abc40e0406628b"](p0i32,p1i32); +/******/ "__wbindgen_json_parse": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); /******/ }, /******/ "__wbindgen_object_drop_ref": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_object_drop_ref"](p0i32); /******/ }, +/******/ "__wbg_error_5b1e30d38c81c9fa": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_error_5b1e30d38c81c9fa"](p0i32,p1i32); +/******/ }, /******/ "__wbindgen_object_clone_ref": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_object_clone_ref"](p0i32); /******/ }, /******/ "__wbindgen_string_new": function(p0i32,p1i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_string_new"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_json_parse": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); -/******/ }, -/******/ "__wbg_call_bf745b1758bb6693": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_call_bf745b1758bb6693"](p0i32,p1i32,p2i32); +/******/ "__wbg_call_3fc07b7d5fc9022d": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_call_3fc07b7d5fc9022d"](p0i32,p1i32,p2i32); /******/ }, /******/ "__wbindgen_is_string": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_is_string"](p0i32); @@ -91,11 +91,11 @@ /******/ "__wbindgen_rethrow": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper107": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper107"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper27": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper27"](p0i32,p1i32,p2i32); /******/ }, -/******/ "__wbindgen_closure_wrapper109": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper109"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper29": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper29"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -198,7 +198,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../web_pkg/jsonpath_wasm_bg.wasm":"f9980c137fc7d5609726"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../web_pkg/jsonpath_wasm_bg.wasm":"494668cdc2dc16eb1895"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/docs/bench/f9980c137fc7d5609726.module.wasm b/docs/bench/f9980c137fc7d5609726.module.wasm deleted file mode 100644 index 82a5c7bd519fb92ced1bc3cc8b30cc57f1eea139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246391 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 N9P5R5aE)yHzW~Vvi=6-f diff --git a/docs/bootstrap.js b/docs/bootstrap.js index 5303da90..fd29c42d 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -55,26 +55,26 @@ /******/ "../web_pkg/jsonpath_wasm_bg.wasm": function() { /******/ return { /******/ "./jsonpath_wasm_bg.js": { -/******/ "__wbg_error_c4abc40e0406628b": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_error_c4abc40e0406628b"](p0i32,p1i32); +/******/ "__wbindgen_json_parse": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); /******/ }, /******/ "__wbindgen_object_drop_ref": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_object_drop_ref"](p0i32); /******/ }, +/******/ "__wbg_error_5b1e30d38c81c9fa": function(p0i32,p1i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_error_5b1e30d38c81c9fa"](p0i32,p1i32); +/******/ }, /******/ "__wbindgen_object_clone_ref": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_object_clone_ref"](p0i32); /******/ }, /******/ "__wbindgen_string_new": function(p0i32,p1i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_string_new"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_json_parse": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); -/******/ }, -/******/ "__wbg_call_bf745b1758bb6693": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_call_bf745b1758bb6693"](p0i32,p1i32,p2i32); +/******/ "__wbg_call_3fc07b7d5fc9022d": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbg_call_3fc07b7d5fc9022d"](p0i32,p1i32,p2i32); /******/ }, /******/ "__wbindgen_is_string": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_is_string"](p0i32); @@ -91,11 +91,11 @@ /******/ "__wbindgen_rethrow": function(p0i32) { /******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper107": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper107"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper27": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper27"](p0i32,p1i32,p2i32); /******/ }, -/******/ "__wbindgen_closure_wrapper109": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper109"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper29": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../web_pkg/jsonpath_wasm_bg.js"].exports["__wbindgen_closure_wrapper29"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -198,7 +198,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../web_pkg/jsonpath_wasm_bg.wasm":"f9980c137fc7d5609726"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../web_pkg/jsonpath_wasm_bg.wasm":"494668cdc2dc16eb1895"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/docs/f9980c137fc7d5609726.module.wasm b/docs/f9980c137fc7d5609726.module.wasm deleted file mode 100644 index 82a5c7bd519fb92ced1bc3cc8b30cc57f1eea139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246391 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 N9P5R5aE)yHzW~Vvi=6-f diff --git a/docs/serverwasm.py b/docs/serverwasm.py new file mode 100644 index 00000000..543a437c --- /dev/null +++ b/docs/serverwasm.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import http.server +import socketserver + +PORT = 8000 + +Handler = http.server.SimpleHTTPRequestHandler +Handler.extensions_map.update({ + '.wasm': 'application/wasm', +}) + +socketserver.TCPServer.allow_reuse_address = True +with socketserver.TCPServer(("", PORT), Handler) as httpd: + httpd.allow_reuse_address = True + print("serving at port", PORT) + httpd.serve_forever() \ No newline at end of file diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index fbeb8eaa..82e36865 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jsonpath-wasm" -version = "0.2.6" +version = "0.3.0" authors = ["Changseok Han "] description = "It is Webassembly version of jsonpath_lib that is JsonPath engine written in Rust - Demo: https://freestrings.github.io/jsonpath" keywords = ["jsonpath", "json", "webassembly", "parsing", "rust"] diff --git a/wasm/tests/package-lock.json b/wasm/tests/package-lock.json index 7ad1a819..0fc4bd65 100644 --- a/wasm/tests/package-lock.json +++ b/wasm/tests/package-lock.json @@ -1,8 +1,1189 @@ { "name": "jsonpath-wasm-test", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "jsonpath-wasm-test", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "jsonpath-wasm": "file:../nodejs_pkg", + "mocha": "^6.1.4" + } + }, + "../nodejs_pkg": { + "name": "jsonpath-wasm", + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonpath-wasm": { + "resolved": "../nodejs_pkg", + "link": true + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/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 + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "ansi-colors": { "version": "3.2.3", @@ -35,9 +1216,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "brace-expansion": { @@ -57,13 +1238,13 @@ "dev": true }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "camelcase": { @@ -191,23 +1372,27 @@ "dev": true }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" }, "dependencies": { "object.assign": { @@ -284,9 +1469,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -323,6 +1508,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -330,9 +1521,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "he": { @@ -357,6 +1548,21 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -364,15 +1570,15 @@ "dev": true }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true }, "is-fullwidth-code-point": { @@ -387,22 +1593,35 @@ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "isexe": { @@ -422,8 +1641,7 @@ } }, "jsonpath-wasm": { - "version": "file:../nodejs_pkg", - "dev": true + "version": "file:../nodejs_pkg" }, "locate-path": { "version": "3.0.0", @@ -436,9 +1654,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "log-symbols": { @@ -522,9 +1740,9 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "dev": true }, "object-keys": { @@ -546,14 +1764,14 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.18.0-next.2" } }, "once": { @@ -642,22 +1860,22 @@ } }, "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -685,6 +1903,18 @@ "has-flag": "^3.0.0" } }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -694,6 +1924,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -755,9 +1998,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yargs": { diff --git a/wasm/www/package-lock.json b/wasm/www/package-lock.json index 8a377655..1cbcf21c 100644 --- a/wasm/www/package-lock.json +++ b/wasm/www/package-lock.json @@ -1,8 +1,6535 @@ { "name": "jsonpath-wasm-evaluator", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "jsonpath-wasm-evaluator", + "version": "0.1.0", + "devDependencies": { + "copy-webpack-plugin": "^5.1.2", + "webpack": "^4.44.2", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.2.1" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.9.0.tgz", + "integrity": "sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/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 + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/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 + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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 + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "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-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "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.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/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, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/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, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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 + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, "dependencies": { "@types/glob": { "version": "7.1.3", @@ -15,15 +6542,15 @@ } }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, "@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.9.0.tgz", + "integrity": "sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA==", "dev": true }, "@webassemblyjs/ast": { @@ -245,13 +6772,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "3.2.4", @@ -266,9 +6795,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { @@ -281,9 +6810,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "optional": true, "requires": { @@ -355,9 +6884,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -423,9 +6952,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base": { @@ -451,35 +6980,6 @@ "requires": { "is-descriptor": "^1.0.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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" - } } } }, @@ -502,12 +7002,22 @@ "dev": true }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "optional": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -515,9 +7025,9 @@ "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body-parser": { @@ -596,6 +7106,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -779,13 +7295,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "camelcase": { @@ -817,15 +7333,15 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -854,9 +7370,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "optional": true, "requires": { @@ -889,13 +7405,10 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true }, "cipher-base": { "version": "1.0.4", @@ -925,8 +7438,65 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } } + }, + "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.0.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 } } }, @@ -939,6 +7509,23 @@ "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "collection-visit": { @@ -1128,9 +7715,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1262,37 +7849,6 @@ "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.0" - } - }, - "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.0" - } - }, - "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" - } - } } }, "del": { @@ -1330,6 +7886,12 @@ "dev": true } } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, @@ -1362,9 +7924,9 @@ "dev": true }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, "diffie-hellman": { @@ -1379,9 +7941,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1402,9 +7964,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -1445,24 +8007,24 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1495,9 +8057,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -1526,36 +8088,6 @@ "prr": "~1.0.1" } }, - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1614,15 +8146,15 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "requires": { "original": "^1.0.0" @@ -1685,6 +8217,69 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.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 + }, + "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 } } }, @@ -1751,17 +8346,6 @@ "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": { @@ -1798,34 +8382,11 @@ "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, @@ -1842,9 +8403,9 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -1856,6 +8417,13 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1876,6 +8444,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -1937,9 +8511,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "dev": true }, "for-in": { @@ -1949,9 +8523,9 @@ "dev": true }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "fragment-cache": { @@ -1998,9 +8572,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -2017,9 +8591,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -2043,9 +8617,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2084,32 +8658,17 @@ "dev": true, "requires": { "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, "globby": { @@ -2124,20 +8683,12 @@ "ignore": "^3.3.5", "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 - } } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "handle-thing": { @@ -2162,9 +8713,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { @@ -2272,9 +8823,9 @@ } }, "html-entities": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.3.tgz", - "integrity": "sha512-/VulV3SYni1taM7a4RMdceqzJWR39gpZHjBwUnsCFKWV/GJkD14CJ5F7eWcZozmHJK0/f/H5U3b3SiPkuvxMgg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "http-deceiver": { @@ -2304,6 +8855,12 @@ } } }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -2445,23 +9002,12 @@ "dev": true }, "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=", + "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": "^3.0.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": "^6.0.0" } }, "is-arguments": { @@ -2489,62 +9035,40 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "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=", + "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": "^3.0.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": "^6.0.0" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "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==", + "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": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "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 + "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" + } }, "is-extglob": { "version": "2.1.1", @@ -2621,12 +9145,13 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, "is-stream": { @@ -2635,15 +9160,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2741,9 +9257,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "loglevel": { @@ -2769,6 +9285,14 @@ "requires": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "map-cache": { @@ -2857,9 +9381,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -2871,18 +9395,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.48.0" } }, "minimalistic-assert": { @@ -2938,17 +9462,6 @@ "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": { @@ -2996,6 +9509,13 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3119,6 +9639,43 @@ "is-descriptor": "^0.1.0" } }, + "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.0.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.0.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.0.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", @@ -3130,19 +9687,13 @@ } } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -3161,18 +9712,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3378,20 +9917,12 @@ "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 - } } }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -3402,16 +9933,16 @@ } }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true, "optional": true }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -3491,12 +10022,12 @@ "dev": true }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -3521,9 +10052,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3672,13 +10203,13 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "remove-trailing-separator": { @@ -3688,9 +10219,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -3746,6 +10277,19 @@ "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } + }, + "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.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } } } }, @@ -3840,9 +10384,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -3971,6 +10515,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -4056,6 +10606,69 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.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 + }, + "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 } } }, @@ -4078,35 +10691,6 @@ "requires": { "is-descriptor": "^1.0.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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" - } } } }, @@ -4131,28 +10715,28 @@ } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", + "faye-websocket": "^0.11.3", "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "websocket-driver": "^0.7.4" } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "dev": true, "requires": { - "debug": "^3.2.5", + "debug": "^3.2.6", "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" }, "dependencies": { "debug": { @@ -4164,15 +10748,6 @@ "ms": "^2.1.1" } }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4225,9 +10800,9 @@ } }, "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=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "spdy": { @@ -4312,9 +10887,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -4338,6 +10913,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.0.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 } } }, @@ -4386,6 +11018,15 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -4395,44 +11036,32 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^2.0.0" } }, "strip-eof": { @@ -4579,12 +11208,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -4617,6 +11240,14 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "dependencies": { + "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 + } } }, "unique-filename": { @@ -4690,9 +11321,9 @@ "dev": true }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -4723,9 +11354,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -4774,9 +11405,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "vary": { @@ -4869,7 +11500,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "is-binary-path": { "version": "1.0.1", @@ -4905,9 +11540,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -4918,7 +11553,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -4968,17 +11603,17 @@ }, "dependencies": { "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true } } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -5001,11 +11636,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -5016,12 +11651,6 @@ "yargs": "^13.3.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -5083,7 +11712,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "is-binary-path": { "version": "1.0.1", @@ -5116,15 +11749,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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.0.0" - } } } }, @@ -5157,11 +11781,13 @@ } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -5204,6 +11830,23 @@ "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -5213,9 +11856,9 @@ "dev": true }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -5228,9 +11871,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { diff --git a/wasm/www_bench/package-lock.json b/wasm/www_bench/package-lock.json index cccdc7f7..dd91af87 100644 --- a/wasm/www_bench/package-lock.json +++ b/wasm/www_bench/package-lock.json @@ -1,8 +1,6651 @@ { "name": "jsonpath-wasm-bench", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "jsonpath-wasm-bench", + "version": "0.1.0", + "dependencies": { + "jsonpath": "*" + }, + "devDependencies": { + "copy-webpack-plugin": "^5.1.1", + "webpack": "^4.29.6", + "webpack-cli": "^3.1.0", + "webpack-dev-server": "^3.1.5" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.9.0.tgz", + "integrity": "sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/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 + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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=" + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/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 + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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 + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "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-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "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.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/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, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/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, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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 + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, "dependencies": { "@types/glob": { "version": "7.1.3", @@ -15,15 +6658,15 @@ } }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, "@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.9.0.tgz", + "integrity": "sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA==", "dev": true }, "@webassemblyjs/ast": { @@ -245,13 +6888,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "3.2.4", @@ -266,9 +6911,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { @@ -281,9 +6926,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "optional": true, "requires": { @@ -355,9 +7000,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -423,9 +7068,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base": { @@ -451,35 +7096,6 @@ "requires": { "is-descriptor": "^1.0.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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" - } } } }, @@ -502,12 +7118,22 @@ "dev": true }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "optional": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -515,9 +7141,9 @@ "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body-parser": { @@ -596,6 +7222,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -779,13 +7411,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "camelcase": { @@ -817,15 +7449,15 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -854,9 +7486,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "optional": true, "requires": { @@ -889,13 +7521,10 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true }, "cipher-base": { "version": "1.0.4", @@ -925,8 +7554,65 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.0.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 } } }, @@ -939,6 +7625,23 @@ "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "collection-visit": { @@ -1128,9 +7831,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1267,37 +7970,6 @@ "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.0" - } - }, - "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.0" - } - }, - "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" - } - } } }, "del": { @@ -1335,6 +8007,12 @@ "dev": true } } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, @@ -1367,9 +8045,9 @@ "dev": true }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, "diffie-hellman": { @@ -1384,9 +8062,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1407,9 +8085,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -1450,24 +8128,24 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1500,9 +8178,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -1531,36 +8209,6 @@ "prr": "~1.0.1" } }, - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1647,15 +8295,15 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "requires": { "original": "^1.0.0" @@ -1718,6 +8366,69 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.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 + }, + "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 } } }, @@ -1784,17 +8495,6 @@ "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": { @@ -1831,34 +8531,11 @@ "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, @@ -1880,9 +8557,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -1894,6 +8571,13 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1914,6 +8598,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -1975,9 +8665,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "dev": true }, "for-in": { @@ -1987,9 +8677,9 @@ "dev": true }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "fragment-cache": { @@ -2036,9 +8726,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -2055,9 +8745,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -2081,9 +8771,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2122,32 +8812,17 @@ "dev": true, "requires": { "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, "globby": { @@ -2162,20 +8837,12 @@ "ignore": "^3.3.5", "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 - } } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "handle-thing": { @@ -2200,9 +8867,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { @@ -2310,9 +8977,9 @@ } }, "html-entities": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.3.tgz", - "integrity": "sha512-/VulV3SYni1taM7a4RMdceqzJWR39gpZHjBwUnsCFKWV/GJkD14CJ5F7eWcZozmHJK0/f/H5U3b3SiPkuvxMgg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "http-deceiver": { @@ -2342,6 +9009,12 @@ } } }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -2483,23 +9156,12 @@ "dev": true }, "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=", + "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": "^3.0.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": "^6.0.0" } }, "is-arguments": { @@ -2527,62 +9189,40 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "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=", + "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": "^3.0.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": "^6.0.0" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "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==", + "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": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "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 + "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" + } }, "is-extglob": { "version": "2.1.1", @@ -2659,12 +9299,13 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, "is-stream": { @@ -2673,15 +9314,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2740,13 +9372,13 @@ } }, "jsonpath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.0.2.tgz", - "integrity": "sha512-rmzlgFZiQPc6q4HDyK8s9Qb4oxBnI5sF61y/Co5PV0lc3q2bIuRsNdueVbhoSHdKM4fxeimphOAtfz47yjCfeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", "requires": { "esprima": "1.2.2", "static-eval": "2.0.2", - "underscore": "1.7.0" + "underscore": "1.12.1" } }, "killable": { @@ -2798,9 +9430,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "loglevel": { @@ -2826,6 +9458,14 @@ "requires": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "map-cache": { @@ -2914,9 +9554,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -2928,18 +9568,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.48.0" } }, "minimalistic-assert": { @@ -2995,17 +9635,6 @@ "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": { @@ -3053,6 +9682,13 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3176,6 +9812,43 @@ "is-descriptor": "^0.1.0" } }, + "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.0.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.0.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.0.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", @@ -3187,19 +9860,13 @@ } } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -3218,18 +9885,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3448,20 +10103,12 @@ "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 - } } }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -3472,16 +10119,16 @@ } }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true, "optional": true }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -3566,12 +10213,12 @@ "dev": true }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -3596,9 +10243,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3747,13 +10394,13 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "remove-trailing-separator": { @@ -3763,9 +10410,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -3821,6 +10468,19 @@ "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } + }, + "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.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } } } }, @@ -3915,9 +10575,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -4046,6 +10706,12 @@ "requires": { "is-extendable": "^0.1.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 } } }, @@ -4132,6 +10798,69 @@ "is-extendable": "^0.1.0" } }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.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 + }, + "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 + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4159,35 +10888,6 @@ "requires": { "is-descriptor": "^1.0.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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.0" - } - }, - "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" - } } } }, @@ -4212,28 +10912,28 @@ } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", + "faye-websocket": "^0.11.3", "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "websocket-driver": "^0.7.4" } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "dev": true, "requires": { - "debug": "^3.2.5", + "debug": "^3.2.6", "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" }, "dependencies": { "debug": { @@ -4245,15 +10945,6 @@ "ms": "^2.1.1" } }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4271,7 +10962,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true }, "source-map-resolve": { "version": "0.5.3", @@ -4297,9 +10989,9 @@ } }, "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=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "spdy": { @@ -4384,9 +11076,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -4418,6 +11110,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "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.0.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" + } + } + } + }, + "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.0.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" + } + } + } + }, + "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.0.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 } } }, @@ -4466,6 +11215,15 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -4475,44 +11233,32 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^2.0.0" } }, "strip-eof": { @@ -4643,12 +11389,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -4680,9 +11420,9 @@ "dev": true }, "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "union-value": { "version": "1.0.1", @@ -4694,6 +11434,14 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "dependencies": { + "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 + } } }, "unique-filename": { @@ -4767,9 +11515,9 @@ "dev": true }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -4800,9 +11548,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -4851,9 +11599,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "vary": { @@ -4946,7 +11694,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "is-binary-path": { "version": "1.0.1", @@ -4982,9 +11734,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -4995,7 +11747,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -5045,17 +11797,17 @@ }, "dependencies": { "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true } } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -5078,11 +11830,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -5093,12 +11845,6 @@ "yargs": "^13.3.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -5160,7 +11906,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "is-binary-path": { "version": "1.0.1", @@ -5193,15 +11943,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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.0.0" - } } } }, @@ -5226,11 +11967,13 @@ } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -5278,6 +12021,23 @@ "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -5287,9 +12047,9 @@ "dev": true }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -5302,9 +12062,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { From c3b973437cddbd05fc41796e7a2ddb7b998150a2 Mon Sep 17 00:00:00 2001 From: "meir@redislabs.com" Date: Mon, 28 Jun 2021 10:45:39 +0300 Subject: [PATCH 08/22] Fix crash on removing multiple elements from an array If the the first element we remove cause the second element path to be invalid, the code will try to access an invalid index of the array. --- src/select/mod.rs | 12 +++++++----- tests/selector.rs | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/select/mod.rs b/src/select/mod.rs index 9217b5b5..d575848f 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -811,11 +811,13 @@ fn replace_value Option>( Value::Array(ref mut vec) => { if let Ok(x) = token.parse::() { if is_last { - let v = std::mem::replace(&mut vec[x], Value::Null); - if let Some(res) = fun(v) { - vec[x] = res; - } else { - vec.remove(x); + if x < vec.len() { + let v = std::mem::replace(&mut vec[x], Value::Null); + if let Some(res) = fun(v) { + vec[x] = res; + } else { + vec.remove(x); + } } return; } diff --git a/tests/selector.rs b/tests/selector.rs index 113f66ba..dbb99852 100644 --- a/tests/selector.rs +++ b/tests/selector.rs @@ -62,6 +62,27 @@ fn selector_node_ref() { assert!(std::ptr::eq(selector.node_ref().unwrap(), &node)); } +#[test] +fn selector_delete_multi_elements_from_array() { + setup(); + + let mut selector_mut = SelectorMut::default(); + + let result = selector_mut + .str_path(r#"$[0,2]"#) + .unwrap() + .value(serde_json::from_str("[1,2,3]").unwrap()) + .remove() + .unwrap() + .take() + .unwrap(); + + assert_eq!( + result, + serde_json::from_str::("[2,3]").unwrap(), + ); +} + #[test] fn selector_delete() { setup(); From fa706e8bbe3f7632902efdaf435d95b54ab5520e Mon Sep 17 00:00:00 2001 From: freestrings Date: Wed, 30 Jun 2021 17:08:56 +0900 Subject: [PATCH 09/22] fix clippy --- src/select/cmp.rs | 136 +++++++++++++++++++++++----------------------- src/select/mod.rs | 6 +- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/select/cmp.rs b/src/select/cmp.rs index 6d2eaef1..f5f413ac 100644 --- a/src/select/cmp.rs +++ b/src/select/cmp.rs @@ -214,109 +214,109 @@ mod cmp_inner_tests { #[test] fn cmp_eq() { let cmp_fn = CmpEq; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), false); - assert_eq!(cmp_fn.cmp_bool(true, true), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.1), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), false); - assert_eq!(cmp_fn.cmp_string("1", "1"), true); - assert_eq!(cmp_fn.cmp_string("1", "2"), false); + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_string("1", "1")); + assert!(!cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_ne() { let cmp_fn = CmpNe; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), true); - assert_eq!(cmp_fn.cmp_bool(true, true), false); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.1), false); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), true); - assert_eq!(cmp_fn.cmp_string("1", "1"), false); - assert_eq!(cmp_fn.cmp_string("1", "2"), true); + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_f64(0.1, 0.1)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_string("1", "1")); + assert!(cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_gt() { let cmp_fn = CmpGt; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), true); - assert_eq!(cmp_fn.cmp_bool(true, true), false); - assert_eq!(cmp_fn.cmp_f64(0.2, 0.1), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), false); - assert_eq!(cmp_fn.cmp_string("a", "a"), false); - assert_eq!(cmp_fn.cmp_string("b", "a"), true); - assert_eq!(cmp_fn.cmp_string("1", "2"), false); + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.2, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("b", "a")); + assert!(!cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_ge() { let cmp_fn = CmpGe; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), true); - assert_eq!(cmp_fn.cmp_bool(true, true), true); - assert_eq!(cmp_fn.cmp_f64(0.2, 0.1), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.1), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), false); - assert_eq!(cmp_fn.cmp_string("1", "1"), true); - assert_eq!(cmp_fn.cmp_string("ab", "a"), true); - assert_eq!(cmp_fn.cmp_string("1", "2"), false); + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.2, 0.1)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_string("1", "1")); + assert!(cmp_fn.cmp_string("ab", "a")); + assert!(!cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_lt() { let cmp_fn = CmpLt; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), false); - assert_eq!(cmp_fn.cmp_bool(false, true), true); - assert_eq!(cmp_fn.cmp_bool(true, true), false); - assert_eq!(cmp_fn.cmp_bool(false, false), false); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.1), false); - assert_eq!(cmp_fn.cmp_f64(0.2, 0.1), false); - assert_eq!(cmp_fn.cmp_string("a", "a"), false); - assert_eq!(cmp_fn.cmp_string("ab", "b"), true); - assert_eq!(cmp_fn.cmp_string("1", "2"), true); + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.2, 0.1)); + assert!(!cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("ab", "b")); + assert!(cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_le() { let cmp_fn = CmpLe; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), false); - assert_eq!(cmp_fn.cmp_bool(false, true), true); - assert_eq!(cmp_fn.cmp_bool(true, true), true); - assert_eq!(cmp_fn.cmp_bool(false, false), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.2), true); - assert_eq!(cmp_fn.cmp_f64(0.1, 0.1), true); - assert_eq!(cmp_fn.cmp_f64(0.2, 0.1), false); - assert_eq!(cmp_fn.cmp_string("a", "a"), true); - assert_eq!(cmp_fn.cmp_string("ab", "b"), true); - assert_eq!(cmp_fn.cmp_string("abd", "abc"), false); - assert_eq!(cmp_fn.cmp_string("1", "2"), true); + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.2, 0.1)); + assert!(cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("ab", "b")); + assert!(!cmp_fn.cmp_string("abd", "abc")); + assert!(cmp_fn.cmp_string("1", "2")); } #[test] fn cmp_and() { let cmp_fn = CmpAnd; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), false); - assert_eq!(cmp_fn.cmp_bool(false, true), false); - assert_eq!(cmp_fn.cmp_bool(true, true), true); - assert_eq!(cmp_fn.cmp_bool(false, false), false); - assert_eq!(cmp_fn.cmp_f64(0.0, 0.0), true); - assert_eq!(cmp_fn.cmp_string("a", "a"), true); + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.0, 0.0)); + assert!(cmp_fn.cmp_string("a", "a")); } #[test] fn cmp_or() { let cmp_fn = CmpOr; - assert_eq!(cmp_fn.default(), false); - assert_eq!(cmp_fn.cmp_bool(true, false), true); - assert_eq!(cmp_fn.cmp_bool(false, true), true); - assert_eq!(cmp_fn.cmp_bool(true, true), true); - assert_eq!(cmp_fn.cmp_bool(false, false), false); - assert_eq!(cmp_fn.cmp_f64(0.0, 0.0), true); - assert_eq!(cmp_fn.cmp_string("a", "a"), true); + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.0, 0.0)); + assert!(cmp_fn.cmp_string("a", "a")); } #[test] diff --git a/src/select/mod.rs b/src/select/mod.rs index d575848f..e0d62083 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -975,7 +975,7 @@ mod select_inner_tests { let number = 0_i64; let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); if let Value::Number(n) = v { - assert_eq!((super::to_f64(&n) - number as f64).abs() == 0_f64, true); + assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); } else { panic!(); } @@ -986,7 +986,7 @@ mod select_inner_tests { let number = 0.1_f64; let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); if let Value::Number(n) = v { - assert_eq!((super::to_f64(&n) - number).abs() == 0_f64, true); + assert!((super::to_f64(&n) - number).abs() == 0_f64); } else { panic!(); } @@ -997,7 +997,7 @@ mod select_inner_tests { let number = u64::max_value(); let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); if let Value::Number(n) = v { - assert_eq!((super::to_f64(&n) - number as f64).abs() == 0_f64, true); + assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); } else { panic!(); } From 3aa73c6388ca783c2f07fc2a39612b2dc4cf572f Mon Sep 17 00:00:00 2001 From: freestrings Date: Sun, 1 Aug 2021 23:13:46 +0900 Subject: [PATCH 10/22] Start refactoring to start improving performance. Related #72 --- README.md | 4 +- benchmark/benches/bench.rs | 2 +- src/lib.rs | 150 ++- src/parser/mod.rs | 1652 +++++++++++++++++---------------- src/paths/handlers.rs | 79 ++ src/paths/mod.rs | 10 + src/paths/path_parser.rs | 1181 +++++++++++++++++++++++ src/paths/str_reader.rs | 90 ++ src/paths/tokenizer.rs | 602 ++++++++++++ src/paths/tokens.rs | 131 +++ src/select/cmp.rs | 314 +++---- src/select/expr_term.rs | 46 +- src/select/mod.rs | 76 +- src/selector/cmp.rs | 364 ++++++++ src/selector/mod.rs | 7 + src/selector/selector_impl.rs | 671 +++++++++++++ src/selector/terms.rs | 493 ++++++++++ src/selector/utils.rs | 33 + src/selector/value_walker.rs | 128 +++ tests/common.rs | 12 +- tests/lib.rs | 4 +- tests/precompile.rs | 6 +- tests/readme.rs | 28 +- tests/selector.rs | 70 +- 24 files changed, 5008 insertions(+), 1145 deletions(-) create mode 100644 src/paths/handlers.rs create mode 100644 src/paths/mod.rs create mode 100644 src/paths/path_parser.rs create mode 100644 src/paths/str_reader.rs create mode 100644 src/paths/tokenizer.rs create mode 100644 src/paths/tokens.rs create mode 100644 src/selector/cmp.rs create mode 100644 src/selector/mod.rs create mode 100644 src/selector/selector_impl.rs create mode 100644 src/selector/terms.rs create mode 100644 src/selector/utils.rs create mode 100644 src/selector/value_walker.rs diff --git a/README.md b/README.md index 218f1224..91e13c71 100644 --- a/README.md +++ b/README.md @@ -193,10 +193,10 @@ assert_eq!(ret[0], person); -

Rust - jsonpath::Compiled::compile(jsonpath: &str) +
Rust - jsonpath::PathCompiled::compile(jsonpath: &str) ```rust -let template = jsonpath::Compiled::compile("$..friends[0]").unwrap(); +let template = jsonpath::PathCompiled::compile("$..friends[0]").unwrap(); let json_obj = json!({ "school": { diff --git a/benchmark/benches/bench.rs b/benchmark/benches/bench.rs index 3f4c6db2..db10045e 100644 --- a/benchmark/benches/bench.rs +++ b/benchmark/benches/bench.rs @@ -79,7 +79,7 @@ fn bench_select_as_str(b: &mut Bencher) { #[bench] fn bench_compile(b: &mut Bencher) { let json = get_json(); - let template = jsonpath::Compiled::compile(get_path()).unwrap(); + let template = jsonpath::PathCompiled::compile(get_path()).unwrap(); b.iter(move || { for _ in 1..100 { let _ = template.select(&json).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 1258a010..da371f22 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -130,10 +130,19 @@ extern crate serde_json; use serde_json::Value; -pub use parser::Parser; // TODO private -pub use select::JsonPathError; -pub use select::{Selector, SelectorMut}; use parser::Node; +pub use parser::Parser; +pub use select::{Selector, SelectorMut}; + +#[deprecated( +since = "0.4.0", +note = "It will be move to common module. since 0.5" +)] +pub use select::JsonPathError; + +pub use selector::{JsonSelector, JsonSelectorMut}; +pub use paths::PathParser; +use std::rc::Rc; #[doc(hidden)] mod ffi; @@ -142,6 +151,18 @@ mod parser; #[doc(hidden)] mod select; +mod paths; +mod selector; + +impl From<&paths::TokenError> for JsonPathError { + fn from(e: &paths::TokenError) -> Self { + match e { + paths::TokenError::Eof => JsonPathError::Path("Eof".to_string()), + paths::TokenError::Position(pos) => JsonPathError::Path(["Position:", &pos.to_string()].concat()) + } + } +} + /// It is a high-order function. it compile a jsonpath and then returns a closure that has JSON as argument. if you need to reuse a jsonpath, it is good for performance. /// /// ```rust @@ -170,8 +191,8 @@ mod select; /// ]); /// ``` #[deprecated( - since = "0.2.5", - note = "Please use the Compiled::compile function instead" +since = "0.2.5", +note = "Please use the PathCompiled::compile function instead. It will be removed since 0.4.1" )] pub fn compile(path: &str) -> impl FnMut(&Value) -> Result, JsonPathError> { let node = parser::Parser::compile(path); @@ -219,10 +240,12 @@ pub fn compile(path: &str) -> impl FnMut(&Value) -> Result, JsonPath /// ]); /// ``` #[allow(clippy::needless_lifetimes)] -pub fn selector<'a>(json: &'a Value) -> impl FnMut(&str) -> Result, JsonPathError> { - let mut selector = Selector::default(); - let _ = selector.value(json); - move |path: &str| selector.str_path(path)?.reset_value().select() +pub fn selector<'a>(json: &'a Value) -> impl FnMut(&'a str) -> Result, JsonPathError> { + let mut selector = JsonSelector::default(); + move |path| { + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + selector.reset_parser(parser).value(json).reset_value().select() + } } /// It is the same to `selector` function. but it deserialize the result as given type `T`. @@ -271,12 +294,15 @@ pub fn selector<'a>(json: &'a Value) -> impl FnMut(&str) -> Result( - json: &Value, -) -> impl FnMut(&str) -> Result, JsonPathError> + '_ { - let mut selector = Selector::default(); +pub fn selector_as<'a, T: serde::de::DeserializeOwned>(json: &'a Value) + -> impl FnMut(&'a str) -> Result, JsonPathError> + '_ +{ + let mut selector = JsonSelector::default(); let _ = selector.value(json); - move |path: &str| selector.str_path(path)?.reset_value().select_as() + move |path: &str| { + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + selector.reset_parser(parser).reset_value().select_as() + } } /// It is a simple select function. but it compile the jsonpath argument every time. @@ -304,8 +330,9 @@ pub fn selector_as( /// &json!({"name": "친구1", "age": 20}) /// ]); /// ``` -pub fn select<'a>(json: &'a Value, path: &str) -> Result, JsonPathError> { - Selector::default().str_path(path)?.value(json).select() +pub fn select<'a>(json: &'a Value, path: &'a str) -> Result, JsonPathError> { + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + JsonSelector::new(parser).value(json).select() } /// It is the same to `select` function but it return the result as string. @@ -333,7 +360,8 @@ pub fn select<'a>(json: &'a Value, path: &str) -> Result, JsonPat /// ``` pub fn select_as_str(json_str: &str, path: &str) -> Result { let json = serde_json::from_str(json_str).map_err(|e| JsonPathError::Serde(e.to_string()))?; - let ret = Selector::default().str_path(path)?.value(&json).select()?; + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + let ret = JsonSelector::new(parser).value(&json).select()?; serde_json::to_string(&ret).map_err(|e| JsonPathError::Serde(e.to_string())) } @@ -380,7 +408,8 @@ pub fn select_as( path: &str, ) -> Result, JsonPathError> { let json = serde_json::from_str(json_str).map_err(|e| JsonPathError::Serde(e.to_string()))?; - Selector::default().str_path(path)?.value(&json).select_as() + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + JsonSelector::new(parser).value(&json).select_as() } /// Delete(= replace with null) the JSON property using the jsonpath. @@ -416,8 +445,9 @@ pub fn select_as( /// ]})); /// ``` pub fn delete(value: Value, path: &str) -> Result { - let mut selector = SelectorMut::default(); - let value = selector.str_path(path)?.value(value).delete()?; + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + let mut selector = JsonSelectorMut::new(parser); + let value = selector.value(value).delete()?; Ok(value.take().unwrap_or(Value::Null)) } @@ -464,11 +494,12 @@ pub fn delete(value: Value, path: &str) -> Result { /// ]})); /// ``` pub fn replace_with(value: Value, path: &str, fun: &mut F) -> Result -where - F: FnMut(Value) -> Option, + where + F: FnMut(Value) -> Option, { - let mut selector = SelectorMut::default(); - let value = selector.str_path(path)?.value(value).replace_with(fun)?; + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + let mut selector = JsonSelectorMut::new(parser); + let value = selector.value(value).replace_with(fun)?; Ok(value.take().unwrap_or(Value::Null)) } @@ -515,6 +546,10 @@ where /// ]); /// ``` #[derive(Clone, Debug)] +#[deprecated( +since = "0.4.0", +note = "lifetime has been added. Please use PathCompiled." +)] pub struct Compiled { node: Node, } @@ -525,7 +560,7 @@ impl Compiled { /// If parsing the path fails, it will return an error. pub fn compile(path: &str) -> Result { let node = parser::Parser::compile(path)?; - Ok(Compiled{ + Ok(Compiled { node }) } @@ -536,3 +571,68 @@ impl Compiled { selector.compiled_path(&self.node).value(value).select() } } + +/// A pre-compiled expression. +/// +/// Calling the select function of this struct will re-use the existing, compiled expression. +/// +/// ## Example +/// +/// ```rust +/// extern crate jsonpath_lib as jsonpath; +/// #[macro_use] extern crate serde_json; +/// +/// let mut first_friend = jsonpath::PathCompiled::compile("$..friends[0]").unwrap(); +/// +/// let json_obj = json!({ +/// "school": { +/// "friends": [ +/// {"name": "친구1", "age": 20}, +/// {"name": "친구2", "age": 20} +/// ] +/// }, +/// "friends": [ +/// {"name": "친구3", "age": 30}, +/// {"name": "친구4"} +/// ]}); +/// +/// // call a first time +/// +/// let json = first_friend.select(&json_obj).unwrap(); +/// +/// assert_eq!(json, vec![ +/// &json!({"name": "친구3", "age": 30}), +/// &json!({"name": "친구1", "age": 20}) +/// ]); +/// +/// // call a second time +/// +/// let json = first_friend.select(&json_obj).unwrap(); +/// +/// assert_eq!(json, vec![ +/// &json!({"name": "친구3", "age": 30}), +/// &json!({"name": "친구1", "age": 20}) +/// ]); +/// ``` +#[derive(Clone, Debug)] +pub struct PathCompiled<'a> { + parser: Rc>>, +} + +impl<'a> PathCompiled<'a> { + /// Compile a path expression and return a compiled instance. + /// + /// If parsing the path fails, it will return an error. + pub fn compile(path: &str) -> Result { + let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; + Ok(PathCompiled { + parser: Rc::new(Box::new(parser)) + }) + } + + /// Execute the select operation on the pre-compiled path. + pub fn select(&self, value: &'a Value) -> Result, JsonPathError> { + let mut selector = JsonSelector::new_ref(Rc::clone(&self.parser)); + selector.value(value).select() + } +} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 5a28b730..ce618c5b 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -68,6 +68,7 @@ pub enum FilterToken { Or, } +#[deprecated(since = "0.4.0", note = "Please use `paths::PathParser`")] #[derive(Debug, Clone)] pub struct Node { left: Option>, @@ -75,6 +76,7 @@ pub struct Node { token: ParseToken, } +#[deprecated(since = "0.4.0", note = "Please use `paths::PathParser`")] pub struct Parser; impl Parser { @@ -680,828 +682,828 @@ pub trait NodeVisitor { fn end_term(&mut self) {} } -#[cfg(test)] -mod parser_tests { - use parser::{FilterToken, NodeVisitor, ParseToken, Parser}; - - struct NodeVisitorTestImpl<'a> { - input: &'a str, - stack: Vec, - } - - impl<'a> NodeVisitorTestImpl<'a> { - fn new(input: &'a str) -> Self { - NodeVisitorTestImpl { - input, - stack: Vec::new(), - } - } - - fn start(&mut self) -> Result, String> { - let node = Parser::compile(self.input)?; - self.visit(&node); - Ok(self.stack.split_off(0)) - } - } - - impl<'a> NodeVisitor for NodeVisitorTestImpl<'a> { - fn visit_token(&mut self, token: &ParseToken) { - self.stack.push(token.clone()); - } - } - - fn setup() { - let _ = env_logger::try_init(); - } - - fn run(input: &str) -> Result, String> { - let mut interpreter = NodeVisitorTestImpl::new(input); - interpreter.start() - } - - #[test] - fn parse_error() { - setup(); - - fn invalid(path: &str) { - assert!(run(path).is_err()); - } - - invalid("$[]"); - invalid("$[a]"); - invalid("$[?($.a)]"); - invalid("$[?(@.a > @.b]"); - invalid("$[?(@.a < @.b&&(@.c < @.d)]"); - invalid("@."); - invalid("$..[?(a <= @.a)]"); // invalid term value - invalid("$['a', b]"); - invalid("$[0, >=]"); - invalid("$[a:]"); - invalid("$[:a]"); - invalid("$[::a]"); - invalid("$[:>]"); - invalid("$[1:>]"); - invalid("$[1,,]"); - invalid("$[?]"); - invalid("$[?(1 = 1)]"); - invalid("$[?(1 = >)]"); - } - - #[test] - fn parse_path() { - setup(); - - assert_eq!( - run("$.aa"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("aa".to_owned()) - ]) - ); - - assert_eq!( - run("$.00.a"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("00".to_owned()), - ParseToken::In, - ParseToken::Key("a".to_owned()) - ]) - ); - - assert_eq!( - run("$.00.韓창.seok"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("00".to_owned()), - ParseToken::In, - ParseToken::Key("韓창".to_owned()), - ParseToken::In, - ParseToken::Key("seok".to_owned()) - ]) - ); - - assert_eq!( - run("$.*"), - Ok(vec![ParseToken::Absolute, ParseToken::In, ParseToken::All]) - ); - - assert_eq!( - run("$..*"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Leaves, - ParseToken::All - ]) - ); - - assert_eq!( - run("$..[0]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Leaves, - ParseToken::Array, - ParseToken::Number(0.0), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.$a"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("$a".to_owned()) - ]) - ); - - assert_eq!( - run("$.['$a']"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Key("$a".to_owned()), - ParseToken::ArrayEof, - ]) - ); - - if run("$.").is_ok() { - panic!(); - } - - if run("$..").is_ok() { - panic!(); - } - - if run("$. a").is_ok() { - panic!(); - } - } - - #[test] - fn parse_array_syntax() { - setup(); - - assert_eq!( - run("$.book[?(@.isbn)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("book".to_string()), - ParseToken::Array, - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("isbn".to_string()), - ParseToken::ArrayEof - ]) - ); - - // - // Array도 컨텍스트 In으로 간주 할거라서 중첩되면 하나만 - // - assert_eq!( - run("$.[*]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[*]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[*].가"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof, - ParseToken::In, - ParseToken::Key("가".to_owned()) - ]) - ); - - assert_eq!( - run("$.a[0][1]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Number(0_f64), - ParseToken::ArrayEof, - ParseToken::Array, - ParseToken::Number(1_f64), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[1,2]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Union(vec![1, 2]), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[10:]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Range(Some(10), None, None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[:11]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Range(None, Some(11), None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[-12:13]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Range(Some(-12), Some(13), None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[0:3:2]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(Some(0), Some(3), Some(2)), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[:3:2]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(None, Some(3), Some(2)), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[:]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(None, None, None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[::]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(None, None, None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[::2]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(None, None, Some(2)), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$["a", 'b']"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Keys(vec!["a".to_string(), "b".to_string()]), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[?(1>2)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Number(1_f64), - ParseToken::Number(2_f64), - ParseToken::Filter(FilterToken::Greater), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[?($.b>3)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Array, - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("b".to_owned()), - ParseToken::Number(3_f64), - ParseToken::Filter(FilterToken::Greater), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$[?($.c>@.d && 1==2)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("c".to_owned()), - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("d".to_owned()), - ParseToken::Filter(FilterToken::Greater), - ParseToken::Number(1_f64), - ParseToken::Number(2_f64), - ParseToken::Filter(FilterToken::Equal), - ParseToken::Filter(FilterToken::And), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$[?($.c>@.d&&(1==2||3>=4))]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("c".to_owned()), - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("d".to_owned()), - ParseToken::Filter(FilterToken::Greater), - ParseToken::Number(1_f64), - ParseToken::Number(2_f64), - ParseToken::Filter(FilterToken::Equal), - ParseToken::Number(3_f64), - ParseToken::Number(4_f64), - ParseToken::Filter(FilterToken::GreaterOrEqual), - ParseToken::Filter(FilterToken::Or), - ParseToken::Filter(FilterToken::And), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$[?(@.a<@.b)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("a".to_owned()), - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("b".to_owned()), - ParseToken::Filter(FilterToken::Little), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$[*][*][*]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof, - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof, - ParseToken::Array, - ParseToken::All, - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$['a']['bb']"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Key("a".to_string()), - ParseToken::ArrayEof, - ParseToken::Array, - ParseToken::Key("bb".to_string()), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$.a[?(@.e==true)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::In, - ParseToken::Key("a".to_string()), - ParseToken::Array, - ParseToken::Relative, - ParseToken::In, - ParseToken::Key("e".to_string()), - ParseToken::Bool(true), - ParseToken::Filter(FilterToken::Equal), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$[?(@ > 1)]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Relative, - ParseToken::Number(1_f64), - ParseToken::Filter(FilterToken::Greater), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run("$[:]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Range(None, None, None), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$['single\'quote']"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Key("single'quote".to_string()), - ParseToken::ArrayEof - ]) - ); - - assert_eq!( - run(r#"$["single\"quote"]"#), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Key(r#"single"quote"#.to_string()), - ParseToken::ArrayEof - ]) - ); - } - - #[test] - fn parse_array_float() { - setup(); - - assert_eq!( - run("$[?(1.1<2.1)]"), - Ok(vec![ - ParseToken::Absolute, - ParseToken::Array, - ParseToken::Number(1.1), - ParseToken::Number(2.1), - ParseToken::Filter(FilterToken::Little), - ParseToken::ArrayEof - ]) - ); - - if run("$[1.1]").is_ok() { - panic!(); - } - - if run("$[?(1.1<.2)]").is_ok() { - panic!(); - } - - if run("$[?(1.1<2.)]").is_ok() { - panic!(); - } - - if run("$[?(1.1<2.a)]").is_ok() { - panic!(); - } - } -} - -#[cfg(test)] -mod tokenizer_tests { - use parser::tokenizer::{Token, TokenError, TokenReader, Tokenizer}; - - fn setup() { - let _ = env_logger::try_init(); - } - - fn collect_token(input: &str) -> (Vec, Option) { - let mut tokenizer = Tokenizer::new(input); - let mut vec = vec![]; - loop { - match tokenizer.next_token() { - Ok(t) => vec.push(t), - Err(e) => return (vec, Some(e)), - } - } - } - - fn run(input: &str, expected: (Vec, Option)) { - let (vec, err) = collect_token(input); - assert_eq!((vec, err), expected, "\"{}\"", input); - } - - #[test] - fn peek() { - let mut tokenizer = TokenReader::new("$.a"); - match tokenizer.next_token() { - Ok(t) => assert_eq!(Token::Absolute(0), t), - _ => panic!(), - } - - match tokenizer.peek_token() { - Ok(t) => assert_eq!(&Token::Dot(1), t), - _ => panic!(), - } - - match tokenizer.peek_token() { - Ok(t) => assert_eq!(&Token::Dot(1), t), - _ => panic!(), - } - - match tokenizer.next_token() { - Ok(t) => assert_eq!(Token::Dot(1), t), - _ => panic!(), - } - } - - #[test] - fn token() { - setup(); - - run( - "$.01.a", - ( - vec![ - Token::Absolute(0), - Token::Dot(1), - Token::Key(2, "01".to_string()), - Token::Dot(4), - Token::Key(5, "a".to_string()), - ], - Some(TokenError::Eof), - ), - ); - - run( - "$. []", - ( - vec![ - Token::Absolute(0), - Token::Dot(1), - Token::Whitespace(2, 2), - Token::OpenArray(5), - Token::CloseArray(6), - ], - Some(TokenError::Eof), - ), - ); - - run( - "$..", - ( - vec![Token::Absolute(0), Token::Dot(1), Token::Dot(2)], - Some(TokenError::Eof), - ), - ); - - run( - "$..ab", - ( - vec![ - Token::Absolute(0), - Token::Dot(1), - Token::Dot(2), - Token::Key(3, "ab".to_string()), - ], - Some(TokenError::Eof), - ), - ); - - run( - "$..가 [", - ( - vec![ - Token::Absolute(0), - Token::Dot(1), - Token::Dot(2), - Token::Key(3, "가".to_string()), - Token::Whitespace(6, 0), - Token::OpenArray(7), - ], - Some(TokenError::Eof), - ), - ); - - run( - "[-1, 2 ]", - ( - vec![ - Token::OpenArray(0), - Token::Key(1, "-1".to_string()), - Token::Comma(3), - Token::Whitespace(4, 0), - Token::Key(5, "2".to_string()), - Token::Whitespace(6, 0), - Token::CloseArray(7), - ], - Some(TokenError::Eof), - ), - ); - - run( - "[ 1 2 , 3 \"abc\" : -10 ]", - ( - vec![ - Token::OpenArray(0), - Token::Whitespace(1, 0), - Token::Key(2, "1".to_string()), - Token::Whitespace(3, 0), - Token::Key(4, "2".to_string()), - Token::Whitespace(5, 0), - Token::Comma(6), - Token::Whitespace(7, 0), - Token::Key(8, "3".to_string()), - Token::Whitespace(9, 0), - Token::DoubleQuoted(10, "abc".to_string()), - Token::Whitespace(15, 0), - Token::Split(16), - Token::Whitespace(17, 0), - Token::Key(18, "-10".to_string()), - Token::Whitespace(21, 0), - Token::CloseArray(22), - ], - Some(TokenError::Eof), - ), - ); - - run( - "?(@.a가 <41.01)", - ( - vec![ - Token::Question(0), - Token::OpenParenthesis(1), - Token::At(2), - Token::Dot(3), - Token::Key(4, "a가".to_string()), - Token::Whitespace(8, 0), - Token::Little(9), - Token::Key(10, "41".to_string()), - Token::Dot(12), - Token::Key(13, "01".to_string()), - Token::CloseParenthesis(15), - ], - Some(TokenError::Eof), - ), - ); - - run( - "?(@.a <4a.01)", - ( - vec![ - Token::Question(0), - Token::OpenParenthesis(1), - Token::At(2), - Token::Dot(3), - Token::Key(4, "a".to_string()), - Token::Whitespace(5, 0), - Token::Little(6), - Token::Key(7, "4a".to_string()), - Token::Dot(9), - Token::Key(10, "01".to_string()), - Token::CloseParenthesis(12), - ], - Some(TokenError::Eof), - ), - ); - - run( - "?($.c>@.d)", - ( - vec![ - Token::Question(0), - Token::OpenParenthesis(1), - Token::Absolute(2), - Token::Dot(3), - Token::Key(4, "c".to_string()), - Token::Greater(5), - Token::At(6), - Token::Dot(7), - Token::Key(8, "d".to_string()), - Token::CloseParenthesis(9), - ], - Some(TokenError::Eof), - ), - ); - - run( - "$[:]", - ( - vec![ - Token::Absolute(0), - Token::OpenArray(1), - Token::Split(2), - Token::CloseArray(3), - ], - Some(TokenError::Eof), - ), - ); - - run( - r#"$['single\'quote']"#, - ( - vec![ - Token::Absolute(0), - Token::OpenArray(1), - Token::SingleQuoted(2, "single\'quote".to_string()), - Token::CloseArray(17), - ], - Some(TokenError::Eof), - ), - ); - - run( - r#"$['single\'1','single\'2']"#, - ( - vec![ - Token::Absolute(0), - Token::OpenArray(1), - Token::SingleQuoted(2, "single\'1".to_string()), - Token::Comma(13), - Token::SingleQuoted(14, "single\'2".to_string()), - Token::CloseArray(25), - ], - Some(TokenError::Eof), - ), - ); - - run( - r#"$["double\"quote"]"#, - ( - vec![ - Token::Absolute(0), - Token::OpenArray(1), - Token::DoubleQuoted(2, "double\"quote".to_string()), - Token::CloseArray(17), - ], - Some(TokenError::Eof), - ), - ); - } -} +// #[cfg(test)] +// mod parser_tests { +// use parser::{FilterToken, NodeVisitor, ParseToken, Parser}; +// +// struct NodeVisitorTestImpl<'a> { +// input: &'a str, +// stack: Vec, +// } +// +// impl<'a> NodeVisitorTestImpl<'a> { +// fn new(input: &'a str) -> Self { +// NodeVisitorTestImpl { +// input, +// stack: Vec::new(), +// } +// } +// +// fn start(&mut self) -> Result, String> { +// let node = Parser::compile(self.input)?; +// self.visit(&node); +// Ok(self.stack.split_off(0)) +// } +// } +// +// impl<'a> NodeVisitor for NodeVisitorTestImpl<'a> { +// fn visit_token(&mut self, token: &ParseToken) { +// self.stack.push(token.clone()); +// } +// } +// +// fn setup() { +// let _ = env_logger::try_init(); +// } +// +// fn run(input: &str) -> Result, String> { +// let mut interpreter = NodeVisitorTestImpl::new(input); +// interpreter.start() +// } +// +// #[test] +// fn parse_error() { +// setup(); +// +// fn invalid(path: &str) { +// assert!(run(path).is_err()); +// } +// +// invalid("$[]"); +// invalid("$[a]"); +// invalid("$[?($.a)]"); +// invalid("$[?(@.a > @.b]"); +// invalid("$[?(@.a < @.b&&(@.c < @.d)]"); +// invalid("@."); +// invalid("$..[?(a <= @.a)]"); // invalid term value +// invalid("$['a', b]"); +// invalid("$[0, >=]"); +// invalid("$[a:]"); +// invalid("$[:a]"); +// invalid("$[::a]"); +// invalid("$[:>]"); +// invalid("$[1:>]"); +// invalid("$[1,,]"); +// invalid("$[?]"); +// invalid("$[?(1 = 1)]"); +// invalid("$[?(1 = >)]"); +// } +// +// #[test] +// fn parse_path() { +// setup(); +// +// assert_eq!( +// run("$.aa"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("aa".to_owned()) +// ]) +// ); +// +// assert_eq!( +// run("$.00.a"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("00".to_owned()), +// ParseToken::In, +// ParseToken::Key("a".to_owned()) +// ]) +// ); +// +// assert_eq!( +// run("$.00.韓창.seok"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("00".to_owned()), +// ParseToken::In, +// ParseToken::Key("韓창".to_owned()), +// ParseToken::In, +// ParseToken::Key("seok".to_owned()) +// ]) +// ); +// +// assert_eq!( +// run("$.*"), +// Ok(vec![ParseToken::Absolute, ParseToken::In, ParseToken::All]) +// ); +// +// assert_eq!( +// run("$..*"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Leaves, +// ParseToken::All +// ]) +// ); +// +// assert_eq!( +// run("$..[0]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Leaves, +// ParseToken::Array, +// ParseToken::Number(0.0), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.$a"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("$a".to_owned()) +// ]) +// ); +// +// assert_eq!( +// run("$.['$a']"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Key("$a".to_owned()), +// ParseToken::ArrayEof, +// ]) +// ); +// +// if run("$.").is_ok() { +// panic!(); +// } +// +// if run("$..").is_ok() { +// panic!(); +// } +// +// if run("$. a").is_ok() { +// panic!(); +// } +// } +// +// #[test] +// fn parse_array_syntax() { +// setup(); +// +// assert_eq!( +// run("$.book[?(@.isbn)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("book".to_string()), +// ParseToken::Array, +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("isbn".to_string()), +// ParseToken::ArrayEof +// ]) +// ); +// +// // +// // Array도 컨텍스트 In으로 간주 할거라서 중첩되면 하나만 +// // +// assert_eq!( +// run("$.[*]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[*]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[*].가"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof, +// ParseToken::In, +// ParseToken::Key("가".to_owned()) +// ]) +// ); +// +// assert_eq!( +// run("$.a[0][1]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Number(0_f64), +// ParseToken::ArrayEof, +// ParseToken::Array, +// ParseToken::Number(1_f64), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[1,2]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Union(vec![1, 2]), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[10:]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Range(Some(10), None, None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[:11]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Range(None, Some(11), None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[-12:13]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Range(Some(-12), Some(13), None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[0:3:2]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(Some(0), Some(3), Some(2)), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[:3:2]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(None, Some(3), Some(2)), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[:]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(None, None, None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[::]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(None, None, None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[::2]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(None, None, Some(2)), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$["a", 'b']"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Keys(vec!["a".to_string(), "b".to_string()]), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[?(1>2)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Number(1_f64), +// ParseToken::Number(2_f64), +// ParseToken::Filter(FilterToken::Greater), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[?($.b>3)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Array, +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("b".to_owned()), +// ParseToken::Number(3_f64), +// ParseToken::Filter(FilterToken::Greater), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$[?($.c>@.d && 1==2)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("c".to_owned()), +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("d".to_owned()), +// ParseToken::Filter(FilterToken::Greater), +// ParseToken::Number(1_f64), +// ParseToken::Number(2_f64), +// ParseToken::Filter(FilterToken::Equal), +// ParseToken::Filter(FilterToken::And), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$[?($.c>@.d&&(1==2||3>=4))]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("c".to_owned()), +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("d".to_owned()), +// ParseToken::Filter(FilterToken::Greater), +// ParseToken::Number(1_f64), +// ParseToken::Number(2_f64), +// ParseToken::Filter(FilterToken::Equal), +// ParseToken::Number(3_f64), +// ParseToken::Number(4_f64), +// ParseToken::Filter(FilterToken::GreaterOrEqual), +// ParseToken::Filter(FilterToken::Or), +// ParseToken::Filter(FilterToken::And), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$[?(@.a<@.b)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("a".to_owned()), +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("b".to_owned()), +// ParseToken::Filter(FilterToken::Little), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$[*][*][*]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof, +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof, +// ParseToken::Array, +// ParseToken::All, +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$['a']['bb']"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Key("a".to_string()), +// ParseToken::ArrayEof, +// ParseToken::Array, +// ParseToken::Key("bb".to_string()), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$.a[?(@.e==true)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::In, +// ParseToken::Key("a".to_string()), +// ParseToken::Array, +// ParseToken::Relative, +// ParseToken::In, +// ParseToken::Key("e".to_string()), +// ParseToken::Bool(true), +// ParseToken::Filter(FilterToken::Equal), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$[?(@ > 1)]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Relative, +// ParseToken::Number(1_f64), +// ParseToken::Filter(FilterToken::Greater), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run("$[:]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Range(None, None, None), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$['single\'quote']"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Key("single'quote".to_string()), +// ParseToken::ArrayEof +// ]) +// ); +// +// assert_eq!( +// run(r#"$["single\"quote"]"#), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Key(r#"single"quote"#.to_string()), +// ParseToken::ArrayEof +// ]) +// ); +// } +// +// #[test] +// fn parse_array_float() { +// setup(); +// +// assert_eq!( +// run("$[?(1.1<2.1)]"), +// Ok(vec![ +// ParseToken::Absolute, +// ParseToken::Array, +// ParseToken::Number(1.1), +// ParseToken::Number(2.1), +// ParseToken::Filter(FilterToken::Little), +// ParseToken::ArrayEof +// ]) +// ); +// +// if run("$[1.1]").is_ok() { +// panic!(); +// } +// +// if run("$[?(1.1<.2)]").is_ok() { +// panic!(); +// } +// +// if run("$[?(1.1<2.)]").is_ok() { +// panic!(); +// } +// +// if run("$[?(1.1<2.a)]").is_ok() { +// panic!(); +// } +// } +// } +// +// #[cfg(test)] +// mod tokenizer_tests { +// use parser::tokenizer::{Token, TokenError, TokenReader, Tokenizer}; +// +// fn setup() { +// let _ = env_logger::try_init(); +// } +// +// fn collect_token(input: &str) -> (Vec, Option) { +// let mut tokenizer = Tokenizer::new(input); +// let mut vec = vec![]; +// loop { +// match tokenizer.next_token() { +// Ok(t) => vec.push(t), +// Err(e) => return (vec, Some(e)), +// } +// } +// } +// +// fn run(input: &str, expected: (Vec, Option)) { +// let (vec, err) = collect_token(input); +// assert_eq!((vec, err), expected, "\"{}\"", input); +// } +// +// #[test] +// fn peek() { +// let mut tokenizer = TokenReader::new("$.a"); +// match tokenizer.next_token() { +// Ok(t) => assert_eq!(Token::Absolute(0), t), +// _ => panic!(), +// } +// +// match tokenizer.peek_token() { +// Ok(t) => assert_eq!(&Token::Dot(1), t), +// _ => panic!(), +// } +// +// match tokenizer.peek_token() { +// Ok(t) => assert_eq!(&Token::Dot(1), t), +// _ => panic!(), +// } +// +// match tokenizer.next_token() { +// Ok(t) => assert_eq!(Token::Dot(1), t), +// _ => panic!(), +// } +// } +// +// #[test] +// fn token() { +// setup(); +// +// run( +// "$.01.a", +// ( +// vec![ +// Token::Absolute(0), +// Token::Dot(1), +// Token::Key(2, "01".to_string()), +// Token::Dot(4), +// Token::Key(5, "a".to_string()), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "$. []", +// ( +// vec![ +// Token::Absolute(0), +// Token::Dot(1), +// Token::Whitespace(2, 2), +// Token::OpenArray(5), +// Token::CloseArray(6), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "$..", +// ( +// vec![Token::Absolute(0), Token::Dot(1), Token::Dot(2)], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "$..ab", +// ( +// vec![ +// Token::Absolute(0), +// Token::Dot(1), +// Token::Dot(2), +// Token::Key(3, "ab".to_string()), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "$..가 [", +// ( +// vec![ +// Token::Absolute(0), +// Token::Dot(1), +// Token::Dot(2), +// Token::Key(3, "가".to_string()), +// Token::Whitespace(6, 0), +// Token::OpenArray(7), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "[-1, 2 ]", +// ( +// vec![ +// Token::OpenArray(0), +// Token::Key(1, "-1".to_string()), +// Token::Comma(3), +// Token::Whitespace(4, 0), +// Token::Key(5, "2".to_string()), +// Token::Whitespace(6, 0), +// Token::CloseArray(7), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "[ 1 2 , 3 \"abc\" : -10 ]", +// ( +// vec![ +// Token::OpenArray(0), +// Token::Whitespace(1, 0), +// Token::Key(2, "1".to_string()), +// Token::Whitespace(3, 0), +// Token::Key(4, "2".to_string()), +// Token::Whitespace(5, 0), +// Token::Comma(6), +// Token::Whitespace(7, 0), +// Token::Key(8, "3".to_string()), +// Token::Whitespace(9, 0), +// Token::DoubleQuoted(10, "abc".to_string()), +// Token::Whitespace(15, 0), +// Token::Split(16), +// Token::Whitespace(17, 0), +// Token::Key(18, "-10".to_string()), +// Token::Whitespace(21, 0), +// Token::CloseArray(22), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "?(@.a가 <41.01)", +// ( +// vec![ +// Token::Question(0), +// Token::OpenParenthesis(1), +// Token::At(2), +// Token::Dot(3), +// Token::Key(4, "a가".to_string()), +// Token::Whitespace(8, 0), +// Token::Little(9), +// Token::Key(10, "41".to_string()), +// Token::Dot(12), +// Token::Key(13, "01".to_string()), +// Token::CloseParenthesis(15), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "?(@.a <4a.01)", +// ( +// vec![ +// Token::Question(0), +// Token::OpenParenthesis(1), +// Token::At(2), +// Token::Dot(3), +// Token::Key(4, "a".to_string()), +// Token::Whitespace(5, 0), +// Token::Little(6), +// Token::Key(7, "4a".to_string()), +// Token::Dot(9), +// Token::Key(10, "01".to_string()), +// Token::CloseParenthesis(12), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "?($.c>@.d)", +// ( +// vec![ +// Token::Question(0), +// Token::OpenParenthesis(1), +// Token::Absolute(2), +// Token::Dot(3), +// Token::Key(4, "c".to_string()), +// Token::Greater(5), +// Token::At(6), +// Token::Dot(7), +// Token::Key(8, "d".to_string()), +// Token::CloseParenthesis(9), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// "$[:]", +// ( +// vec![ +// Token::Absolute(0), +// Token::OpenArray(1), +// Token::Split(2), +// Token::CloseArray(3), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// r#"$['single\'quote']"#, +// ( +// vec![ +// Token::Absolute(0), +// Token::OpenArray(1), +// Token::SingleQuoted(2, "single\'quote".to_string()), +// Token::CloseArray(17), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// r#"$['single\'1','single\'2']"#, +// ( +// vec![ +// Token::Absolute(0), +// Token::OpenArray(1), +// Token::SingleQuoted(2, "single\'1".to_string()), +// Token::Comma(13), +// Token::SingleQuoted(14, "single\'2".to_string()), +// Token::CloseArray(25), +// ], +// Some(TokenError::Eof), +// ), +// ); +// +// run( +// r#"$["double\"quote"]"#, +// ( +// vec![ +// Token::Absolute(0), +// Token::OpenArray(1), +// Token::DoubleQuoted(2, "double\"quote".to_string()), +// Token::CloseArray(17), +// ], +// Some(TokenError::Eof), +// ), +// ); +// } +// } diff --git a/src/paths/handlers.rs b/src/paths/handlers.rs new file mode 100644 index 00000000..20f83480 --- /dev/null +++ b/src/paths/handlers.rs @@ -0,0 +1,79 @@ +use super::path_parser::ParseNode; +use super::str_reader::StrRange; +use super::tokens::{FilterToken, ParseToken}; + +pub trait ParseNodeVisitor<'a> { + fn visit(&self, parse_node: &ParseNode, token_handler: &mut F, parse_value_reader: &F1) + where + F: ParseTokenHandler<'a>, + F1: Fn(&StrRange) -> &'a str + { + trace!("visit {:?}", parse_node); + match &parse_node.token { + ParseToken::Absolute + | ParseToken::Relative + | ParseToken::All + | ParseToken::Key(_) + | ParseToken::Keys(_) + | ParseToken::Range(_, _, _) + | ParseToken::Union(_) + | ParseToken::Number(_) + | ParseToken::Bool(_) => { + token_handler.handle(&parse_node.token, parse_value_reader); + } + ParseToken::In | ParseToken::Leaves => { + if let Some(n) = &parse_node.left { + self.visit(&*n, token_handler, parse_value_reader); + } + + token_handler.handle(&parse_node.token, parse_value_reader); + + if let Some(n) = &parse_node.right { + self.visit(&*n, token_handler, parse_value_reader); + } + } + ParseToken::Array => { + if let Some(n) = &parse_node.left { + self.visit(&*n, token_handler, parse_value_reader); + } + + token_handler.handle(&parse_node.token, parse_value_reader); + + if let Some(n) = &parse_node.right { + self.visit(&*n, token_handler, parse_value_reader); + } + + token_handler.handle(&ParseToken::ArrayEof, parse_value_reader); + } + ParseToken::Filter(FilterToken::And) | ParseToken::Filter(FilterToken::Or) => { + if let Some(n) = &parse_node.left { + self.visit(&*n, token_handler, parse_value_reader); + } + + if let Some(n) = &parse_node.right { + self.visit(&*n, token_handler, parse_value_reader); + } + + token_handler.handle(&parse_node.token, parse_value_reader); + } + ParseToken::Filter(_) => { + if let Some(n) = &parse_node.left { + self.visit(&*n, token_handler, parse_value_reader); + } + + if let Some(n) = &parse_node.right { + self.visit(&*n, token_handler, parse_value_reader); + } + + token_handler.handle(&parse_node.token, parse_value_reader); + } + _ => {} + } + } +} + +pub trait ParseTokenHandler<'a> { + fn handle(&mut self, token: &ParseToken, parse_value_reader: &F) + where + F: Fn(&StrRange) -> &'a str; +} \ No newline at end of file diff --git a/src/paths/mod.rs b/src/paths/mod.rs new file mode 100644 index 00000000..8511cd8f --- /dev/null +++ b/src/paths/mod.rs @@ -0,0 +1,10 @@ +pub use self::handlers::ParseTokenHandler; +pub use self::path_parser::PathParser; +pub use self::str_reader::StrRange; +pub use self::tokenizer::TokenError; + +mod str_reader; +mod tokenizer; +pub mod tokens; +mod handlers; +mod path_parser; \ No newline at end of file diff --git a/src/paths/path_parser.rs b/src/paths/path_parser.rs new file mode 100644 index 00000000..83c27b8f --- /dev/null +++ b/src/paths/path_parser.rs @@ -0,0 +1,1181 @@ +use std::str::FromStr; + +use super::str_reader::StrRange; +use super::tokenizer::{TokenError, TokenReader}; +use super::tokens::{FilterToken, ParseToken, Token}; +use super::handlers::{ParseNodeVisitor, ParseTokenHandler}; + +#[derive(Clone, Debug)] +pub struct PathParser<'a> { + parser: ParserImpl<'a>, +} + +impl<'a> PathParser<'a> { + pub fn compile(input: &'a str) -> Result { + let mut parser = ParserImpl::new(input); + parser.compile()?; + Ok(PathParser { parser }) + } + + pub fn parse(&self, parse_token_handler: &mut F) -> Result<(), String> + where + F: ParseTokenHandler<'a>, + { + if self.parser.parse_node.is_none() { + unreachable!() + } + + let token_reader = &self.parser.token_reader; + if let Some(parse_node) = self.parser.parse_node.as_ref() { + self.visit(&parse_node, parse_token_handler, &|s| { + token_reader.read_value(s) + }); + } + + Ok(()) + } +} + +impl<'a> ParseNodeVisitor<'a> for PathParser<'a> {} + +#[derive(Clone, Debug)] +struct ParserImpl<'a> { + token_reader: TokenReader<'a>, + parse_node: Option, +} + +impl<'a> ParserImpl<'a> { + pub fn new(input: &'a str) -> Self { + ParserImpl { + token_reader: TokenReader::new(input), + parse_node: None, + } + } + + fn string_to_num(string: &str, msg_handler: F) -> Result + where + F: Fn() -> TokenError, + { + match string.parse() { + Ok(n) => Ok(n), + _ => Err(msg_handler()), + } + } + + pub fn compile(&mut self) -> Result<&mut Self, TokenError> { + self.parse_node = Some(self.json_path()?); + Ok(self) + } + + fn json_path(&mut self) -> Result { + debug!("#json_path"); + match self.token_reader.next_token() { + Ok(Token::Absolute(_)) => { + let node = self.create_node(ParseToken::Absolute); + self.paths(node) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn paths(&mut self, prev: ParseNode) -> Result { + debug!("#paths"); + match self.token_reader.peek_token() { + Ok(Token::Dot(_)) => { + self.eat_token(); + self.paths_dot(prev) + } + Ok(Token::OpenArray(_)) => { + self.eat_token(); + self.eat_whitespace(); + let node = self.array(prev)?; + self.paths(node) + } + _ => Ok(prev), + } + } + + fn paths_dot(&mut self, prev: ParseNode) -> Result { + debug!("#paths_dot"); + let node = self.path(prev)?; + self.paths(node) + } + + fn path(&mut self, prev: ParseNode) -> Result { + debug!("#path"); + match self.token_reader.peek_token() { + Ok(Token::Dot(_)) => self.path_leaves(prev), + Ok(Token::Asterisk(_)) => self.path_in_all(prev), + Ok(Token::Key(_)) => self.path_in_key(prev), + Ok(Token::OpenArray(_)) => { + self.eat_token(); + self.array(prev) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn path_leaves(&mut self, prev: ParseNode) -> Result { + debug!("#path_leaves"); + self.eat_token(); + match self.token_reader.peek_token() { + Ok(Token::Asterisk(_)) => self.path_leaves_all(prev), + Ok(Token::OpenArray(_)) => { + let mut leaves_node = self.create_node(ParseToken::Leaves); + leaves_node.left = Some(Box::new(prev)); + Ok(self.paths(leaves_node)?) + } + _ => self.path_leaves_key(prev), + } + } + + #[allow(clippy::unnecessary_wraps)] + fn path_leaves_key(&mut self, prev: ParseNode) -> Result { + debug!("#path_leaves_key"); + Ok(ParseNode { + token: ParseToken::Leaves, + left: Some(Box::new(prev)), + right: Some(Box::new(self.key()?)), + }) + } + + #[allow(clippy::unnecessary_wraps)] + fn path_leaves_all(&mut self, prev: ParseNode) -> Result { + debug!("#path_leaves_all"); + self.eat_token(); + Ok(ParseNode { + token: ParseToken::Leaves, + left: Some(Box::new(prev)), + right: Some(Box::new(self.create_node(ParseToken::All))), + }) + } + + #[allow(clippy::unnecessary_wraps)] + fn path_in_all(&mut self, prev: ParseNode) -> Result { + debug!("#path_in_all"); + self.eat_token(); + Ok(ParseNode { + token: ParseToken::In, + left: Some(Box::new(prev)), + right: Some(Box::new(self.create_node(ParseToken::All))), + }) + } + + #[allow(clippy::unnecessary_wraps)] + fn path_in_key(&mut self, prev: ParseNode) -> Result { + debug!("#path_in_key"); + Ok(ParseNode { + token: ParseToken::In, + left: Some(Box::new(prev)), + right: Some(Box::new(self.key()?)), + }) + } + + fn key(&mut self) -> Result { + debug!("#key"); + match self.token_reader.next_token() { + Ok(Token::Key(s)) => Ok(self.create_node(ParseToken::Key(s))), + _ => Err(self.token_reader.to_error()), + } + } + + fn boolean(&mut self) -> Result { + debug!("#boolean"); + + fn validation_bool_value(v: &str) -> bool { + let b = v.as_bytes(); + !b.is_empty() && (b[0] == b't' || b[0] == b'T' || b[0] == b'f' || b[0] == b'F') + } + + if let Ok(Token::Key(s)) = self.token_reader.next_token() { + let v = self.token_reader.read_value(&s); + if validation_bool_value(v) { + return Ok(self.create_node(ParseToken::Bool(v.eq_ignore_ascii_case("true")))); + } + } + + Err(self.token_reader.to_error()) + } + + fn array_keys(&mut self, first_key: StrRange) -> Result { + let mut keys = vec![first_key]; + + while let Ok(Token::Comma(_)) = self.token_reader.peek_token() { + self.eat_token(); + self.eat_whitespace(); + + match self.token_reader.next_token() { + Ok(Token::SingleQuoted(s)) | Ok(Token::DoubleQuoted(s)) => { + keys.push(s); + } + _ => return Err(self.token_reader.to_error()), + } + + self.eat_whitespace(); + } + + Ok(self.create_node(ParseToken::Keys(keys))) + } + + fn array_quote_value(&mut self) -> Result { + debug!("#array_quote_value"); + let next = self.token_reader.next_token(); + match next { + Ok(Token::SingleQuoted(s)) | Ok(Token::DoubleQuoted(s)) => { + if let Ok(Token::Comma(_)) = self.token_reader.peek_token() { + self.array_keys(s) + } else { + Ok(self.create_node(ParseToken::Key(s))) + } + } + _ => Err(self.token_reader.to_error()), + } + } + + fn array_start(&mut self, prev: ParseNode) -> Result { + debug!("#array_start"); + match self.token_reader.peek_token() { + Ok(Token::Question(_)) => { + self.eat_token(); + Ok(ParseNode { + token: ParseToken::Array, + left: Some(Box::new(prev)), + right: Some(Box::new(self.filter()?)), + }) + } + Ok(Token::Asterisk(_)) => { + self.eat_token(); + Ok(ParseNode { + token: ParseToken::Array, + left: Some(Box::new(prev)), + right: Some(Box::new(self.create_node(ParseToken::All))), + }) + } + _ => Ok(ParseNode { + token: ParseToken::Array, + left: Some(Box::new(prev)), + right: Some(Box::new(self.array_value()?)), + }), + } + } + + fn array(&mut self, prev: ParseNode) -> Result { + debug!("#array"); + let ret = self.array_start(prev)?; + self.eat_whitespace(); + self.close_token(ret, Token::CloseArray(StrRange::new(0, 0))) + } + + fn array_value_key(&mut self) -> Result { + debug!("#array_value_key"); + + if let Ok(Token::Key(s)) = self.token_reader.next_token() { + let val = self.token_reader.read_value(&s); + let digit = Self::string_to_num(val, || self.token_reader.to_error())?; + self.eat_whitespace(); + + match self.token_reader.peek_token() { + Ok(Token::Comma(_)) => self.union(digit), + Ok(Token::Split(_)) => self.range_from(digit), + _ => Ok(self.create_node(ParseToken::Number(digit as f64))), + } + } else { + Err(self.token_reader.to_error()) + } + } + + fn array_value(&mut self) -> Result { + debug!("#array_value"); + match self.token_reader.peek_token() { + Ok(Token::Key(_)) => self.array_value_key(), + Ok(Token::Split(_)) => { + self.eat_token(); + self.range_to() + } + Ok(Token::DoubleQuoted(_)) | Ok(Token::SingleQuoted(_)) => { + self.array_quote_value() + } + Err(TokenError::Eof) => Ok(self.create_node(ParseToken::Eof)), + _ => { + self.eat_token(); + Err(self.token_reader.to_error()) + } + } + } + + fn union(&mut self, num: isize) -> Result { + debug!("#union"); + let mut values = vec![num]; + while matches!(self.token_reader.peek_token(), Ok(Token::Comma(_))) { + self.eat_token(); + self.eat_whitespace(); + + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let val = self.token_reader.read_value(&s); + let digit = Self::string_to_num(val, || self.token_reader.to_error())?; + values.push(digit); + } + _ => { + return Err(self.token_reader.to_error()); + } + } + } + Ok(self.create_node(ParseToken::Union(values))) + } + + fn range_value(&mut self) -> Result, TokenError> { + self.eat_whitespace(); + + match self.token_reader.peek_token() { + Ok(Token::Split(_)) => { + self.eat_token(); + self.eat_whitespace(); + } + _ => { + return Ok(None); + } + } + + match self.token_reader.peek_token() { + Ok(Token::Key(_)) => {} + _ => { + return Ok(None); + } + } + + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let str_step = self.token_reader.read_value(&s); + match Self::string_to_num(&str_step, || self.token_reader.to_error()) { + Ok(step) => Ok(Some(step)), + Err(e) => Err(e), + } + } + _ => { + unreachable!(); + } + } + } + + fn range_from(&mut self, from: isize) -> Result { + debug!("#range_from"); + self.eat_token(); + self.eat_whitespace(); + + match self.token_reader.peek_token() { + Ok(Token::Key(_)) => self.range(from), + Ok(Token::Split(_)) => match self.range_value()? { + Some(step) => Ok(self.create_node(ParseToken::Range(Some(from), None, Some(step)))), + _ => Ok(self.create_node(ParseToken::Range(Some(from), None, None))), + }, + _ => Ok(self.create_node(ParseToken::Range(Some(from), None, None))), + } + } + + fn range_to(&mut self) -> Result { + debug!("#range_to"); + + if let Some(step) = self.range_value()? { + return Ok(self.create_node(ParseToken::Range(None, None, Some(step)))); + } + + if let Ok(Token::CloseArray(_)) = self.token_reader.peek_token() { + return Ok(self.create_node(ParseToken::Range(None, None, None))); + } + + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let to_str = self.token_reader.read_value(&s); + let to = Self::string_to_num(to_str, || self.token_reader.to_error())?; + let step = self.range_value()?; + Ok(self.create_node(ParseToken::Range(None, Some(to), step))) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn range(&mut self, from: isize) -> Result { + debug!("#range"); + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let str_to = self.token_reader.read_value(&s); + let to = Self::string_to_num(str_to, || self.token_reader.to_error())?; + let step = self.range_value()?; + Ok(self.create_node(ParseToken::Range(Some(from), Some(to), step))) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn filter(&mut self) -> Result { + debug!("#filter"); + match self.token_reader.next_token() { + Ok(Token::OpenParenthesis(_)) => { + let ret = self.exprs()?; + self.eat_whitespace(); + self.close_token(ret, Token::CloseParenthesis(StrRange::new(0, 0))) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn exprs(&mut self) -> Result { + self.eat_whitespace(); + debug!("#exprs"); + let node = match self.token_reader.peek_token() { + Ok(Token::OpenParenthesis(_)) => { + self.eat_token(); + trace!("\t-exprs - open_parenthesis"); + let ret = self.exprs()?; + self.eat_whitespace(); + self.close_token(ret, Token::CloseParenthesis(StrRange::new(0, 0)))? + } + _ => { + trace!("\t-exprs - else"); + self.expr()? + } + }; + self.eat_whitespace(); + self.condition_expr(node) + } + + fn condition_expr(&mut self, prev: ParseNode) -> Result { + debug!("#condition_expr"); + match self.token_reader.peek_token() { + Ok(Token::And(_)) => { + self.eat_token(); + Ok(ParseNode { + token: ParseToken::Filter(FilterToken::And), + left: Some(Box::new(prev)), + right: Some(Box::new(self.exprs()?)), + }) + } + Ok(Token::Or(_)) => { + self.eat_token(); + Ok(ParseNode { + token: ParseToken::Filter(FilterToken::Or), + left: Some(Box::new(prev)), + right: Some(Box::new(self.exprs()?)), + }) + } + _ => Ok(prev), + } + } + + fn expr(&mut self) -> Result { + debug!("#expr"); + + let has_prop_candidate = matches!(self.token_reader.peek_token(), Ok(Token::At(_))); + + let node = self.term()?; + self.eat_whitespace(); + + if matches!(self.token_reader.peek_token(), + Ok(Token::Equal(_)) + | Ok(Token::NotEqual(_)) + | Ok(Token::Little(_)) + | Ok(Token::LittleOrEqual(_)) + | Ok(Token::Greater(_)) + | Ok(Token::GreaterOrEqual(_))) + { + self.op(node) + } else if has_prop_candidate { + Ok(node) + } else { + Err(self.token_reader.to_error()) + } + } + + fn term_num(&mut self) -> Result { + debug!("#term_num"); + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let val = self.token_reader.read_value(&s); + match self.token_reader.peek_token() { + Ok(Token::Dot(_)) => self.term_num_float(val), + _ => { + let number = Self::string_to_num(&val, || self.token_reader.to_error())?; + Ok(self.create_node(ParseToken::Number(number))) + } + } + } + _ => Err(self.token_reader.to_error()), + } + } + + fn term_num_float(&mut self, num: &'a str) -> Result { + debug!("#term_num_float"); + self.eat_token(); + match self.token_reader.next_token() { + Ok(Token::Key(s)) => { + let frac = self.token_reader.read_value(&s); + let number = Self::string_to_num(&[num, ".", frac].concat(), || self.token_reader.to_error())?; + Ok(self.create_node(ParseToken::Number(number))) + } + _ => Err(self.token_reader.to_error()), + } + } + + fn term(&mut self) -> Result { + debug!("#term"); + + if let Err(_) = self.token_reader.peek_token() { + return Err(self.token_reader.to_error()); + } + + let has_term_key = if let Ok(Token::Key(s)) = self.token_reader.peek_token() { + Some(s.clone()) + } else { + None + }; + + if let Some(s) = has_term_key { + let key = self.token_reader.read_value(&s); + return match key.as_bytes()[0] { + b'-' | b'0'..=b'9' => self.term_num(), + _ => self.boolean(), + }; + } + + match self.token_reader.peek_token() { + Ok(Token::At(_)) => { + self.eat_token(); + + let node = self.create_node(ParseToken::Relative); + match self.token_reader.peek_token() { + Ok(Token::Whitespace(_)) => { + self.eat_whitespace(); + Ok(node) + } + _ => self.paths(node), + } + } + Ok(Token::Absolute(_)) => { + self.json_path() + } + Ok(Token::DoubleQuoted(_)) | Ok(Token::SingleQuoted(_)) => { + self.array_quote_value() + } + _ => { + Err(self.token_reader.to_error()) + } + } + } + + fn op(&mut self, prev: ParseNode) -> Result { + debug!("#op"); + let token = match self.token_reader.next_token() { + Ok(Token::Equal(_)) => ParseToken::Filter(FilterToken::Equal), + Ok(Token::NotEqual(_)) => ParseToken::Filter(FilterToken::NotEqual), + Ok(Token::Little(_)) => ParseToken::Filter(FilterToken::Little), + Ok(Token::LittleOrEqual(_)) => ParseToken::Filter(FilterToken::LittleOrEqual), + Ok(Token::Greater(_)) => ParseToken::Filter(FilterToken::Greater), + Ok(Token::GreaterOrEqual(_)) => ParseToken::Filter(FilterToken::GreaterOrEqual), + _ => { + return Err(self.token_reader.to_error()); + } + }; + + self.eat_whitespace(); + + Ok(ParseNode { + token, + left: Some(Box::new(prev)), + right: Some(Box::new(self.term()?)), + }) + } + + fn eat_whitespace(&mut self) { + while let Ok(Token::Whitespace(_)) = self.token_reader.peek_token() { + let _ = self.token_reader.next_token(); + } + } + + fn eat_token(&mut self) { + let _ = self.token_reader.next_token(); + } + + fn close_token(&mut self, ret: ParseNode, token: Token) -> Result { + debug!("#close_token"); + match self.token_reader.next_token() { + Ok(ref t) if t.is_match_token_type(token) => Ok(ret), + _ => Err(self.token_reader.to_error()), + } + } + + fn create_node(&mut self, token: ParseToken) -> ParseNode { + ParseNode { + left: None, + right: None, + token, + } + } +} + +#[derive(Debug, Clone)] +pub struct ParseNode { + pub left: Option>, + pub right: Option>, + pub token: ParseToken, +} + +#[cfg(test)] +mod path_parser_tests { + use paths::ParseTokenHandler; + use paths::path_parser::PathParser; + use paths::str_reader::StrRange; + use paths::tokens::{FilterToken, ParseToken}; + + struct NodeVisitorTestImpl<'a> { + input: &'a str, + stack: Vec, + } + + impl<'a> NodeVisitorTestImpl<'a> { + fn new(input: &'a str) -> Self { + NodeVisitorTestImpl { + input, + stack: Vec::new(), + } + } + + fn start(&mut self) -> Result, String> { + let parser = PathParser::compile(self.input).map_err(|_| "Token Error")?; + let _ = parser.parse(self); + Ok(self.stack.split_off(0)) + } + } + + impl<'a> ParseTokenHandler<'a> for NodeVisitorTestImpl<'a> { + fn handle(&mut self, token: &ParseToken, _: &F) + where + F: Fn(&StrRange) -> &'a str + { + trace!("handle {:?}", token); + self.stack.push(token.clone()); + } + } + + fn setup() { + let _ = env_logger::try_init(); + } + + fn run(input: &str) -> Result, String> { + let mut interpreter = NodeVisitorTestImpl::new(input); + interpreter.start() + } + + #[test] + fn parse_error() { + setup(); + + fn invalid(path: &str) { + assert!(run(path).is_err()); + } + + invalid("$[]"); + invalid("$[a]"); + invalid("$[?($.a)]"); + invalid("$[?(@.a > @.b]"); + invalid("$[?(@.a < @.b&&(@.c < @.d)]"); + invalid("@."); + invalid("$..[?(a <= @.a)]"); // invalid term value + invalid("$['a', b]"); + invalid("$[0, >=]"); + invalid("$[a:]"); + invalid("$[:a]"); + invalid("$[::a]"); + invalid("$[:>]"); + invalid("$[1:>]"); + invalid("$[1,,]"); + invalid("$[?]"); + invalid("$[?(1 = 1)]"); + invalid("$[?(1 = >)]"); + } + + #[test] + fn parse_path() { + setup(); + + assert_eq!( + run("$.aa"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "aa".len())) + ]) + ); + + assert_eq!( + run("$.00.a"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "00".len())), + ParseToken::In, + ParseToken::Key(StrRange::new(5, "a".len())) + ]) + ); + + assert_eq!( + run("$.00.韓창.seok"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "00".len())), + ParseToken::In, + ParseToken::Key(StrRange::new(5, "韓창".chars().map(|c| c.len_utf8()).sum())), + ParseToken::In, + ParseToken::Key(StrRange::new(12, "seok".len())) + ]) + ); + + assert_eq!( + run("$.*"), + Ok(vec![ParseToken::Absolute, ParseToken::In, ParseToken::All]) + ); + + assert_eq!( + run("$..*"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Leaves, + ParseToken::All + ]) + ); + + assert_eq!( + run("$..[0]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Leaves, + ParseToken::Array, + ParseToken::Number(0.0), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.$a"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "$a".len())) + ]) + ); + + assert_eq!( + run("$.['$a']"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key(StrRange::new(3, "'$a'".len())), + ParseToken::ArrayEof, + ]) + ); + + if run("$.").is_ok() { + panic!(); + } + + if run("$..").is_ok() { + panic!(); + } + + if run("$. a").is_ok() { + panic!(); + } + } + + #[test] + fn parse_array_syntax() { + setup(); + + assert_eq!( + run("$.book[?(@.isbn)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "book".len())), + ParseToken::Array, + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(11, "isbn".len())), + ParseToken::ArrayEof + ]) + ); + + // + // Array도 컨텍스트 In으로 간주 할거라서 중첩되면 하나만 + // + assert_eq!( + run("$.[*]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[*]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[*].가"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof, + ParseToken::In, + ParseToken::Key(StrRange::new(7, '가'.len_utf8())) + ]) + ); + + assert_eq!( + run("$.a[0][1]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Number(0_f64), + ParseToken::ArrayEof, + ParseToken::Array, + ParseToken::Number(1_f64), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[1,2]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Union(vec![1, 2]), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[10:]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Range(Some(10), None, None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[:11]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Range(None, Some(11), None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[-12:13]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Range(Some(-12), Some(13), None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[0:3:2]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(Some(0), Some(3), Some(2)), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[:3:2]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, Some(3), Some(2)), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[:]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[::]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[::2]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, Some(2)), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$["a", 'b']"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Keys(vec![StrRange::new(2, "\"a\"".len()), StrRange::new(7, "'b'".len())]), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[?(1>2)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Number(1_f64), + ParseToken::Number(2_f64), + ParseToken::Filter(FilterToken::Greater), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[?($.b>3)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(8, "b".len())), + ParseToken::Number(3_f64), + ParseToken::Filter(FilterToken::Greater), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$[?($.c>@.d && 1==2)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(6, "c".len())), + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(10, "c".len())), + ParseToken::Filter(FilterToken::Greater), + ParseToken::Number(1_f64), + ParseToken::Number(2_f64), + ParseToken::Filter(FilterToken::Equal), + ParseToken::Filter(FilterToken::And), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$[?($.c>@.d&&(1==2||3>=4))]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(6, "c".len())), + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(10, "d".len())), + ParseToken::Filter(FilterToken::Greater), + ParseToken::Number(1_f64), + ParseToken::Number(2_f64), + ParseToken::Filter(FilterToken::Equal), + ParseToken::Number(3_f64), + ParseToken::Number(4_f64), + ParseToken::Filter(FilterToken::GreaterOrEqual), + ParseToken::Filter(FilterToken::Or), + ParseToken::Filter(FilterToken::And), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$[?(@.a<@.b)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(6, "a".len())), + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(10, "b".len())), + ParseToken::Filter(FilterToken::Little), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$[*][*][*]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof, + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof, + ParseToken::Array, + ParseToken::All, + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$['a']['bb']"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key(StrRange::new(2, "'a'".len())), + ParseToken::ArrayEof, + ParseToken::Array, + ParseToken::Key(StrRange::new(7, "'bb'".len())), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$.a[?(@.e==true)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::In, + ParseToken::Key(StrRange::new(2, "a".len())), + ParseToken::Array, + ParseToken::Relative, + ParseToken::In, + ParseToken::Key(StrRange::new(8, "e".len())), + ParseToken::Bool(true), + ParseToken::Filter(FilterToken::Equal), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$[?(@ > 1)]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Relative, + ParseToken::Number(1_f64), + ParseToken::Filter(FilterToken::Greater), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run("$[:]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$['single\'quote']"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key(StrRange::new(2, r#"'single\'quote'"#.len())), + ParseToken::ArrayEof + ]) + ); + + assert_eq!( + run(r#"$["single\"quote"]"#), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key(StrRange::new(2, r#""single\"quote""#.len())), + ParseToken::ArrayEof + ]) + ); + } + + #[test] + fn parse_array_float() { + setup(); + + assert_eq!( + run("$[?(1.1<2.1)]"), + Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Number(1.1), + ParseToken::Number(2.1), + ParseToken::Filter(FilterToken::Little), + ParseToken::ArrayEof + ]) + ); + + if run("$[1.1]").is_ok() { + panic!(); + } + + if run("$[?(1.1<.2)]").is_ok() { + panic!(); + } + + if run("$[?(1.1<2.)]").is_ok() { + panic!(); + } + + if run("$[?(1.1<2.a)]").is_ok() { + panic!(); + } + } +} diff --git a/src/paths/str_reader.rs b/src/paths/str_reader.rs new file mode 100644 index 00000000..11b74a70 --- /dev/null +++ b/src/paths/str_reader.rs @@ -0,0 +1,90 @@ +use std::result::Result; +use std::str::Chars; + +#[derive(Debug, PartialEq)] +pub enum ReaderError { + Eof, +} + +#[derive(Debug, PartialEq, Clone)] +pub struct StrRange { + pub pos: usize, + pub offset: usize, +} + +impl StrRange { + pub fn new(pos: usize, offset: usize) -> Self { + StrRange { pos, offset } + } +} + +#[derive(Clone, Debug)] +pub(crate) struct StrReader<'a> { + input: &'a str, + pos: usize, + chars: Chars<'a>, + peeked: Option>, +} + +impl<'a> StrReader<'a> { + pub fn new(input: &'a str) -> Self { + StrReader { input, pos: 0, chars: input.chars(), peeked: None } + } + + pub fn peek_char(&mut self) -> Result { + let ch = self.peek().ok_or(ReaderError::Eof)?; + Ok(*ch) + } + + pub fn take_while(&mut self, fun: F) -> Result + where + F: Fn(&char) -> bool, + { + let mut char_len: usize = 0; + while let Some(c) = self.peek() { + if !fun(c) { + break; + } + match self.next() { + Some(ch) => char_len += ch.len_utf8(), + _ => return Err(ReaderError::Eof) + } + } + + let pos = self.pos; + self.pos += char_len; + Ok(StrRange::new(pos, char_len)) + } + + pub fn next_char(&mut self) -> Result<(StrRange, char), ReaderError> { + let ch = self.next().ok_or(ReaderError::Eof)?; + let pos = self.pos; + let len = ch.len_utf8(); + self.pos += len; + Ok((StrRange::new(pos, len), ch)) + } + + pub fn read(&self, span: &StrRange) -> &'a str { + &self.input[span.pos..(span.pos + span.offset)] + } + + pub fn current_pos(&self) -> usize { + self.pos + } + + pub fn origin_str(&self) -> &'a str { + self.input + } + + fn next(&mut self) -> Option { + match self.peeked.take() { + Some(v) => v, + None => self.chars.next(), + } + } + + fn peek(&mut self) -> Option<&char> { + let chars = &mut self.chars; + self.peeked.get_or_insert_with(|| chars.next()).as_ref() + } +} diff --git a/src/paths/tokenizer.rs b/src/paths/tokenizer.rs new file mode 100644 index 00000000..547fb4c9 --- /dev/null +++ b/src/paths/tokenizer.rs @@ -0,0 +1,602 @@ +use std::result::Result; + +use super::str_reader::{ReaderError, StrRange, StrReader}; +use super::tokens::Token; + +const CH_DOLLA: char = '$'; +const CH_DOT: char = '.'; +const CH_ASTERISK: char = '*'; +const CH_LARRAY: char = '['; +const CH_RARRAY: char = ']'; +const CH_LPAREN: char = '('; +const CH_RPAREN: char = ')'; +const CH_AT: char = '@'; +const CH_QUESTION: char = '?'; +const CH_COMMA: char = ','; +const CH_SEMICOLON: char = ':'; +const CH_EQUAL: char = '='; +const CH_AMPERSAND: char = '&'; +const CH_PIPE: char = '|'; +const CH_LITTLE: char = '<'; +const CH_GREATER: char = '>'; +const CH_EXCLAMATION: char = '!'; +const CH_SINGLE_QUOTE: char = '\''; +const CH_DOUBLE_QUOTE: char = '"'; + +#[derive(Debug, Clone, PartialEq)] +pub enum TokenError { + Eof, + Position(usize), +} + +fn to_token_error(read_err: ReaderError) -> TokenError { + match read_err { + ReaderError::Eof => TokenError::Eof, + } +} + +#[derive(Clone, Debug)] +pub(super) struct Tokenizer<'a> { + input: StrReader<'a>, +} + +impl<'a> Tokenizer<'a> { + pub fn new(input: &'a str) -> Self { + trace!("input: {}", input); + Tokenizer { + input: StrReader::new(input), + } + } + + fn dolla(&mut self) -> Result { + let fun = |c: &char| match c { + &CH_DOT + | &CH_ASTERISK + | &CH_LARRAY + | &CH_RARRAY + | &CH_LPAREN + | &CH_RPAREN + | &CH_AT + | &CH_QUESTION + | &CH_COMMA + | &CH_SEMICOLON + | &CH_LITTLE + | &CH_GREATER + | &CH_EQUAL + | &CH_AMPERSAND + | &CH_PIPE + | &CH_EXCLAMATION + => false, + _ => !c.is_whitespace(), + }; + let read = self.input.take_while(fun).map_err(to_token_error)?; + if read.offset == 0 { + Ok(Token::Absolute(read)) + } else { + Ok(Token::Key(read)) + } + } + + fn quote(&mut self, ch: char) -> Result { + let span = self.input.take_while(|c| *c != ch).map_err(to_token_error)?; + let val = self.input.read(&span); + if let Some('\\') = val.chars().last() { + self.input.next_char().map_err(to_token_error)?; + let remain_span = self.input.take_while(|c| *c != ch).map_err(to_token_error)?; + self.input.next_char().map_err(to_token_error)?; + Ok(StrRange::new(span.pos, remain_span.offset)) + } else { + self.input.next_char().map_err(to_token_error)?; + Ok(span) + } + } + + fn single_quote(&mut self, ch: char) -> Result { + Ok(Token::SingleQuoted(self.quote(ch)?)) + } + + fn double_quote(&mut self, ch: char) -> Result { + Ok(Token::DoubleQuoted(self.quote(ch)?)) + } + + fn equal(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_EQUAL => { + self.input.next_char().map_err(to_token_error)?; + Ok(Token::Equal(span)) + } + _ => Err(TokenError::Position(span.pos)), + } + } + + fn not_equal(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_EQUAL => { + self.input.next_char().map_err(to_token_error)?; + Ok(Token::NotEqual(span)) + } + _ => Err(TokenError::Position(span.pos)), + } + } + + fn little(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_EQUAL => { + self.input.next_char().map_err(to_token_error)?; + Ok(Token::LittleOrEqual(span)) + } + _ => Ok(Token::Little(span)), + } + } + + fn greater(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_EQUAL => { + self.input.next_char().map_err(to_token_error)?; + Ok(Token::GreaterOrEqual(span)) + } + _ => Ok(Token::Greater(span)), + } + } + + fn and(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_AMPERSAND => { + let _ = self.input.next_char().map_err(to_token_error); + Ok(Token::And(span)) + } + _ => Err(TokenError::Position(span.pos)), + } + } + + fn or(&mut self, span: StrRange) -> Result { + let ch = self.input.peek_char().map_err(to_token_error)?; + match ch { + CH_PIPE => { + self.input.next_char().map_err(to_token_error)?; + Ok(Token::Or(span)) + } + _ => Err(TokenError::Position(span.pos)), + } + } + + fn whitespace(&mut self) -> Result { + let span = self + .input + .take_while(|c| c.is_whitespace()) + .map_err(to_token_error)?; + Ok(Token::Whitespace(span)) + } + + fn other(&mut self) -> Result { + let fun = |c: &char| match c { + &CH_DOLLA + | &CH_DOT + | &CH_ASTERISK + | &CH_LARRAY + | &CH_RARRAY + | &CH_LPAREN + | &CH_RPAREN + | &CH_AT + | &CH_QUESTION + | &CH_COMMA + | &CH_SEMICOLON + | &CH_LITTLE + | &CH_GREATER + | &CH_EQUAL + | &CH_AMPERSAND + | &CH_PIPE + | &CH_EXCLAMATION + => false, + _ => !c.is_whitespace(), + }; + let span = self.input.take_while(fun).map_err(to_token_error)?; + Ok(Token::Key(span)) + } + + fn read_token(&mut self, span: StrRange, ch: char) -> Result { + match ch { + CH_DOLLA => self.dolla(), + CH_DOT => Ok(Token::Dot(span)), + CH_ASTERISK => Ok(Token::Asterisk(span)), + CH_LARRAY => Ok(Token::OpenArray(span)), + CH_RARRAY => Ok(Token::CloseArray(span)), + CH_LPAREN => Ok(Token::OpenParenthesis(span)), + CH_RPAREN => Ok(Token::CloseParenthesis(span)), + CH_AT => Ok(Token::At(span)), + CH_QUESTION => Ok(Token::Question(span)), + CH_COMMA => Ok(Token::Comma(span)), + CH_SEMICOLON => Ok(Token::Split(span)), + CH_SINGLE_QUOTE => self.single_quote(ch), + CH_DOUBLE_QUOTE => self.double_quote(ch), + CH_EQUAL => self.equal(span), + CH_GREATER => self.greater(span), + CH_LITTLE => self.little(span), + CH_AMPERSAND => self.and(span), + CH_PIPE => self.or(span), + CH_EXCLAMATION => self.not_equal(span), + _ if ch.is_whitespace() => self.whitespace(), + _ => self.other(), + } + } + + pub fn next_token(&mut self) -> Result { + let (span, ch) = self.input.next_char().map_err(to_token_error)?; + match self.read_token(span, ch) { + Ok(t) => Ok(t), + Err(e) => Err(e.clone()), + } + } + + fn current_pos(&self) -> usize { + self.input.current_pos() + } + + fn read_span(&self, span: &StrRange) -> &'a str { + self.input.read(span) + } +} + +#[derive(Clone, Debug)] +pub(super) struct TokenReader<'a> { + tokenizer: Tokenizer<'a>, + tokens: Vec<(usize, Token)>, + curr_pos: usize, + err: TokenError, +} + +impl<'a> TokenReader<'a> { + pub fn new(input: &'a str) -> Self { + let mut tokenizer = Tokenizer::new(input); + let mut tokens = Vec::new(); + loop { + match tokenizer.next_token() { + Ok(mut token) => { + let prev_pos = if let Some((pos, _)) = tokens.get(0) { + *pos + } else { + 0 + }; + + // let new_token = match token { + // Token::SingleQuoted(ref range) | Token::DoubleQuoted(ref range) => { + // token.reset_span(StrRange::new(prev_pos + 1, tokenizer.current_pos() - prev_pos - 2)) + // } + // _ => token.reset_span(StrRange::new(prev_pos, tokenizer.current_pos() - prev_pos)) + // }; + let token = token.reset_span(StrRange::new(prev_pos, tokenizer.current_pos() - prev_pos)); + tokens.insert(0, (tokenizer.current_pos(), token)); + } + Err(err) => { + return TokenReader { + tokenizer, + tokens, + curr_pos: 0, + err, + }; + } + } + } + } + + pub fn read_value(&self, span: &StrRange) -> &'a str { + self.tokenizer.read_span(span) + } + + pub fn peek_token(&mut self) -> Result<&Token, TokenError> { + match self.tokens.last() { + Some((_, t)) => { + trace!("%{:?}", t); + Ok(t) + } + _ => { + trace!("%{:?}", self.err); + Err(self.err.clone()) + } + } + } + + pub fn next_token(&mut self) -> Result { + match self.tokens.pop() { + Some((pos, t)) => { + self.curr_pos = pos; + trace!("@{:?}", t); + Ok(t) + } + _ => { + trace!("@{:?}", self.err); + Err(self.err.clone()) + } + } + } + + pub fn to_error(&self) -> TokenError { + let path = self.tokenizer.input.origin_str(); + let curr_pos = self.curr_pos; + if path.len() == curr_pos { + TokenError::Eof + } else { + TokenError::Position(curr_pos) + } + } +} + +#[cfg(test)] +mod tokenizer_tests { + use paths::str_reader::StrRange; + use paths::tokenizer::{TokenError, TokenReader}; + use paths::tokens::Token; + + fn setup() { + let _ = env_logger::try_init(); + } + + fn collect_token(input: &str) -> (Vec, Option) { + let mut tokenizer = TokenReader::new(input); + let mut vec = vec![]; + loop { + match tokenizer.next_token() { + Ok(t) => vec.push(t), + Err(e) => return (vec, Some(e)), + } + } + } + + fn run(input: &str, expected: (Vec, Option)) { + let (vec, err) = collect_token(input); + assert_eq!((vec, err), expected, "\"{}\"", input); + } + + #[test] + fn peek() { + let mut tokenizer = TokenReader::new("$.a"); + match tokenizer.next_token() { + Ok(t) => assert_eq!(Token::Absolute(StrRange::new(0, 1)), t), + _ => panic!(), + } + + match tokenizer.peek_token() { + Ok(t) => assert_eq!(&Token::Dot(StrRange::new(1, 1)), t), + _ => panic!(), + } + + match tokenizer.peek_token() { + Ok(t) => assert_eq!(&Token::Dot(StrRange::new(1, 1)), t), + _ => panic!(), + } + + match tokenizer.next_token() { + Ok(t) => assert_eq!(Token::Dot(StrRange::new(1, 1)), t), + _ => panic!(), + } + } + + #[test] + fn token() { + setup(); + + run( + "$.01.a", + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::Dot(StrRange::new(1, 1)), + Token::Key(StrRange::new(2, 2)), + Token::Dot(StrRange::new(4, 1)), + Token::Key(StrRange::new(5, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "$. []", + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::Dot(StrRange::new(1, 1)), + Token::Whitespace(StrRange::new(2, 3)), + Token::OpenArray(StrRange::new(5, 1)), + Token::CloseArray(StrRange::new(6, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "$..", + ( + vec![Token::Absolute(StrRange::new(0, 1)), Token::Dot(StrRange::new(1, 1)), Token::Dot(StrRange::new(2, 1))], + Some(TokenError::Eof), + ), + ); + + run( + "$..ab", + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::Dot(StrRange::new(1, 1)), + Token::Dot(StrRange::new(2, 1)), + Token::Key(StrRange::new(3, "ab".len())), + ], + Some(TokenError::Eof), + ), + ); + + run( + "$..가 [", + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::Dot(StrRange::new(1, 1)), + Token::Dot(StrRange::new(2, 1)), + Token::Key(StrRange::new(3, '가'.len_utf8())), + Token::Whitespace(StrRange::new(6, 1)), + Token::OpenArray(StrRange::new(7, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "[-1, 2 ]", + ( + vec![ + Token::OpenArray(StrRange::new(0, 1)), + Token::Key(StrRange::new(1, "-1".len())), + Token::Comma(StrRange::new(3, 1)), + Token::Whitespace(StrRange::new(4, 1)), + Token::Key(StrRange::new(5, "2".len())), + Token::Whitespace(StrRange::new(6, 1)), + Token::CloseArray(StrRange::new(7, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "[ 1 2 , 3 \"abc\" : -10 ]", + ( + vec![ + Token::OpenArray(StrRange::new(0, 1)), + Token::Whitespace(StrRange::new(1, 1)), + Token::Key(StrRange::new(2, "1".len())), + Token::Whitespace(StrRange::new(3, 1)), + Token::Key(StrRange::new(4, "2".len())), + Token::Whitespace(StrRange::new(5, 1)), + Token::Comma(StrRange::new(6, 1)), + Token::Whitespace(StrRange::new(7, 1)), + Token::Key(StrRange::new(8, "3".len())), + Token::Whitespace(StrRange::new(9, 1)), + Token::DoubleQuoted(StrRange::new(10, "\"abc\"".len())), + Token::Whitespace(StrRange::new(15, 1)), + Token::Split(StrRange::new(16, 1)), + Token::Whitespace(StrRange::new(17, 1)), + Token::Key(StrRange::new(18, "-10".len())), + Token::Whitespace(StrRange::new(21, 1)), + Token::CloseArray(StrRange::new(22, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "?(@.a가 <41.01)", + ( + vec![ + Token::Question(StrRange::new(0, 1)), + Token::OpenParenthesis(StrRange::new(1, 1)), + Token::At(StrRange::new(2, 1)), + Token::Dot(StrRange::new(3, 1)), + Token::Key(StrRange::new(4, "a가".chars().map(|c| c.len_utf8()).sum())), + Token::Whitespace(StrRange::new(8, 1)), + Token::Little(StrRange::new(9, 1)), + Token::Key(StrRange::new(10, "41".len())), + Token::Dot(StrRange::new(12, 1)), + Token::Key(StrRange::new(13, "01".len())), + Token::CloseParenthesis(StrRange::new(15, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "?(@.a <4a.01)", + ( + vec![ + Token::Question(StrRange::new(0, 1)), + Token::OpenParenthesis(StrRange::new(1, 1)), + Token::At(StrRange::new(2, 1)), + Token::Dot(StrRange::new(3, 1)), + Token::Key(StrRange::new(4, "a".len())), + Token::Whitespace(StrRange::new(5, 1)), + Token::Little(StrRange::new(6, 1)), + Token::Key(StrRange::new(7, "4a".len())), + Token::Dot(StrRange::new(9, 1)), + Token::Key(StrRange::new(10, "01".len())), + Token::CloseParenthesis(StrRange::new(12, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "?($.c>@.d)", + ( + vec![ + Token::Question(StrRange::new(0, 1)), + Token::OpenParenthesis(StrRange::new(1, 1)), + Token::Absolute(StrRange::new(2, 1)), + Token::Dot(StrRange::new(3, 1)), + Token::Key(StrRange::new(4, 1)), + Token::Greater(StrRange::new(5, 1)), + Token::At(StrRange::new(6, 1)), + Token::Dot(StrRange::new(7, 1)), + Token::Key(StrRange::new(8, 1)), + Token::CloseParenthesis(StrRange::new(9, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + "$[:]", + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::OpenArray(StrRange::new(1, 1)), + Token::Split(StrRange::new(2, 1)), + Token::CloseArray(StrRange::new(3, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + r#"$['single\'quote']"#, + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::OpenArray(StrRange::new(1, 1)), + Token::SingleQuoted(StrRange::new(2, r#"'single\'quote'"#.len())), + Token::CloseArray(StrRange::new(17, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + r#"$['single\'1','single\'2']"#, + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::OpenArray(StrRange::new(1, 1)), + Token::SingleQuoted(StrRange::new(2, r#"'single\'1'"#.len())), + Token::Comma(StrRange::new(13, 1)), + Token::SingleQuoted(StrRange::new(14, r#"'single\'2'"#.len())), + Token::CloseArray(StrRange::new(25, 1)), + ], + Some(TokenError::Eof), + ), + ); + + run( + r#"$["double\"quote"]"#, + ( + vec![ + Token::Absolute(StrRange::new(0, 1)), + Token::OpenArray(StrRange::new(1, 1)), + Token::DoubleQuoted(StrRange::new(2, r#""double\"quote""#.len())), + Token::CloseArray(StrRange::new(17, 1)), + ], + Some(TokenError::Eof), + ), + ); + } +} \ No newline at end of file diff --git a/src/paths/tokens.rs b/src/paths/tokens.rs new file mode 100644 index 00000000..0d4cc919 --- /dev/null +++ b/src/paths/tokens.rs @@ -0,0 +1,131 @@ +use super::str_reader::StrRange; + +#[derive(Debug, PartialEq, Clone)] +pub enum Token { + Absolute(StrRange), + Dot(StrRange), + At(StrRange), + OpenArray(StrRange), + CloseArray(StrRange), + Asterisk(StrRange), + Question(StrRange), + Comma(StrRange), + Split(StrRange), + OpenParenthesis(StrRange), + CloseParenthesis(StrRange), + Key(StrRange), + DoubleQuoted(StrRange), + SingleQuoted(StrRange), + Equal(StrRange), + GreaterOrEqual(StrRange), + Greater(StrRange), + Little(StrRange), + LittleOrEqual(StrRange), + NotEqual(StrRange), + And(StrRange), + Or(StrRange), + Whitespace(StrRange), +} + +impl Token { + pub fn is_match_token_type(&self, other: Token) -> bool { + match self { + Token::Absolute(_) => matches!(other, Token::Absolute(_)), + Token::Dot(_) => matches!(other, Token::Dot(_)), + Token::At(_) => matches!(other, Token::At(_)), + Token::OpenArray(_) => matches!(other, Token::OpenArray(_)), + Token::CloseArray(_) => matches!(other, Token::CloseArray(_)), + Token::Asterisk(_) => matches!(other, Token::Asterisk(_)), + Token::Question(_) => matches!(other, Token::Question(_)), + Token::Comma(_) => matches!(other, Token::Comma(_)), + Token::Split(_) => matches!(other, Token::Split(_)), + Token::OpenParenthesis(_) => matches!(other, Token::OpenParenthesis(_)), + Token::CloseParenthesis(_) => matches!(other, Token::CloseParenthesis(_)), + Token::Key(_) => matches!(other, Token::Key(_)), + Token::DoubleQuoted(_) => matches!(other, Token::DoubleQuoted(_)), + Token::SingleQuoted(_) => matches!(other, Token::SingleQuoted(_)), + Token::Equal(_) => matches!(other, Token::Equal(_)), + Token::GreaterOrEqual(_) => matches!(other, Token::GreaterOrEqual(_)), + Token::Greater(_) => matches!(other, Token::Greater(_)), + Token::Little(_) => matches!(other, Token::Little(_)), + Token::LittleOrEqual(_) => matches!(other, Token::LittleOrEqual(_)), + Token::NotEqual(_) => matches!(other, Token::NotEqual(_)), + Token::And(_) => matches!(other, Token::And(_)), + Token::Or(_) => matches!(other, Token::Or(_)), + Token::Whitespace(_) => matches!(other, Token::Whitespace(_)), + } + } + + pub fn reset_span(&mut self, new_span: StrRange) -> Token { + match self { + Token::Absolute(_) => Token::Absolute(new_span), + Token::Dot(_) => Token::Dot(new_span), + Token::At(_) => Token::At(new_span), + Token::OpenArray(_) => Token::OpenArray(new_span), + Token::CloseArray(_) => Token::CloseArray(new_span), + Token::Asterisk(_) => Token::Asterisk(new_span), + Token::Question(_) => Token::Question(new_span), + Token::Comma(_) => Token::Comma(new_span), + Token::Split(_) => Token::Split(new_span), + Token::OpenParenthesis(_) => Token::OpenParenthesis(new_span), + Token::CloseParenthesis(_) => Token::CloseParenthesis(new_span), + Token::Key(_) => Token::Key(new_span), + Token::DoubleQuoted(_) => Token::DoubleQuoted(new_span), + Token::SingleQuoted(_) => Token::SingleQuoted(new_span), + Token::Equal(_) => Token::Equal(new_span), + Token::GreaterOrEqual(_) => Token::GreaterOrEqual(new_span), + Token::Greater(_) => Token::Greater(new_span), + Token::Little(_) => Token::Little(new_span), + Token::LittleOrEqual(_) => Token::LittleOrEqual(new_span), + Token::NotEqual(_) => Token::NotEqual(new_span), + Token::And(_) => Token::And(new_span), + Token::Or(_) => Token::Or(new_span), + Token::Whitespace(_) => Token::Whitespace(new_span), + } + } +} + +#[derive(Debug, PartialEq, Clone)] +pub enum ParseToken { + // '$' + Absolute, + // '@' + Relative, + // '.' + In, + // '..' + Leaves, + // '*' + All, + + Key(StrRange), + Keys(Vec), + // [] + Array, + // 메타토큰 + ArrayEof, + // ?( filter ) + Filter(FilterToken), + // 1 : 2 + Range(Option, Option, Option), + // 1, 2, 3 + Union(Vec), + + Number(f64), + + Bool(bool), + + Eof, +} + +#[derive(Debug, PartialEq, Clone)] +pub enum FilterToken { + Equal, + NotEqual, + Little, + LittleOrEqual, + Greater, + GreaterOrEqual, + And, + Or, +} \ No newline at end of file diff --git a/src/select/cmp.rs b/src/select/cmp.rs index f5f413ac..74834d34 100644 --- a/src/select/cmp.rs +++ b/src/select/cmp.rs @@ -205,160 +205,160 @@ impl Cmp for CmpOr { } -#[cfg(test)] -mod cmp_inner_tests { - use serde_json::Value; - - use select::cmp::*; - - #[test] - fn cmp_eq() { - let cmp_fn = CmpEq; - assert!(!cmp_fn.default()); - assert!(!cmp_fn.cmp_bool(true, false)); - assert!(cmp_fn.cmp_bool(true, true)); - assert!(cmp_fn.cmp_f64(0.1, 0.1)); - assert!(!cmp_fn.cmp_f64(0.1, 0.2)); - assert!(cmp_fn.cmp_string("1", "1")); - assert!(!cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_ne() { - let cmp_fn = CmpNe; - assert!(!cmp_fn.default()); - assert!(cmp_fn.cmp_bool(true, false)); - assert!(!cmp_fn.cmp_bool(true, true)); - assert!(!cmp_fn.cmp_f64(0.1, 0.1)); - assert!(cmp_fn.cmp_f64(0.1, 0.2)); - assert!(!cmp_fn.cmp_string("1", "1")); - assert!(cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_gt() { - let cmp_fn = CmpGt; - assert!(!cmp_fn.default()); - assert!(cmp_fn.cmp_bool(true, false)); - assert!(!cmp_fn.cmp_bool(true, true)); - assert!(cmp_fn.cmp_f64(0.2, 0.1)); - assert!(!cmp_fn.cmp_f64(0.1, 0.2)); - assert!(!cmp_fn.cmp_string("a", "a")); - assert!(cmp_fn.cmp_string("b", "a")); - assert!(!cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_ge() { - let cmp_fn = CmpGe; - assert!(!cmp_fn.default()); - assert!(cmp_fn.cmp_bool(true, false)); - assert!(cmp_fn.cmp_bool(true, true)); - assert!(cmp_fn.cmp_f64(0.2, 0.1)); - assert!(cmp_fn.cmp_f64(0.1, 0.1)); - assert!(!cmp_fn.cmp_f64(0.1, 0.2)); - assert!(cmp_fn.cmp_string("1", "1")); - assert!(cmp_fn.cmp_string("ab", "a")); - assert!(!cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_lt() { - let cmp_fn = CmpLt; - assert!(!cmp_fn.default()); - assert!(!cmp_fn.cmp_bool(true, false)); - assert!(cmp_fn.cmp_bool(false, true)); - assert!(!cmp_fn.cmp_bool(true, true)); - assert!(!cmp_fn.cmp_bool(false, false)); - assert!(cmp_fn.cmp_f64(0.1, 0.2)); - assert!(!cmp_fn.cmp_f64(0.1, 0.1)); - assert!(!cmp_fn.cmp_f64(0.2, 0.1)); - assert!(!cmp_fn.cmp_string("a", "a")); - assert!(cmp_fn.cmp_string("ab", "b")); - assert!(cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_le() { - let cmp_fn = CmpLe; - assert!(!cmp_fn.default()); - assert!(!cmp_fn.cmp_bool(true, false)); - assert!(cmp_fn.cmp_bool(false, true)); - assert!(cmp_fn.cmp_bool(true, true)); - assert!(cmp_fn.cmp_bool(false, false)); - assert!(cmp_fn.cmp_f64(0.1, 0.2)); - assert!(cmp_fn.cmp_f64(0.1, 0.1)); - assert!(!cmp_fn.cmp_f64(0.2, 0.1)); - assert!(cmp_fn.cmp_string("a", "a")); - assert!(cmp_fn.cmp_string("ab", "b")); - assert!(!cmp_fn.cmp_string("abd", "abc")); - assert!(cmp_fn.cmp_string("1", "2")); - } - - #[test] - fn cmp_and() { - let cmp_fn = CmpAnd; - assert!(!cmp_fn.default()); - assert!(!cmp_fn.cmp_bool(true, false)); - assert!(!cmp_fn.cmp_bool(false, true)); - assert!(cmp_fn.cmp_bool(true, true)); - assert!(!cmp_fn.cmp_bool(false, false)); - assert!(cmp_fn.cmp_f64(0.0, 0.0)); - assert!(cmp_fn.cmp_string("a", "a")); - } - - #[test] - fn cmp_or() { - let cmp_fn = CmpOr; - assert!(!cmp_fn.default()); - assert!(cmp_fn.cmp_bool(true, false)); - assert!(cmp_fn.cmp_bool(false, true)); - assert!(cmp_fn.cmp_bool(true, true)); - assert!(!cmp_fn.cmp_bool(false, false)); - assert!(cmp_fn.cmp_f64(0.0, 0.0)); - assert!(cmp_fn.cmp_string("a", "a")); - } - - #[test] - fn cmp_json() { - let v1 = Value::Bool(true); - let v2 = Value::String("1".to_string()); - let left = [&v1, &v2]; - let right = [&v1, &v2]; - let empty: Vec<&Value> = Vec::new(); - - assert_eq!(CmpEq.cmp_json(&left, &right), left.to_vec()); - assert_eq!(CmpNe.cmp_json(&left, &right), left.to_vec()); - assert_eq!(CmpGt.cmp_json(&left, &right), empty); - assert_eq!(CmpGe.cmp_json(&left, &right), empty); - assert_eq!(CmpLt.cmp_json(&left, &right), empty); - assert_eq!(CmpLe.cmp_json(&left, &right), empty); - assert_eq!(CmpAnd.cmp_json(&left, &right), left.to_vec()); - assert_eq!(CmpOr.cmp_json(&left, &right), left.to_vec()); - - assert_eq!( - CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), - vec![&Value::Bool(true)] - ); - assert_eq!( - CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), - empty - ); - assert_eq!( - CmpNe.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), - empty - ); - assert_eq!( - CmpNe.cmp_json(&[&Value::Bool(false)], &[&Value::Bool(true)]), - vec![&Value::Bool(false)] - ); - assert_eq!( - CmpAnd.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), - vec![&Value::Bool(true)] - ); - assert_eq!( - CmpOr.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), - vec![&Value::Bool(true), &Value::Bool(false)] - ); - } -} +// #[cfg(test)] +// mod cmp_inner_tests { +// use serde_json::Value; +// +// use select::cmp::*; +// +// #[test] +// fn cmp_eq() { +// let cmp_fn = CmpEq; +// assert!(!cmp_fn.default()); +// assert!(!cmp_fn.cmp_bool(true, false)); +// assert!(cmp_fn.cmp_bool(true, true)); +// assert!(cmp_fn.cmp_f64(0.1, 0.1)); +// assert!(!cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(cmp_fn.cmp_string("1", "1")); +// assert!(!cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_ne() { +// let cmp_fn = CmpNe; +// assert!(!cmp_fn.default()); +// assert!(cmp_fn.cmp_bool(true, false)); +// assert!(!cmp_fn.cmp_bool(true, true)); +// assert!(!cmp_fn.cmp_f64(0.1, 0.1)); +// assert!(cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(!cmp_fn.cmp_string("1", "1")); +// assert!(cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_gt() { +// let cmp_fn = CmpGt; +// assert!(!cmp_fn.default()); +// assert!(cmp_fn.cmp_bool(true, false)); +// assert!(!cmp_fn.cmp_bool(true, true)); +// assert!(cmp_fn.cmp_f64(0.2, 0.1)); +// assert!(!cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(!cmp_fn.cmp_string("a", "a")); +// assert!(cmp_fn.cmp_string("b", "a")); +// assert!(!cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_ge() { +// let cmp_fn = CmpGe; +// assert!(!cmp_fn.default()); +// assert!(cmp_fn.cmp_bool(true, false)); +// assert!(cmp_fn.cmp_bool(true, true)); +// assert!(cmp_fn.cmp_f64(0.2, 0.1)); +// assert!(cmp_fn.cmp_f64(0.1, 0.1)); +// assert!(!cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(cmp_fn.cmp_string("1", "1")); +// assert!(cmp_fn.cmp_string("ab", "a")); +// assert!(!cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_lt() { +// let cmp_fn = CmpLt; +// assert!(!cmp_fn.default()); +// assert!(!cmp_fn.cmp_bool(true, false)); +// assert!(cmp_fn.cmp_bool(false, true)); +// assert!(!cmp_fn.cmp_bool(true, true)); +// assert!(!cmp_fn.cmp_bool(false, false)); +// assert!(cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(!cmp_fn.cmp_f64(0.1, 0.1)); +// assert!(!cmp_fn.cmp_f64(0.2, 0.1)); +// assert!(!cmp_fn.cmp_string("a", "a")); +// assert!(cmp_fn.cmp_string("ab", "b")); +// assert!(cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_le() { +// let cmp_fn = CmpLe; +// assert!(!cmp_fn.default()); +// assert!(!cmp_fn.cmp_bool(true, false)); +// assert!(cmp_fn.cmp_bool(false, true)); +// assert!(cmp_fn.cmp_bool(true, true)); +// assert!(cmp_fn.cmp_bool(false, false)); +// assert!(cmp_fn.cmp_f64(0.1, 0.2)); +// assert!(cmp_fn.cmp_f64(0.1, 0.1)); +// assert!(!cmp_fn.cmp_f64(0.2, 0.1)); +// assert!(cmp_fn.cmp_string("a", "a")); +// assert!(cmp_fn.cmp_string("ab", "b")); +// assert!(!cmp_fn.cmp_string("abd", "abc")); +// assert!(cmp_fn.cmp_string("1", "2")); +// } +// +// #[test] +// fn cmp_and() { +// let cmp_fn = CmpAnd; +// assert!(!cmp_fn.default()); +// assert!(!cmp_fn.cmp_bool(true, false)); +// assert!(!cmp_fn.cmp_bool(false, true)); +// assert!(cmp_fn.cmp_bool(true, true)); +// assert!(!cmp_fn.cmp_bool(false, false)); +// assert!(cmp_fn.cmp_f64(0.0, 0.0)); +// assert!(cmp_fn.cmp_string("a", "a")); +// } +// +// #[test] +// fn cmp_or() { +// let cmp_fn = CmpOr; +// assert!(!cmp_fn.default()); +// assert!(cmp_fn.cmp_bool(true, false)); +// assert!(cmp_fn.cmp_bool(false, true)); +// assert!(cmp_fn.cmp_bool(true, true)); +// assert!(!cmp_fn.cmp_bool(false, false)); +// assert!(cmp_fn.cmp_f64(0.0, 0.0)); +// assert!(cmp_fn.cmp_string("a", "a")); +// } +// +// #[test] +// fn cmp_json() { +// let v1 = Value::Bool(true); +// let v2 = Value::String("1".to_string()); +// let left = [&v1, &v2]; +// let right = [&v1, &v2]; +// let empty: Vec<&Value> = Vec::new(); +// +// assert_eq!(CmpEq.cmp_json(&left, &right), left.to_vec()); +// assert_eq!(CmpNe.cmp_json(&left, &right), left.to_vec()); +// assert_eq!(CmpGt.cmp_json(&left, &right), empty); +// assert_eq!(CmpGe.cmp_json(&left, &right), empty); +// assert_eq!(CmpLt.cmp_json(&left, &right), empty); +// assert_eq!(CmpLe.cmp_json(&left, &right), empty); +// assert_eq!(CmpAnd.cmp_json(&left, &right), left.to_vec()); +// assert_eq!(CmpOr.cmp_json(&left, &right), left.to_vec()); +// +// assert_eq!( +// CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), +// vec![&Value::Bool(true)] +// ); +// assert_eq!( +// CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), +// empty +// ); +// assert_eq!( +// CmpNe.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), +// empty +// ); +// assert_eq!( +// CmpNe.cmp_json(&[&Value::Bool(false)], &[&Value::Bool(true)]), +// vec![&Value::Bool(false)] +// ); +// assert_eq!( +// CmpAnd.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), +// vec![&Value::Bool(true)] +// ); +// assert_eq!( +// CmpOr.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), +// vec![&Value::Bool(true), &Value::Bool(false)] +// ); +// } +// } diff --git a/src/select/expr_term.rs b/src/select/expr_term.rs index f777880a..60f47564 100644 --- a/src/select/expr_term.rs +++ b/src/select/expr_term.rs @@ -201,26 +201,26 @@ impl<'a> From<&Vec<&'a Value>> for ExprTerm<'a> { } } -#[cfg(test)] -mod expr_term_inner_tests { - use serde_json::{Number, Value}; - use select::expr_term::ExprTerm; - - #[test] - fn value_vec_into() { - let v = Value::Bool(true); - let vec = &vec![&v]; - let term: ExprTerm = vec.into(); - assert_eq!(term, ExprTerm::Bool(true)); - - let v = Value::String("a".to_string()); - let vec = &vec![&v]; - let term: ExprTerm = vec.into(); - assert_eq!(term, ExprTerm::String("a".to_string())); - - let v = serde_json::from_str("1.0").unwrap(); - let vec = &vec![&v]; - let term: ExprTerm = vec.into(); - assert_eq!(term, ExprTerm::Number(Number::from_f64(1.0).unwrap())); - } -} +// #[cfg(test)] +// mod expr_term_inner_tests { +// use serde_json::{Number, Value}; +// use select::expr_term::ExprTerm; +// +// #[test] +// fn value_vec_into() { +// let v = Value::Bool(true); +// let vec = &vec![&v]; +// let term: ExprTerm = vec.into(); +// assert_eq!(term, ExprTerm::Bool(true)); +// +// let v = Value::String("a".to_string()); +// let vec = &vec![&v]; +// let term: ExprTerm = vec.into(); +// assert_eq!(term, ExprTerm::String("a".to_string())); +// +// let v = serde_json::from_str("1.0").unwrap(); +// let vec = &vec![&v]; +// let term: ExprTerm = vec.into(); +// assert_eq!(term, ExprTerm::Number(Number::from_f64(1.0).unwrap())); +// } +// } diff --git a/src/select/mod.rs b/src/select/mod.rs index e0d62083..cf3ca875 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -327,6 +327,7 @@ impl<'a> FilterTerms<'a> { } } +#[deprecated(since = "0.4.0", note = "Please use `JsonSelector`")] #[derive(Debug, Default)] pub struct Selector<'a, 'b> { node: Option, @@ -776,6 +777,7 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { } } +#[deprecated(since = "0.4.0", note = "Please use `JsonSelectorMut`")] #[derive(Default)] pub struct SelectorMut { path: Option, @@ -966,40 +968,40 @@ impl SelectorMut { } -#[cfg(test)] -mod select_inner_tests { - use serde_json::Value; - - #[test] - fn to_f64_i64() { - let number = 0_i64; - let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); - if let Value::Number(n) = v { - assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); - } else { - panic!(); - } - } - - #[test] - fn to_f64_f64() { - let number = 0.1_f64; - let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); - if let Value::Number(n) = v { - assert!((super::to_f64(&n) - number).abs() == 0_f64); - } else { - panic!(); - } - } - - #[test] - fn to_f64_u64() { - let number = u64::max_value(); - let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); - if let Value::Number(n) = v { - assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); - } else { - panic!(); - } - } -} \ No newline at end of file +// #[cfg(test)] +// mod select_inner_tests { +// use serde_json::Value; +// +// #[test] +// fn to_f64_i64() { +// let number = 0_i64; +// let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); +// if let Value::Number(n) = v { +// assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); +// } else { +// panic!(); +// } +// } +// +// #[test] +// fn to_f64_f64() { +// let number = 0.1_f64; +// let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); +// if let Value::Number(n) = v { +// assert!((super::to_f64(&n) - number).abs() == 0_f64); +// } else { +// panic!(); +// } +// } +// +// #[test] +// fn to_f64_u64() { +// let number = u64::max_value(); +// let v: Value = serde_json::from_str(&format!("{}", number)).unwrap(); +// if let Value::Number(n) = v { +// assert!((super::to_f64(&n) - number as f64).abs() == 0_f64); +// } else { +// panic!(); +// } +// } +// } \ No newline at end of file diff --git a/src/selector/cmp.rs b/src/selector/cmp.rs new file mode 100644 index 00000000..1d2a5c17 --- /dev/null +++ b/src/selector/cmp.rs @@ -0,0 +1,364 @@ +use serde_json::Value; + +pub trait Cmp { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool; + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool; + + fn cmp_string(&self, v1: &str, v2: &str) -> bool; + + fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value>; + + fn default(&self) -> bool { + false + } +} + +pub struct CmpEq; + +impl Cmp for CmpEq { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 == v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + (v1 - v2).abs() == 0_f64 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 == v2 + } + + fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { + let mut ret = vec![]; + + for a in v1 { + for b in v2 { + if a == b { + ret.push(*a); + } + } + } + + ret + } +} + +pub struct CmpNe; + +impl Cmp for CmpNe { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 != v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + (v1 - v2).abs() != 0_f64 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 != v2 + } + + fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { + let mut ret = vec![]; + + for a in v1 { + for b in v2 { + if a != b { + ret.push(*a); + } + } + } + + ret + } +} + +pub struct CmpGt; + +impl Cmp for CmpGt { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 & !v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + v1 > v2 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 > v2 + } + + fn cmp_json<'a>(&self, _: &[&'a Value], _: &[&'a Value]) -> Vec<&'a Value> { + Vec::new() + } +} + +pub struct CmpGe; + +impl Cmp for CmpGe { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 >= v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + v1 >= v2 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 >= v2 + } + + fn cmp_json<'a>(&self, _: &[&'a Value], _: &[&'a Value]) -> Vec<&'a Value> { + Vec::new() + } +} + +pub struct CmpLt; + +impl Cmp for CmpLt { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + !v1 & v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + v1 < v2 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 < v2 + } + + fn cmp_json<'a>(&self, _: &[&'a Value], _: &[&'a Value]) -> Vec<&'a Value> { + Vec::new() + } +} + +pub struct CmpLe; + +impl Cmp for CmpLe { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 <= v2 + } + + fn cmp_f64(&self, v1: f64, v2: f64) -> bool { + v1 <= v2 + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + v1 <= v2 + } + + fn cmp_json<'a>(&self, _: &[&'a Value], _: &[&'a Value]) -> Vec<&'a Value> { + Vec::new() + } +} + +pub struct CmpAnd; + +impl Cmp for CmpAnd { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 && v2 + } + + fn cmp_f64(&self, _v1: f64, _v2: f64) -> bool { + true + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + !v1.is_empty() && !v2.is_empty() + } + + fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { + CmpEq.cmp_json(v1, v2) + } +} + +pub struct CmpOr; + +impl Cmp for CmpOr { + fn cmp_bool(&self, v1: bool, v2: bool) -> bool { + v1 || v2 + } + + fn cmp_f64(&self, _v1: f64, _v2: f64) -> bool { + true + } + + fn cmp_string(&self, v1: &str, v2: &str) -> bool { + !v1.is_empty() || !v2.is_empty() + } + + fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { + let mut ret = [v1, v2].concat(); + + for x in (0..ret.len()).rev() { + for y in (x + 1..ret.len()).rev() { + if ret[x] == ret[y] { + ret.remove(y); + } + } + } + + ret + } +} + + +#[cfg(test)] +mod cmp_inner_tests { + use serde_json::Value; + + use selector::cmp::*; + + #[test] + fn cmp_eq() { + let cmp_fn = CmpEq; + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_string("1", "1")); + assert!(!cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_ne() { + let cmp_fn = CmpNe; + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_f64(0.1, 0.1)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_string("1", "1")); + assert!(cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_gt() { + let cmp_fn = CmpGt; + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.2, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("b", "a")); + assert!(!cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_ge() { + let cmp_fn = CmpGe; + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_f64(0.2, 0.1)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_string("1", "1")); + assert!(cmp_fn.cmp_string("ab", "a")); + assert!(!cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_lt() { + let cmp_fn = CmpLt; + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(!cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(!cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.2, 0.1)); + assert!(!cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("ab", "b")); + assert!(cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_le() { + let cmp_fn = CmpLe; + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.1, 0.2)); + assert!(cmp_fn.cmp_f64(0.1, 0.1)); + assert!(!cmp_fn.cmp_f64(0.2, 0.1)); + assert!(cmp_fn.cmp_string("a", "a")); + assert!(cmp_fn.cmp_string("ab", "b")); + assert!(!cmp_fn.cmp_string("abd", "abc")); + assert!(cmp_fn.cmp_string("1", "2")); + } + + #[test] + fn cmp_and() { + let cmp_fn = CmpAnd; + assert!(!cmp_fn.default()); + assert!(!cmp_fn.cmp_bool(true, false)); + assert!(!cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.0, 0.0)); + assert!(cmp_fn.cmp_string("a", "a")); + } + + #[test] + fn cmp_or() { + let cmp_fn = CmpOr; + assert!(!cmp_fn.default()); + assert!(cmp_fn.cmp_bool(true, false)); + assert!(cmp_fn.cmp_bool(false, true)); + assert!(cmp_fn.cmp_bool(true, true)); + assert!(!cmp_fn.cmp_bool(false, false)); + assert!(cmp_fn.cmp_f64(0.0, 0.0)); + assert!(cmp_fn.cmp_string("a", "a")); + } + + #[test] + fn cmp_json() { + let v1 = Value::Bool(true); + let v2 = Value::String("1".to_string()); + let left = [&v1, &v2]; + let right = [&v1, &v2]; + let empty: Vec<&Value> = Vec::new(); + + assert_eq!(CmpEq.cmp_json(&left, &right), left.to_vec()); + assert_eq!(CmpNe.cmp_json(&left, &right), left.to_vec()); + assert_eq!(CmpGt.cmp_json(&left, &right), empty); + assert_eq!(CmpGe.cmp_json(&left, &right), empty); + assert_eq!(CmpLt.cmp_json(&left, &right), empty); + assert_eq!(CmpLe.cmp_json(&left, &right), empty); + assert_eq!(CmpAnd.cmp_json(&left, &right), left.to_vec()); + assert_eq!(CmpOr.cmp_json(&left, &right), left.to_vec()); + + assert_eq!( + CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), + vec![&Value::Bool(true)] + ); + assert_eq!( + CmpEq.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), + empty + ); + assert_eq!( + CmpNe.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), + empty + ); + assert_eq!( + CmpNe.cmp_json(&[&Value::Bool(false)], &[&Value::Bool(true)]), + vec![&Value::Bool(false)] + ); + assert_eq!( + CmpAnd.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(true)]), + vec![&Value::Bool(true)] + ); + assert_eq!( + CmpOr.cmp_json(&[&Value::Bool(true)], &[&Value::Bool(false)]), + vec![&Value::Bool(true), &Value::Bool(false)] + ); + } +} diff --git a/src/selector/mod.rs b/src/selector/mod.rs new file mode 100644 index 00000000..a188668c --- /dev/null +++ b/src/selector/mod.rs @@ -0,0 +1,7 @@ +pub use self::selector_impl::{JsonSelector, JsonSelectorMut}; + +mod cmp; +mod terms; +mod selector_impl; +mod value_walker; +mod utils; \ No newline at end of file diff --git a/src/selector/selector_impl.rs b/src/selector/selector_impl.rs new file mode 100644 index 00000000..baf6e851 --- /dev/null +++ b/src/selector/selector_impl.rs @@ -0,0 +1,671 @@ +use std::collections::HashSet; +use std::rc::Rc; + +use serde_json::{Number, Value}; +use serde_json::map::Entry; + +use JsonPathError; +use paths::{ParseTokenHandler, PathParser, StrRange, tokens::*}; +use super::utils; + +use super::terms::*; + +#[derive(Debug, Default)] +pub struct JsonSelector<'a> { + parser: Option>>>, + value: Option<&'a Value>, + tokens: Vec, + current: Option>, + selectors: Vec>, + selector_filter: FilterTerms<'a>, +} + +impl<'a> JsonSelector<'a> { + pub fn new(parser: PathParser<'a>) -> Self { + JsonSelector { + parser: Some(Rc::new(Box::new(parser))), + value: None, + tokens: Vec::new(), + current: None, + selectors: Vec::new(), + selector_filter: FilterTerms(Vec::new()), + } + } + + pub fn new_ref(parser: Rc>>) -> Self { + JsonSelector { + parser: Some(parser), + value: None, + tokens: Vec::new(), + current: None, + selectors: Vec::new(), + selector_filter: FilterTerms(Vec::new()), + } + } + + pub fn reset_parser(&mut self, parser: PathParser<'a>) -> &mut Self { + self.parser = Some(Rc::new(Box::new(parser))); + self + } + + pub fn reset_parser_ref(&mut self, parser: Rc>>) -> &mut Self { + self.parser = Some(parser); + self + } + + pub fn reset_value(&mut self) -> &mut Self { + self.current = None; + self + } + + pub fn value(&mut self, v: &'a Value) -> &mut Self { + self.value = Some(v); + self + } + + fn _select(&mut self) -> Result<(), JsonPathError> { + let parser = self.parser.take(); + if let Some(parser) = parser.as_ref() { + let _ = parser.parse(self); + } + self.parser = parser; + + Ok(()) + } + + pub fn select_as(&mut self) -> Result, JsonPathError> { + self._select()?; + + match &self.current { + Some(vec) => { + let mut ret = Vec::new(); + for v in vec { + match T::deserialize(*v) { + Ok(v) => ret.push(v), + Err(e) => return Err(JsonPathError::Serde(e.to_string())), + } + } + Ok(ret) + } + _ => Err(JsonPathError::EmptyValue), + } + } + + pub fn select_as_str(&mut self) -> Result { + self._select()?; + + match &self.current { + Some(r) => { + Ok(serde_json::to_string(r).map_err(|e| JsonPathError::Serde(e.to_string()))?) + } + _ => Err(JsonPathError::EmptyValue), + } + } + + pub fn select(&mut self) -> Result, JsonPathError> { + self._select()?; + + match &self.current { + Some(r) => Ok(r.to_vec()), + _ => Err(JsonPathError::EmptyValue), + } + } + + fn compute_absolute_path_filter(&mut self, token: &ParseToken, parse_value_reader: &F) -> bool + where + F: Fn(&StrRange) -> &'a str + { + if !self.selectors.is_empty() { + match token { + ParseToken::Absolute | ParseToken::Relative | ParseToken::Filter(_) => { + let selector = self.selectors.pop().unwrap(); + + if let Some(current) = &selector.current { + let term = current.into(); + + if let Some(s) = self.selectors.last_mut() { + s.selector_filter.push_term(Some(term)); + } else { + self.selector_filter.push_term(Some(term)); + } + } else { + unreachable!() + } + } + _ => {} + } + } + + if self.selectors.is_empty() { + return false; + } + + self.selectors.last_mut().unwrap().handle(token, parse_value_reader); + true + } +} + +impl<'a> JsonSelector<'a> { + fn visit_absolute(&mut self) { + if self.current.is_some() { + if let Some(value) = self.value { + let selector = JsonSelector { + parser: None, + value: Some(value), + tokens: Vec::new(), + current: Some(vec![value]), + selectors: Vec::new(), + selector_filter: FilterTerms(Vec::new()), + }; + self.selectors.push(selector); + } + return; + } + + if let Some(v) = &self.value { + self.current = Some(vec![v]); + } + } + + fn visit_relative(&mut self) { + if let Some(ParseToken::Array) = self.tokens.last() { + let array_token = self.tokens.pop(); + if let Some(ParseToken::Leaves) = self.tokens.last() { + self.tokens.pop(); + self.current = self.selector_filter.collect_all(self.current.take()); + } + self.tokens.push(array_token.unwrap()); + } + self.selector_filter.new_filter_context(); + } + + fn visit_array_eof(&mut self) { + if self.is_last_before_token_match(ParseToken::Array) { + if let Some(Some(e)) = self.selector_filter.pop_term() { + if let ExprTerm::String(key) = e { + self.current = self.selector_filter.filter_next_with_str(self.current.take(), key); + self.tokens.pop(); + return; + } + + self.selector_filter.push_term(Some(e)); + } + } + + if self.is_last_before_token_match(ParseToken::Leaves) { + self.tokens.pop(); + self.tokens.pop(); + if let Some(Some(e)) = self.selector_filter.pop_term() { + let selector_filter_consumed = match e { + ExprTerm::Number(n) => { + self.current = self.selector_filter.collect_all_with_num(self.current.take(), utils::to_f64(&n)); + self.selector_filter.pop_term(); + true + } + ExprTerm::String(key) => { + self.current = self.selector_filter.collect_all_with_str(self.current.take(), key); + self.selector_filter.pop_term(); + true + } + _ => { + self.selector_filter.push_term(Some(e)); + false + } + }; + + if selector_filter_consumed { + return; + } + } + } + + if let Some(Some(e)) = self.selector_filter.pop_term() { + match e { + ExprTerm::Number(n) => { + self.current = self.selector_filter.collect_next_with_num(self.current.take(), utils::to_f64(&n)); + } + ExprTerm::String(key) => { + self.current = self.selector_filter.collect_next_with_str(self.current.take(), &[key]); + } + ExprTerm::Json(rel, _, v) => { + if v.is_empty() { + self.current = Some(vec![]); + } else if let Some(vec) = rel { + self.current = Some(vec); + } else { + self.current = Some(v); + } + } + ExprTerm::Bool(false) => { + self.current = Some(vec![]); + } + _ => {} + } + } + + self.tokens.pop(); + } + + fn is_last_before_token_match(&mut self, token: ParseToken) -> bool { + if self.tokens.len() > 1 { + return token == self.tokens[self.tokens.len() - 2]; + } + + false + } + + fn visit_all(&mut self) { + if let Some(ParseToken::Array) = self.tokens.last() { + self.tokens.pop(); + } + + match self.tokens.last() { + Some(ParseToken::Leaves) => { + self.tokens.pop(); + self.current = self.selector_filter.collect_all(self.current.take()); + } + Some(ParseToken::In) => { + self.tokens.pop(); + self.current = self.selector_filter.collect_next_all(self.current.take()); + } + _ => { + self.current = self.selector_filter.collect_next_all(self.current.take()); + } + } + } + + fn visit_key(&mut self, key: &'a str) { + if let Some(ParseToken::Array) = self.tokens.last() { + self.selector_filter.push_term(Some(ExprTerm::String(key))); + return; + } + + if let Some(t) = self.tokens.pop() { + if self.selector_filter.is_term_empty() { + match t { + ParseToken::Leaves => { + self.current = self.selector_filter.collect_all_with_str(self.current.take(), &key) + } + ParseToken::In => { + self.current = self.selector_filter.collect_next_with_str(self.current.take(), &[&key]) + } + _ => {} + } + } else { + match t { + ParseToken::Leaves => { + self.current = self.selector_filter.filter_all_with_str(self.current.take(), &key); + } + ParseToken::In => { + self.current = self.selector_filter.filter_next_with_str(self.current.take(), &key); + } + _ => {} + } + } + } + } + + fn visit_keys(&mut self, keys: &[&'a str]) { + if !self.selector_filter.is_term_empty() { + unimplemented!("keys in filter"); + } + + if let Some(ParseToken::Array) = self.tokens.pop() { + self.current = self.selector_filter.collect_next_with_str(self.current.take(), keys); + } else { + unreachable!(); + } + } + + fn visit_filter(&mut self, ft: &FilterToken) { + let right = match self.selector_filter.pop_term() { + Some(Some(right)) => right, + Some(None) => ExprTerm::Json( + None, + None, + match &self.current { + Some(current) => current.to_vec(), + _ => unreachable!(), + }, + ), + _ => panic!("empty term right"), + }; + + let left = match self.selector_filter.pop_term() { + Some(Some(left)) => left, + Some(None) => ExprTerm::Json( + None, + None, + match &self.current { + Some(current) => current.to_vec(), + _ => unreachable!(), + }, + ), + _ => panic!("empty term left"), + }; + + let mut ret = None; + match ft { + FilterToken::Equal => left.eq(&right, &mut ret), + FilterToken::NotEqual => left.ne(&right, &mut ret), + FilterToken::Greater => left.gt(&right, &mut ret), + FilterToken::GreaterOrEqual => left.ge(&right, &mut ret), + FilterToken::Little => left.lt(&right, &mut ret), + FilterToken::LittleOrEqual => left.le(&right, &mut ret), + FilterToken::And => left.and(&right, &mut ret), + FilterToken::Or => left.or(&right, &mut ret), + }; + + if let Some(e) = ret { + self.selector_filter.push_term(Some(e)); + } + } + + fn visit_range(&mut self, from: &Option, to: &Option, step: &Option) { + if !self.selector_filter.is_term_empty() { + unimplemented!("range syntax in filter"); + } + + if let Some(ParseToken::Array) = self.tokens.pop() { + let mut tmp = Vec::new(); + if let Some(current) = &self.current { + for v in current { + if let Value::Array(vec) = v { + let from = if let Some(from) = from { + utils::abs_index(*from, vec.len()) + } else { + 0 + }; + + let to = if let Some(to) = to { + utils::abs_index(*to, vec.len()) + } else { + vec.len() + }; + + for i in (from..to).step_by(match step { + Some(step) => *step, + _ => 1, + }) { + if let Some(v) = vec.get(i) { + tmp.push(v); + } + } + } + } + } + self.current = Some(tmp); + } else { + unreachable!(); + } + } + + fn visit_union(&mut self, indices: &[isize]) { + if !self.selector_filter.is_term_empty() { + unimplemented!("union syntax in filter"); + } + + if let Some(ParseToken::Array) = self.tokens.pop() { + let mut tmp = Vec::new(); + if let Some(current) = &self.current { + for v in current { + if let Value::Array(vec) = v { + for i in indices { + if let Some(v) = vec.get(utils::abs_index(*i, vec.len())) { + tmp.push(v); + } + } + } + } + } + + self.current = Some(tmp); + } else { + unreachable!(); + } + } +} + +impl<'a> ParseTokenHandler<'a> for JsonSelector<'a> { + fn handle(&mut self, token: &ParseToken, parse_value_reader: &F) + where + F: Fn(&StrRange) -> &'a str + { + debug!("token: {:?}, stack: {:?}", token, self.tokens); + + if self.compute_absolute_path_filter(&token, parse_value_reader) { + return; + } + + match token { + ParseToken::Absolute => self.visit_absolute(), + ParseToken::Relative => self.visit_relative(), + ParseToken::In | ParseToken::Leaves | ParseToken::Array => { + self.tokens.push(token.clone()); + } + ParseToken::ArrayEof => self.visit_array_eof(), + ParseToken::All => self.visit_all(), + ParseToken::Bool(b) => { + self.selector_filter.push_term(Some(ExprTerm::Bool(*b))); + } + ParseToken::Key(s) => { + let key = parse_value_reader(s); + self.visit_key(key); + } + ParseToken::Keys(keys) => { + let keys: Vec<&str> = keys.iter().map(|s| { parse_value_reader(s) }).collect(); + self.visit_keys(&keys) + } + ParseToken::Number(v) => { + self.selector_filter.push_term(Some(ExprTerm::Number(Number::from_f64(*v).unwrap()))); + } + ParseToken::Filter(ref ft) => self.visit_filter(ft), + ParseToken::Range(from, to, step) => self.visit_range(from, to, step), + ParseToken::Union(indices) => self.visit_union(indices), + ParseToken::Eof => { + debug!("visit_token eof"); + } + } + } +} + +#[derive(Default)] +pub struct JsonSelectorMut<'a> { + value: Option, + parser: Option>>>, +} + +impl<'a> JsonSelectorMut<'a> { + pub fn new(parser: PathParser<'a>) -> Self { + Self::new_ref(Rc::new(Box::new(parser))) + } + + pub fn new_ref(parser: Rc>>) -> Self { + JsonSelectorMut { + value: None, + parser: Some(parser), + } + } + + pub fn reset_parser(&mut self, parser: PathParser<'a>) -> &mut Self { + self.parser = Some(Rc::new(Box::new(parser))); + self + } + + pub fn reset_parser_ref(&mut self, parser: Rc>>) -> &mut Self { + self.parser = Some(parser); + self + } + + pub fn value(&mut self, value: Value) -> &mut Self { + self.value = Some(value); + self + } + + pub fn take(&mut self) -> Option { + self.value.take() + } + + pub fn delete(&mut self) -> Result<&mut Self, JsonPathError> { + self.replace_with(&mut |_| Some(Value::Null)) + } + + pub fn remove(&mut self) -> Result<&mut Self, JsonPathError> { + self.replace_with(&mut |_| None) + } + + fn select(&self) -> Result, JsonPathError> { + let mut selector = JsonSelector::default(); + + if let Some(parser) = self.parser.as_ref() { + selector.reset_parser_ref(Rc::clone(parser)); + } else { + return Err(JsonPathError::EmptyPath); + } + + if let Some(value) = self.value.as_ref() { + selector.value(value); + } else { + return Err(JsonPathError::EmptyValue); + } + + selector.select() + } + + pub fn replace_with(&mut self, fun: &mut F) -> Result<&mut Self, JsonPathError> + where + F: FnMut(Value) -> Option, + { + let result = self.select()?; + let paths = self.compute_paths(result); + + if let Some(ref mut value) = &mut self.value { + for tokens in paths { + Self::replace_value(tokens, value, fun); + } + } + + Ok(self) + } + + fn replace_value(mut tokens: Vec, value: &mut Value, fun: &mut F) + where + F: FnMut(Value) -> Option + { + let mut target = value; + + let last_index = tokens.len().saturating_sub(1); + for (i, token) in tokens.drain(..).enumerate() { + let target_once = target; + let is_last = i == last_index; + let target_opt = match *target_once { + Value::Object(ref mut map) => { + if is_last { + if let Entry::Occupied(mut e) = map.entry(token) { + let v = e.insert(Value::Null); + if let Some(res) = fun(v) { + e.insert(res); + } else { + e.remove(); + } + } + return; + } + map.get_mut(&token) + } + Value::Array(ref mut vec) => { + if let Ok(x) = token.parse::() { + if is_last { + if x < vec.len() { + let v = std::mem::replace(&mut vec[x], Value::Null); + if let Some(res) = fun(v) { + vec[x] = res; + } else { + vec.remove(x); + } + } + return; + } + vec.get_mut(x) + } else { + None + } + } + _ => None, + }; + + if let Some(t) = target_opt { + target = t; + } else { + break; + } + } + } + + fn compute_paths(&self, mut result: Vec<&Value>) -> Vec> { + let mut visited = HashSet::new(); + let mut visited_order = Vec::new(); + + if let Some(origin) = &self.value { + let mut tokens = Vec::new(); + Self::walk( + origin, + &mut result, + &mut tokens, + &mut visited, + &mut visited_order, + ); + } + + visited_order + } + + fn walk( + origin: &Value, + target: &mut Vec<&Value>, + tokens: &mut Vec, + visited: &mut HashSet<*const Value>, + visited_order: &mut Vec>, + ) -> bool { + trace!("{:?}, {:?}", target, tokens); + + if target.is_empty() { + return true; + } + + target.retain(|t| { + if std::ptr::eq(origin, *t) { + if visited.insert(*t) { + visited_order.push(tokens.to_vec()); + } + false + } else { + true + } + }); + + match origin { + Value::Array(vec) => { + for (i, v) in vec.iter().enumerate() { + tokens.push(i.to_string()); + if Self::walk(v, target, tokens, visited, visited_order) { + return true; + } + tokens.pop(); + } + } + Value::Object(map) => { + for (k, v) in map { + tokens.push(k.clone()); + if Self::walk(v, target, tokens, visited, visited_order) { + return true; + } + tokens.pop(); + } + } + _ => {} + } + + false + } +} \ No newline at end of file diff --git a/src/selector/terms.rs b/src/selector/terms.rs new file mode 100644 index 00000000..8711c3aa --- /dev/null +++ b/src/selector/terms.rs @@ -0,0 +1,493 @@ +use std::collections::HashSet; + +use serde_json::{Number, Value}; + +use super::value_walker::ValueWalker; +use super::utils; + +use super::cmp::*; + +#[derive(Debug, PartialEq)] +pub enum ExprTerm<'a> { + String(&'a str), + Number(Number), + Bool(bool), + Json(Option>, Option>, Vec<&'a Value>), +} + +impl<'a> ExprTerm<'a> { + fn cmp( + &self, + other: &Self, + cmp_fn: &C1, + reverse_cmp_fn: &C2, + ) -> ExprTerm<'a> { + match &self { + ExprTerm::String(s1) => match &other { + ExprTerm::String(s2) => { + let (s1, opt1) = utils::to_path_str(s1); + let (s2, opt2) = utils::to_path_str(s2); + let k1 = if let Some(opt) = opt1.as_ref() { opt } else { s1 }; + let k2 = if let Some(opt) = opt2.as_ref() { opt } else { s2 }; + + ExprTerm::Bool(cmp_fn.cmp_string(k1, k2)) + } + ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + }, + ExprTerm::Number(n1) => match &other { + ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), + ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + }, + ExprTerm::Bool(b1) => match &other { + ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), + ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + }, + ExprTerm::Json(rel, fk1, vec1) => { + let ret: Vec<&Value> = match &other { + ExprTerm::String(s2) => { + let (s2, opt2) = utils::to_path_str(s2); + vec1 + .iter() + .filter(|v1| match v1 { + Value::String(s1) => { + if let Some(opt) = opt2.as_ref() { + cmp_fn.cmp_string(s1, opt) + } else { + cmp_fn.cmp_string(s1, s2) + } + } + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::String(s1)) = map1.get(*k) { + return if let Some(opt) = opt2.as_ref() { + cmp_fn.cmp_string(s1, opt) + } else { + cmp_fn.cmp_string(s1, s2) + }; + } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }) + .cloned() + .collect() + } + ExprTerm::Number(n2) => vec1 + .iter() + .filter(|v1| match v1 { + Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)), + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::Number(n1)) = map1.get(*k) { + return cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)); + } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }) + .cloned() + .collect(), + ExprTerm::Bool(b2) => vec1 + .iter() + .filter(|v1| match v1 { + Value::Bool(b1) => cmp_fn.cmp_bool(*b1, *b2), + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::Bool(b1)) = map1.get(*k) { + return cmp_fn.cmp_bool(*b1, *b2); + } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }) + .cloned() + .collect(), + ExprTerm::Json(parent, _, vec2) => { + if let Some(vec1) = rel { + cmp_fn.cmp_json(vec1, vec2) + } else if let Some(vec2) = parent { + cmp_fn.cmp_json(vec1, vec2) + } else { + cmp_fn.cmp_json(vec1, vec2) + } + } + }; + + if ret.is_empty() { + ExprTerm::Bool(cmp_fn.default()) + } else if let Some(rel) = rel { + if let ExprTerm::Json(_, _, _) = &other { + ExprTerm::Json(Some(rel.to_vec()), None, ret) + } else { + let mut tmp = Vec::new(); + for rel_value in rel { + if let Value::Object(map) = rel_value { + for map_value in map.values() { + for result_value in &ret { + if map_value.eq(*result_value) { + tmp.push(*rel_value); + } + } + } + } + } + ExprTerm::Json(Some(tmp), None, ret) + } + } else { + ExprTerm::Json(None, None, ret) + } + } + } + } + + pub fn eq(&self, other: &Self, ret: &mut Option>) { + debug!("eq - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpEq, &CmpEq); + debug!("eq = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn ne(&self, other: &Self, ret: &mut Option>) { + debug!("ne - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpNe, &CmpNe); + debug!("ne = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn gt(&self, other: &Self, ret: &mut Option>) { + debug!("gt - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpGt, &CmpLt); + debug!("gt = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn ge(&self, other: &Self, ret: &mut Option>) { + debug!("ge - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpGe, &CmpLe); + debug!("ge = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn lt(&self, other: &Self, ret: &mut Option>) { + debug!("lt - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpLt, &CmpGt); + debug!("lt = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn le(&self, other: &Self, ret: &mut Option>) { + debug!("le - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpLe, &CmpGe); + debug!("le = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn and(&self, other: &Self, ret: &mut Option>) { + debug!("and - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpAnd, &CmpAnd); + debug!("and = {:?}", tmp); + *ret = Some(tmp); + } + + pub fn or(&self, other: &Self, ret: &mut Option>) { + debug!("or - {:?} : {:?}", &self, &other); + let _ = ret.take(); + let tmp = self.cmp(other, &CmpOr, &CmpOr); + debug!("or = {:?}", tmp); + *ret = Some(tmp); + } +} + +impl<'a> From<&Vec<&'a Value>> for ExprTerm<'a> { + fn from(vec: &Vec<&'a Value>) -> Self { + if vec.len() == 1 { + match &vec[0] { + Value::Number(v) => return ExprTerm::Number(v.clone()), + Value::String(v) => return ExprTerm::String(v.as_str()), + Value::Bool(v) => return ExprTerm::Bool(*v), + _ => {} + } + } + + ExprTerm::Json(None, None, vec.to_vec()) + } +} + +#[derive(Debug, PartialEq)] +pub enum FilterKey<'a> { + String(&'a str), + All, +} + +#[derive(Debug, Default)] +pub struct FilterTerms<'a>(pub Vec>>); + +impl<'a> FilterTerms<'a> { + pub fn new_filter_context(&mut self) { + self.0.push(None); + debug!("new_filter_context: {:?}", self.0); + } + + pub fn is_term_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn push_term(&mut self, term: Option>) { + self.0.push(term); + } + + #[allow(clippy::option_option)] + pub fn pop_term(&mut self) -> Option>> { + self.0.pop() + } + + pub fn filter_json_term(&mut self, e: ExprTerm<'a>, fun: F) + where + F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + { + debug!("filter_json_term: {:?}", e); + + if let ExprTerm::Json(rel, fk, vec) = e { + let mut not_matched = Some(HashSet::new()); + let (filter_key, collected) = if let Some(FilterKey::String(key)) = fk { + let tmp = vec.iter().map(|v| match v { + Value::Object(map) if map.contains_key(key) => map.get(key).unwrap(), + _ => v + }).collect(); + fun(tmp, &mut not_matched) + } else { + fun(vec.to_vec(), &mut not_matched) + }; + + if rel.is_some() { + self.push_term(Some(ExprTerm::Json(rel, Some(filter_key), collected))); + } else { + let not_matched = not_matched.unwrap(); + let filtered = vec.iter().enumerate() + .filter(|(idx, _)| !not_matched.contains(&idx)) + .map(|(_, v)| *v).collect(); + self.push_term(Some(ExprTerm::Json(Some(filtered), Some(filter_key), collected))); + } + } else { + unreachable!("unexpected: ExprTerm: {:?}", e); + } + } + + pub fn push_json_term(&mut self, current: Option>, fun: F) -> Option> + where + F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + { + debug!("push_json_term: {:?}", ¤t); + + if let Some(current) = ¤t { + let (filter_key, collected) = fun(current.to_vec(), &mut None); + self.push_term(Some(ExprTerm::Json(None, Some(filter_key), collected))); + } + + current + } + + pub fn filter(&mut self, current: Option>, fun: F) -> Option> + where + F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + { + let peek = self.pop_term(); + + if let Some(None) = peek { + return self.push_json_term(current, fun); + } + + if let Some(Some(e)) = peek { + self.filter_json_term(e, fun); + } + + current + } + + pub fn filter_all_with_str(&mut self, current: Option>, key: &'a str) -> Option> { + let current = self.filter(current, |vec, _| { + (FilterKey::All, ValueWalker::all_with_str(vec, key, true)) + }); + + debug!("filter_all_with_str : {}, {:?}", key, self.0); + current + } + + pub fn filter_next_with_str(&mut self, current: Option>, key: &'a str) -> Option> { + let current = self.filter(current, |vec, not_matched| { + let mut visited = HashSet::new(); + let mut acc = Vec::new(); + let (key, opt) = utils::to_path_str(key); + let k = if let Some(opt) = opt.as_ref() { opt } else { key }; + vec.iter().enumerate().for_each(|(idx, v)| { + match v { + Value::Object(map) => { + if map.contains_key(k) { + let ptr = *v as *const Value; + if !visited.contains(&ptr) { + visited.insert(ptr); + acc.push(*v) + } + } else { + if let Some(set) = not_matched { set.insert(idx); } + } + } + Value::Array(ay) => { + if let Some(set) = not_matched { set.insert(idx); } + for v in ay { + ValueWalker::walk_dedup(v, &mut acc, k, &mut visited); + } + } + _ => { + if let Some(set) = not_matched { set.insert(idx); } + } + } + }); + + (FilterKey::String(key), acc) + }); + + debug!("filter_next_with_str : {}, {:?}", key, self.0); + current + } + + pub fn collect_next_with_num(&mut self, current: Option>, index: f64) -> Option> { + if current.is_none() { + debug!("collect_next_with_num : {:?}, {:?}", &index, ¤t); + return current; + } + + let mut acc = Vec::new(); + current.unwrap().iter().for_each(|v| { + match v { + Value::Object(map) => { + for k in map.keys() { + if let Some(Value::Array(vec)) = map.get(k) { + if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { + acc.push(v); + } + } + } + } + Value::Array(vec) => { + if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { + acc.push(v); + } + } + _ => {} + } + }); + + if acc.is_empty() { + self.pop_term(); + } + + Some(acc) + } + + pub fn collect_next_all(&mut self, current: Option>) -> Option> { + if current.is_none() { + debug!("collect_next_all : {:?}", ¤t); + return current; + } + + let mut acc = Vec::new(); + current.unwrap().iter().for_each(|v| { + match v { + Value::Object(map) => acc.extend(map.values()), + Value::Array(vec) => acc.extend(vec), + _ => {} + } + }); + + Some(acc) + } + + pub fn collect_next_with_str(&mut self, current: Option>, keys: &[&'a str]) -> Option> { + if current.is_none() { + debug!( + "collect_next_with_str : {:?}, {:?}", + keys, ¤t + ); + return current; + } + + trace!("#1. {:?}", keys); + let acc = ValueWalker::all_with_strs(current.unwrap(), keys); + + if acc.is_empty() { + self.pop_term(); + } + + Some(acc) + } + + pub fn collect_all(&mut self, current: Option>) -> Option> { + if current.is_none() { + debug!("collect_all: {:?}", ¤t); + return current; + } + + Some(ValueWalker::all(current.unwrap())) + } + + pub fn collect_all_with_str(&mut self, current: Option>, key: &'a str) -> Option> { + if current.is_none() { + debug!("collect_all_with_str: {}, {:?}", key, ¤t); + return current; + } + + let ret = ValueWalker::all_with_str(current.unwrap(), key, false); + Some(ret) + } + + pub fn collect_all_with_num(&mut self, mut current: Option>, index: f64) -> Option> { + if let Some(current) = current.take() { + let ret = ValueWalker::all_with_num(current, index); + if !ret.is_empty() { + return Some(ret); + } + } + + debug!("collect_all_with_num: {}, {:?}", index, ¤t); + None + } +} + +#[cfg(test)] +mod expr_term_inner_tests { + use serde_json::{Number, Value}; + + use selector::terms::ExprTerm; + + #[test] + fn value_vec_into() { + let v = Value::Bool(true); + let vec = &vec![&v]; + let term: ExprTerm = vec.into(); + assert_eq!(term, ExprTerm::Bool(true)); + + let v = Value::String("a".to_string()); + let vec = &vec![&v]; + let term: ExprTerm = vec.into(); + assert_eq!(term, ExprTerm::String("a")); + + let v = serde_json::from_str("1.0").unwrap(); + let vec = &vec![&v]; + let term: ExprTerm = vec.into(); + assert_eq!(term, ExprTerm::Number(Number::from_f64(1.0).unwrap())); + } +} diff --git a/src/selector/utils.rs b/src/selector/utils.rs new file mode 100644 index 00000000..e124221f --- /dev/null +++ b/src/selector/utils.rs @@ -0,0 +1,33 @@ +use serde_json::Number; + +pub fn to_f64(n: &Number) -> f64 { + if n.is_i64() { + n.as_i64().unwrap() as f64 + } else if n.is_f64() { + n.as_f64().unwrap() + } else { + n.as_u64().unwrap() as f64 + } +} + +pub fn abs_index(n: isize, len: usize) -> usize { + if n < 0_isize { + (n + len as isize).max(0) as usize + } else { + n.min(len as isize) as usize + } +} + +pub fn to_path_str<'a>(key: &'a str) -> (&'a str, Option) { + let key = if key.starts_with('\'') || key.starts_with('"') { + let s = &key[1..key.len() - 1]; + if key.contains('\\') { + (s, Some(s.chars().filter(|ch| ch != &'\\').collect())) + } else { + (s, None) + } + } else { + (key, None) + }; + key +} diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs new file mode 100644 index 00000000..8c7d5486 --- /dev/null +++ b/src/selector/value_walker.rs @@ -0,0 +1,128 @@ +use std::collections::HashSet; + +use serde_json::Value; +use super::utils; + +pub(super) struct ValueWalker; + +impl<'a> ValueWalker { + pub fn all_with_num(vec: Vec<&'a Value>, index: f64) -> Vec<&'a Value> { + Self::walk(vec, &|v, acc| { + if v.is_array() { + if let Some(vv) = v.get(index as usize) { + acc.push(vv); + } + } + }) + } + + pub fn all_with_str(vec: Vec<&'a Value>, key: &'a str, is_filter: bool) -> Vec<&'a Value> { + let (key, opt) = utils::to_path_str(key); + let k = if let Some(opt) = opt.as_ref() { opt } else { key }; + Self::walk(vec, &|v, acc| { + if is_filter { + match v { + Value::Object(map) => { + if let Some(v) = map.get(k) { + acc.push(v); + } + } + _ => {} + } + } else { + match v { + Value::Object(map) => { + if let Some(v) = map.get(k) { + acc.push(v); + } + } + _ => {} + } + } + }) + } + + pub fn all_with_strs(vec: Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { + let mut acc = Vec::new(); + let mut new_keys = Vec::new(); + for key in keys { + new_keys.push(utils::to_path_str(key)); + } + + for v in vec { + if let Value::Object(map) = v { + for (key, opt) in &new_keys { + let k = if let Some(opt) = opt.as_ref() { opt } else { *key }; + if let Some(v) = map.get(k) { + acc.push(v) + } + } + } + } + acc + } + + pub fn all(vec: Vec<&'a Value>) -> Vec<&'a Value> { + Self::walk(vec, &|v, acc| { + match v { + Value::Array(ay) => acc.extend(ay), + Value::Object(map) => { + acc.extend(map.values()); + } + _ => {} + } + }) + } + + fn walk(vec: Vec<&'a Value>, fun: &F) -> Vec<&'a Value> + where + F: Fn(&'a Value, &mut Vec<&'a Value>), + { + let mut acc = Vec::new(); + vec.iter().for_each(|v| { + Self::_walk(v, &mut acc, fun); + }); + acc + } + + fn _walk(v: &'a Value, acc: &mut Vec<&'a Value>, fun: &F) + where + F: Fn(&'a Value, &mut Vec<&'a Value>), + { + fun(v, acc); + + match v { + Value::Array(vec) => { + vec.iter().for_each(|v| Self::_walk(v, acc, fun)); + } + Value::Object(map) => { + map.values().into_iter().for_each(|v| Self::_walk(&v, acc, fun)); + } + _ => {} + } + } + + pub fn walk_dedup(v: &'a Value, + acc: &mut Vec<&'a Value>, + key: &str, + visited: &mut HashSet<*const Value>, ) { + match v { + Value::Object(map) => { + if map.contains_key(key) { + let ptr = v as *const Value; + if !visited.contains(&ptr) { + visited.insert(ptr); + acc.push(v) + } + } + } + Value::Array(vec) => { + for v in vec { + Self::walk_dedup(v, acc, key, visited); + } + } + _ => {} + } + } +} + diff --git a/tests/common.rs b/tests/common.rs index 1de2604d..6052d62e 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -6,7 +6,7 @@ use std::io::Read; use serde_json::Value; -use self::jsonpath::Selector; +use self::jsonpath::{JsonSelector, PathParser}; #[allow(dead_code)] pub fn setup() { @@ -31,13 +31,9 @@ pub fn read_contents(path: &str) -> String { #[allow(dead_code)] pub fn select_and_then_compare(path: &str, json: Value, target: Value) { - let mut selector = Selector::default(); - let result = selector - .str_path(path) - .unwrap() - .value(&json) - .select_as::() - .unwrap(); + let parser = PathParser::compile(path).unwrap(); + let mut selector = JsonSelector::new(parser); + let result = selector.value(&json).select_as::().unwrap(); assert_eq!( result, match target { diff --git a/tests/lib.rs b/tests/lib.rs index 907af051..60f83524 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -14,7 +14,7 @@ mod common; #[test] fn compile() { let compile_object = |path| { - let template = jsonpath::Compiled::compile(path).unwrap(); + let template = jsonpath::PathCompiled::compile(path).unwrap(); let json_obj = read_json("./benchmark/data_obj.json"); let json = template.select(&json_obj).unwrap(); let ret = json!([ @@ -25,7 +25,7 @@ fn compile() { }; let compile_array = |path| { - let template = jsonpath::Compiled::compile(path).unwrap(); + let template = jsonpath::PathCompiled::compile(path).unwrap(); let json_obj = read_json("./benchmark/data_array.json"); let json = template.select(&json_obj).unwrap(); let ret = json!([ diff --git a/tests/precompile.rs b/tests/precompile.rs index 7509ac72..6793a12b 100644 --- a/tests/precompile.rs +++ b/tests/precompile.rs @@ -3,7 +3,7 @@ extern crate serde_json; extern crate jsonpath_lib; use common::{setup}; -use jsonpath_lib::Compiled; +use jsonpath_lib::PathCompiled; use serde_json::Value; mod common; @@ -18,7 +18,7 @@ fn precompile_test() { // compile once - let compiled = Compiled::compile("$.foo.bar"); + let compiled = PathCompiled::compile("$.foo.bar"); assert!(compiled.is_ok()); @@ -35,7 +35,7 @@ fn precompile_test() { fn precompile_failure() { setup(); - let compiled = Compiled::compile(""); + let compiled = PathCompiled::compile(""); assert!(compiled.is_err()); } \ No newline at end of file diff --git a/tests/readme.rs b/tests/readme.rs index b8a3786d..aa8e906a 100644 --- a/tests/readme.rs +++ b/tests/readme.rs @@ -6,7 +6,7 @@ extern crate serde_json; use serde::Deserialize; use serde_json::Value; -use jsonpath::{Selector, SelectorMut}; +use jsonpath::{JsonSelector, JsonSelectorMut, PathParser}; mod common; @@ -173,12 +173,10 @@ fn readme_selector() { {"name": "친구4"} ]}); - let mut selector = Selector::default(); + let parser = PathParser::compile("$..[?(@.age >= 30)]").unwrap(); + let mut selector = JsonSelector::new(parser); - let result = selector - .str_path("$..[?(@.age >= 30)]") - .unwrap() - .value(&json_obj) + let result = selector.value(&json_obj) .select() .unwrap(); @@ -191,7 +189,7 @@ fn readme_selector() { assert_eq!( vec![Friend { name: "친구3".to_string(), - age: Some(30) + age: Some(30), }], result ); @@ -211,12 +209,10 @@ fn readme_selector_mut() { {"name": "친구4"} ]}); - let mut selector_mut = SelectorMut::default(); + let parser = PathParser::compile("$..[?(@.age == 20)].age").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); - let result = selector_mut - .str_path("$..[?(@.age == 20)].age") - .unwrap() - .value(json_obj) + let result = selector_mut.value(json_obj) .replace_with(&mut |v| { let age = if let Value::Number(n) = v { n.as_u64().unwrap() * 2 @@ -290,7 +286,7 @@ fn readme_select_as_str() { "#, "$..friends[0]", ) - .unwrap(); + .unwrap(); assert_eq!( ret, @@ -321,7 +317,7 @@ fn readme_select_as() { }"#, "$.person", ) - .unwrap(); + .unwrap(); let person = Person { name: "Doe John".to_string(), @@ -334,7 +330,7 @@ fn readme_select_as() { #[test] fn readme_compile() { - let first_firend = jsonpath::Compiled::compile("$..friends[0]").unwrap(); + let first_firend = jsonpath::PathCompiled::compile("$..friends[0]").unwrap(); let json_obj = json!({ "school": { @@ -524,7 +520,7 @@ fn readme_replace_with() { Some(json!(age)) }) - .unwrap(); + .unwrap(); assert_eq!( result, diff --git a/tests/selector.rs b/tests/selector.rs index dbb99852..8c0cbf6c 100644 --- a/tests/selector.rs +++ b/tests/selector.rs @@ -2,23 +2,22 @@ extern crate jsonpath_lib as jsonpath; #[macro_use] extern crate serde_json; -use common::{read_json, setup}; -use jsonpath::{Parser, Selector, SelectorMut}; use serde_json::Value; +use common::{read_json, setup}; +use jsonpath::{PathParser, JsonSelector, JsonSelectorMut}; + mod common; #[test] fn selector_mut() { setup(); - let mut selector_mut = SelectorMut::default(); + let parser = PathParser::compile("$.store..price").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); let mut nums = Vec::new(); - let result = selector_mut - .str_path(r#"$.store..price"#) - .unwrap() - .value(read_json("./benchmark/example.json")) + let result = selector_mut.value(read_json("./benchmark/example.json")) .replace_with(&mut |v| { if let Value::Number(n) = v { nums.push(n.as_f64().unwrap()); @@ -34,11 +33,9 @@ fn selector_mut() { vec![8.95_f64, 12.99_f64, 8.99_f64, 22.99_f64, 19.95_f64] ); - let mut selector = Selector::default(); - let result = selector - .str_path(r#"$.store..price"#) - .unwrap() - .value(&result) + let parser = PathParser::compile("$.store..price").unwrap(); + let mut selector = JsonSelector::new(parser); + let result = selector.value(&result) .select() .unwrap(); @@ -54,24 +51,14 @@ fn selector_mut() { ); } -#[test] -fn selector_node_ref() { - let node = Parser::compile("$.*").unwrap(); - let mut selector = Selector::default(); - selector.compiled_path(&node); - assert!(std::ptr::eq(selector.node_ref().unwrap(), &node)); -} - #[test] fn selector_delete_multi_elements_from_array() { setup(); - let mut selector_mut = SelectorMut::default(); + let parser = PathParser::compile("$[0,2]").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); - let result = selector_mut - .str_path(r#"$[0,2]"#) - .unwrap() - .value(serde_json::from_str("[1,2,3]").unwrap()) + let result = selector_mut.value(serde_json::from_str("[1,2,3]").unwrap()) .remove() .unwrap() .take() @@ -87,22 +74,18 @@ fn selector_delete_multi_elements_from_array() { fn selector_delete() { setup(); - let mut selector_mut = SelectorMut::default(); + let parser = PathParser::compile("$.store..price[?(@>13)]").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); - let result = selector_mut - .str_path(r#"$.store..price[?(@>13)]"#) - .unwrap() - .value(read_json("./benchmark/example.json")) + let result = selector_mut.value(read_json("./benchmark/example.json")) .delete() .unwrap() .take() .unwrap(); - let mut selector = Selector::default(); - let result = selector - .str_path(r#"$.store..price"#) - .unwrap() - .value(&result) + let parser = PathParser::compile("$.store..price").unwrap(); + let mut selector = JsonSelector::new(parser); + let result = selector.value(&result) .select() .unwrap(); @@ -121,23 +104,18 @@ fn selector_delete() { #[test] fn selector_remove() { setup(); + let parser = PathParser::compile("$.store..price[?(@>13)]").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); - let mut selector_mut = SelectorMut::default(); - - let result = selector_mut - .str_path(r#"$.store..price[?(@>13)]"#) - .unwrap() - .value(read_json("./benchmark/example.json")) + let result = selector_mut.value(read_json("./benchmark/example.json")) .remove() .unwrap() .take() .unwrap(); - let mut selector = Selector::default(); - let result = selector - .str_path(r#"$.store..price"#) - .unwrap() - .value(&result) + let parser = PathParser::compile("$.store..price").unwrap(); + let mut selector = JsonSelector::new(parser); + let result = selector.value(&result) .select() .unwrap(); From 54a82400f5d592a8d1b75d87bee7c94a28cb25bf Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 2 Aug 2021 13:37:18 +0900 Subject: [PATCH 11/22] add benchmark script --- .gitignore | 4 +- benchmark/Cargo.toml | 5 +- benchmark/README.md | 42 + benchmark/bench_bin/.gitignore | 5 - benchmark/bench_bin/Cargo.toml | 7 - benchmark/bench_bin/bench.sh | 8 - benchmark/bench_bin/src/main.rs | 48 - benchmark/benches/bench.rs | 20 +- benchmark/benches/bench_example.rs | 4 +- benchmark/flame.svg | 2860 ++++++++++++++++++++++++++++ benchmark/gen_flamegraph.sh | 6 + benchmark/gen_valgrind.sh | 9 + benchmark/src/main.rs | 55 +- 13 files changed, 2991 insertions(+), 82 deletions(-) create mode 100644 benchmark/README.md delete mode 100644 benchmark/bench_bin/.gitignore delete mode 100644 benchmark/bench_bin/Cargo.toml delete mode 100755 benchmark/bench_bin/bench.sh delete mode 100644 benchmark/bench_bin/src/main.rs create mode 100644 benchmark/flame.svg create mode 100755 benchmark/gen_flamegraph.sh create mode 100755 benchmark/gen_valgrind.sh diff --git a/.gitignore b/.gitignore index 5e2c0177..7884fa01 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ !.idea/runConfigurations/ /target/ Cargo.lock -callgrind.out.* \ No newline at end of file +callgrind.out.* +perf.data +perf.data.* \ No newline at end of file diff --git a/benchmark/Cargo.toml b/benchmark/Cargo.toml index fd5f6b2f..8486bd06 100644 --- a/benchmark/Cargo.toml +++ b/benchmark/Cargo.toml @@ -14,4 +14,7 @@ bencher = "0.1.5" [[bin]] name = "jsonpath_lib_benches" -path = "src/main.rs" \ No newline at end of file +path = "src/main.rs" + +[profile.release] +debug = true \ No newline at end of file diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 00000000..b8c70f44 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,42 @@ +# 프레임그래프 생성 방법 + +## 사전 준비 +1. perf 설치 +2. flamegraph 다운로드 + - https://github.com/brendangregg/FlameGraph +3. rust-unmangle 다운로드 + - https://github.com/Yamakaky/rust-unmangle + - 실행 파일로 만들고 +4. PATH에 추가 + +```bash +export PATH=/home/han/Documents/FlameGraph:$PATH +export PATH=/home/han/Documents/rust-unmangle:$PATH +``` + +5. 설정 추가 + +```bash +sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid' +sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict' +``` + +## 실행 + +> ./gen_flamegraph.sh + +# 발그라인드 생성 방법 + +## 사전 준비 +1. valgrind 설치 +> sudo apt-get install valgrind + +2. kcachegrind 설치 +> sudo apt-get install kcachegrind + +## 실행 + +> ./gen_valgrind.sh +> kcachegrind #callgrind.out.xxx 읽기 +> +> \ No newline at end of file diff --git a/benchmark/bench_bin/.gitignore b/benchmark/bench_bin/.gitignore deleted file mode 100644 index 4fbbf9df..00000000 --- a/benchmark/bench_bin/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/target -**/*.rs.bk -Cargo.lock -bin/ -.idea \ No newline at end of file diff --git a/benchmark/bench_bin/Cargo.toml b/benchmark/bench_bin/Cargo.toml deleted file mode 100644 index be4989e7..00000000 --- a/benchmark/bench_bin/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "bench_bin" -version = "0.2.0" - -[dependencies] -jsonpath_lib = {path = "../../"} -serde_json = { version = "1.0", features = ["preserve_order"] } \ No newline at end of file diff --git a/benchmark/bench_bin/bench.sh b/benchmark/bench_bin/bench.sh deleted file mode 100755 index 68ad3cc3..00000000 --- a/benchmark/bench_bin/bench.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -if [ -d "target/release" ]; then - ./target/release/bench_bin $1 $2 -else - echo "빌드먼저" -fi \ No newline at end of file diff --git a/benchmark/bench_bin/src/main.rs b/benchmark/bench_bin/src/main.rs deleted file mode 100644 index 85e67bcb..00000000 --- a/benchmark/bench_bin/src/main.rs +++ /dev/null @@ -1,48 +0,0 @@ -extern crate jsonpath_lib as jsonpath; -extern crate serde_json; - -use serde_json::Value; -use std::io::Read; - -use std::env; - -fn read_json(path: &str) -> String { - let mut f = std::fs::File::open(path).unwrap(); - let mut contents = String::new(); - f.read_to_string(&mut contents).unwrap(); - contents -} - -fn main() { - let string = read_json("../example.json"); - let json: Value = serde_json::from_str(string.as_str()).unwrap(); - let path = r#"$..book[?(@.price<30 && @.category=="fiction")]"#; - - let args: Vec = env::args().collect(); - let iter = match &args[2].as_str().parse::() { - Ok(iter) => *iter, - _ => 100000 - }; - - match &args[1].as_str() { - &"compile" => { - let mut template = jsonpath::compile(path); - for _ in 1..iter { - let _ = template(&json).unwrap(); - } - } - &"selector" => { - let mut selector = jsonpath::selector(&json); - for _ in 1..iter { - let _ = selector(path).unwrap(); - } - } - &"select" => { - let json: Value = serde_json::from_str(string.as_str()).unwrap(); - for _ in 1..iter { - let _ = jsonpath::select(&json, path).unwrap(); - } - } - _ => panic!("Invalid argument") - } -} diff --git a/benchmark/benches/bench.rs b/benchmark/benches/bench.rs index db10045e..0645e863 100644 --- a/benchmark/benches/bench.rs +++ b/benchmark/benches/bench.rs @@ -6,12 +6,12 @@ extern crate serde_json; extern crate test; use std::io::Read; +use std::rc::Rc; +use jsonpath::{JsonSelector, JsonSelectorMut, PathParser}; use serde::Deserialize; use serde_json::Value; -use jsonpath::{SelectorMut, Selector}; - use self::test::Bencher; fn read_json(path: &str) -> String { @@ -109,8 +109,8 @@ fn bench_select_as(b: &mut Bencher) { #[bench] fn bench_delete(b: &mut Bencher) { let json = get_json(); - let mut selector = SelectorMut::default(); - let _ = selector.str_path(get_path()); + let parser = PathParser::compile(get_path()).unwrap(); + let mut selector = JsonSelectorMut::new(parser); b.iter(move || { for _ in 1..100 { @@ -123,15 +123,17 @@ fn bench_delete(b: &mut Bencher) { fn bench_select_to_compare_with_delete(b: &mut Bencher) { let json = &get_json(); - let mut selector = Selector::default(); - let _ = selector.str_path(get_path()); + let parser = Rc::new(Box::new(PathParser::compile(get_path()).unwrap())); b.iter(move || { for _ in 1..100 { let json = json.clone(); - let mut s = Selector::default(); - let _ = s.compiled_path(selector.node_ref().unwrap()).value(&json); - let _ = s.select(); + let mut s = JsonSelector::new_ref(Rc::clone(&parser)); + let _ = s.value(&json); + let r = s.select(); + if r.is_err() { + panic!() + } } }); } \ No newline at end of file diff --git a/benchmark/benches/bench_example.rs b/benchmark/benches/bench_example.rs index f91b7c24..619c1765 100644 --- a/benchmark/benches/bench_example.rs +++ b/benchmark/benches/bench_example.rs @@ -53,8 +53,8 @@ fn _selector(b: &mut Bencher, index: usize) { let json = get_json(); b.iter(move || { for _ in 1..100 { - let mut selector = jsonpath::Selector::default(); - let _ = selector.str_path(get_path(index)); + let parser = jsonpath::PathParser::compile(get_path(index)).unwrap(); + let mut selector = jsonpath::JsonSelector::new(parser); selector.value(&json); let r = selector.select(); if r.is_err() { diff --git a/benchmark/flame.svg b/benchmark/flame.svg new file mode 100644 index 00000000..4a34a0ef --- /dev/null +++ b/benchmark/flame.svg @@ -0,0 +1,2860 @@ + + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search +ic + + + +jsonpath_lib::selector::terms::ExprTerm::and (17 samples, 7.91%) +jsonpath_li.. + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (16 samples, 7.44%) +<serde_jso.. + + +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (21 samples, 9.77%) +<serde_json::m.. + + +jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.40%) + + + +perf (7 samples, 3.26%) +perf + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) + + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.40%) + + + +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (30 samples, 13.95%) +<core::iter::adapters.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (5 samples, 2.33%) +j.. + + +path_openat (1 samples, 0.47%) + + + +_x64_sys_openat (1 samples, 0.47%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (15 samples, 6.98%) +<indexmap.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::array_start (37 samples, 17.21%) +jsonpath_lib::paths::path_.. + + +int_free (1 samples, 0.47%) + + + +alloc::raw_vec::finish_grow (3 samples, 1.40%) + + + +_GI___libc_malloc (1 samples, 0.47%) + + + +core::sync::atomic::AtomicUsize::load (1 samples, 0.47%) + + + +_set_task_comm (7 samples, 3.26%) +_se.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +wp_page_copy (1 samples, 0.47%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) + + + +_memcmp_avx2_movbe (1 samples, 0.47%) + + + +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 3.72%) +core.. + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (8 samples, 3.72%) +<all.. + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 1.86%) +c.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp (23 samples, 10.70%) +jsonpath_lib::s.. + + +core::core_arch::x86::sse2::mm_movemask_epi8 (2 samples, 0.93%) + + + +core::iter::traits::iterator::Iterator::try_fold (21 samples, 9.77%) +core::iter::tr.. + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (12 samples, 5.58%) +hashbro.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.47%) + + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) +<.. + + +core::iter::traits::iterator::Iterator::all::check::{{closure}} (21 samples, 9.77%) +core::iter::tr.. + + +do_syscall_64 (1 samples, 0.47%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (8 samples, 3.72%) +core.. + + +indexmap::map::IndexMap<K,V,S>::get_index_of (2 samples, 0.93%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (40 samples, 18.60%) +jsonpath_lib::selector::terms.. + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (45 samples, 20.93%) +jsonpath_lib::paths::path_parser.. + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.47%) + + + +log::max_level (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (3 samples, 1.40%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.47%) + + + +native_flush_tlb_one_user (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.47%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_absolute (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (9 samples, 4.19%) +inde.. + + +hashbrown::set::HashSet<T,S,A>::contains (2 samples, 0.93%) + + + +core::str::<impl str>::parse (3 samples, 1.40%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::new (37 samples, 17.21%) +jsonpath_lib::paths::token.. + + +jsonpath_lib_benches::main (205 samples, 95.35%) +jsonpath_lib_benches::main + + +indexmap::map::core::equivalent::{{closure}} (2 samples, 0.93%) + + + +core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (8 samples, 3.72%) +core.. + + +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) + + + +core::num::<impl usize>::overflowing_add (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokens::Token::reset_span (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.47%) + + + +<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (16 samples, 7.44%) +<jsonpath_.. + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) + + + +main (206 samples, 95.81%) +main + + +do_syscall_64 (7 samples, 3.26%) +do_.. + + +hashbrown::raw::RawTable<T,A>::reserve_rehash (12 samples, 5.58%) +hashbro.. + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (6 samples, 2.79%) +js.. + + +alloc::boxed::Box<T>::new (1 samples, 0.47%) + + + +core::num::dec2flt::dec2flt (3 samples, 1.40%) + + + +_x64_sys_execve (1 samples, 0.47%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (21 samples, 9.77%) +<indexmap::map.. + + +jsonpath_lib::selector::selector_impl::JsonSelector::select (112 samples, 52.09%) +jsonpath_lib::selector::selector_impl::JsonSelector::select + + +core::result::Result<T,E>::map_err (1 samples, 0.47%) + + + +_GI___open64_nocancel (1 samples, 0.47%) + + + +<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (3 samples, 1.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (9 samples, 4.19%) +serd.. + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 0.93%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 0.93%) + + + +do_user_addr_fault (1 samples, 0.47%) + + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (30 samples, 13.95%) +jsonpath_lib::selecto.. + + +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.47%) + + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 3.72%) +<all.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.40%) + + + +hashbrown::map::make_hash (1 samples, 0.47%) + + + +core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.47%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) + + + +alloc::alloc::box_free (2 samples, 0.93%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (6 samples, 2.79%) +al.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.47%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (22 samples, 10.23%) +core::cmp::impl.. + + +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::PathParser::parse (112 samples, 52.09%) +jsonpath_lib::paths::path_parser::PathParser::parse + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.40%) + + + +jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 0.93%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 0.93%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 0.93%) + + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.47%) + + + +jsonpath_lib::paths::str_reader::StrReader::take_while (4 samples, 1.86%) +j.. + + +core::iter::traits::iterator::Iterator::all (15 samples, 6.98%) +core::ite.. + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.47%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) + + + +core::ptr::read (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 0.93%) + + + +_rust_dealloc (1 samples, 0.47%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (16 samples, 7.44%) +core::cmp:.. + + +hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 0.93%) + + + +core::ptr::write (2 samples, 0.93%) + + + +jsonpath_lib::paths::str_reader::StrReader::next_char (2 samples, 0.93%) + + + +IO_new_fopen (1 samples, 0.47%) + + + +std::rt::lang_start_internal::{{closure}} (206 samples, 95.81%) +std::rt::lang_start_internal::{{closure}} + + +core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>>> (8 samples, 3.72%) +core.. + + +hashbrown::raw::RawTableInner<A>::find_insert_slot (6 samples, 2.79%) +ha.. + + +load_elf_binary (1 samples, 0.47%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 1.86%) +<.. + + +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.93%) + + + +alloc::alloc::Global::grow_impl (3 samples, 1.40%) + + + +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (6 samples, 2.79%) +ha.. + + +core::num::<impl usize>::overflowing_add (1 samples, 0.47%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 0.93%) + + + +alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 1.86%) +c.. + + +link_path_wal.ar. (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (30 samples, 13.95%) +core::iter::traits::i.. + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (4 samples, 1.86%) +a.. + + +jsonpath_lib::selector::terms::ExprTerm::lt (8 samples, 3.72%) +json.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.47%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 1.86%) +a.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (7 samples, 3.26%) +cor.. + + +jsonpath_lib::paths::path_parser::ParserImpl::expr (18 samples, 8.37%) +jsonpath_li.. + + +indexmap::map::IndexMap<K,V,S>::hash (6 samples, 2.79%) +in.. + + +hashbrown::raw::RawTableInner<A>::prepare_resize (2 samples, 0.93%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) + + + +_memcmp_avx2_movbe (1 samples, 0.47%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.47%) + + + +std::panicking::try (206 samples, 95.81%) +std::panicking::try + + +alloc::alloc::Global::alloc_impl (1 samples, 0.47%) + + + +core::option::Option<T>::map_or (3 samples, 1.40%) + + + +jsonpath_lib::paths::str_reader::StrReader::peek (2 samples, 0.93%) + + + +jsonpath_lib::selector::terms::FilterTerms::pop_term (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (3 samples, 1.40%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (7 samples, 3.26%) +cor.. + + +core::option::Option<T>::map_or (3 samples, 1.40%) + + + +jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::all::check::{{closure}} (15 samples, 6.98%) +core::ite.. + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.93%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (2 samples, 0.93%) + + + +_memcmp_avx2_movbe (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::expr (12 samples, 5.58%) +jsonpat.. + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (8 samples, 3.72%) +core.. + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.40%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::and (1 samples, 0.47%) + + + +jsonpath_lib::select (204 samples, 94.88%) +jsonpath_lib::select + + +alloc::vec::Vec<T,A>::reserve (6 samples, 2.79%) +al.. + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (60 samples, 27.91%) +jsonpath_lib::selector::selector_impl::JsonS.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.93%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (5 samples, 2.33%) +c.. + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (21 samples, 9.77%) +<indexmap::map.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.93%) + + + +core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.47%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.40%) + + + +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.47%) + + + +core::num::<impl u64>::rotate_left (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::array (39 samples, 18.14%) +jsonpath_lib::paths::path_pa.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (4 samples, 1.86%) +i.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::new (37 samples, 17.21%) +jsonpath_lib::paths::path_.. + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (7 samples, 3.26%) +<Q .. + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.40%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (7 samples, 3.26%) +<al.. + + +_do_execve_fil.sr. (7 samples, 3.26%) +_do.. + + +indexmap::map::IndexMap<K,V,S>::contains_key (9 samples, 4.19%) +inde.. + + +exc_page_fault (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.40%) + + + +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.47%) + + + +core::slice::<impl [T]>::last (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::find (1 samples, 0.47%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) + + + +alloc::boxed::Box<T>::new (4 samples, 1.86%) +a.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.93%) + + + +IO_new_file_fopen (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 0.93%) + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.33%) +<.. + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (2 samples, 0.93%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 0.93%) + + + +_fopen_internal (1 samples, 0.47%) + + + +_memmove_avx_unaligned_erms (2 samples, 0.93%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::op (5 samples, 2.33%) +j.. + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 1.86%) +j.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp (17 samples, 7.91%) +jsonpath_li.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +core::core_arch::simd::i8x16::new (1 samples, 0.47%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (12 samples, 5.58%) +indexma.. + + +alloc::alloc::dealloc (1 samples, 0.47%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (15 samples, 6.98%) +<indexmap.. + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) +<.. + + +jsonpath_lib::selector::utils::to_path_str (1 samples, 0.47%) + + + +core::ptr::drop_in_place<jsonpath_lib::selector::terms::ExprTerm> (1 samples, 0.47%) + + + +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (30 samples, 13.95%) +<core::iter::adapters.. + + +_memcmp_avx2_movbe (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.93%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::fold (30 samples, 13.95%) +core::iter::traits::i.. + + +int_realloc (3 samples, 1.40%) + + + +_GI___libc_free (1 samples, 0.47%) + + + +exec_binprm (1 samples, 0.47%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 1.86%) +h.. + + +_GI___libc_malloc (1 samples, 0.47%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 0.93%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.40%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_array_eof (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (11 samples, 5.12%) +jsonpa.. + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 3.72%) +core.. + + +indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.33%) +i.. + + +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (16 samples, 7.44%) +<jsonpath_.. + + +std::panic::catch_unwind (205 samples, 95.35%) +std::panic::catch_unwind + + +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) + + + +do_filp_open (1 samples, 0.47%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (3 samples, 1.40%) + + + +jsonpath_lib::selector::utils::to_path_str (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (30 samples, 13.95%) +jsonpath_lib::selecto.. + + +jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (5 samples, 2.33%) +j.. + + +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.47%) + + + +core::core_arch::simd::i8x16::new (1 samples, 0.47%) + + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.47%) + + + +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.47%) + + + +hashbrown::raw::sse2::Group::match_byte (1 samples, 0.47%) + + + +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.47%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.47%) + + + +jsonpath_lib_be (208 samples, 96.74%) +jsonpath_lib_be + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) + + + +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (205 samples, 95.35%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) + + + +alloc::alloc::Global::alloc_impl (1 samples, 0.47%) + + + +_GI___libc_free (1 samples, 0.47%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8 samples, 3.72%) +<all.. + + +hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.47%) + + + +alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 3.72%) +json.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.40%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (4 samples, 1.86%) +<.. + + +jsonpath_lib::selector::selector_impl::JsonSelector::compute_absolute_path_filter (1 samples, 0.47%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +start (207 samples, 96.28%) +start + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (8 samples, 3.72%) +<all.. + + +strlen (7 samples, 3.26%) +str.. + + +alloc::boxed::Box<T>::new (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::resize (12 samples, 5.58%) +hashbro.. + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) + + + +pthread_getattr_np (1 samples, 0.47%) + + + +jsonpath_lib_benches::main::{{closure}} (205 samples, 95.35%) +jsonpath_lib_benches::main::{{closure}} + + +hashbrown::raw::RawTable<T,A>::reserve (12 samples, 5.58%) +hashbro.. + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 1.86%) +<.. + + +core::num::dec2flt::parse::parse_number (1 samples, 0.47%) + + + +std::panicking::try::do_call (205 samples, 95.35%) +std::panicking::try::do_call + + +std::panicking::try (205 samples, 95.35%) +std::panicking::try + + +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::PathParser::compile (82 samples, 38.14%) +jsonpath_lib::paths::path_parser::PathParser::compile + + +flush_tlb_mm_range (1 samples, 0.47%) + + + +std::collections::hash::set::HashSet<T,S>::insert (17 samples, 7.91%) +std::collec.. + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) + + + +int_free (1 samples, 0.47%) + + + +core::intrinsics::copy (14 samples, 6.51%) +core::in.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) + + + +core::hash::sip::Hasher<S>::reset (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.47%) + + + +alloc::alloc::Global::alloc_impl (4 samples, 1.86%) +a.. + + +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.47%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) + + + +std::thread::local::LocalKey<T>::try_with (1 samples, 0.47%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.47%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (6 samples, 2.79%) +al.. + + +_do_execve_fil.sr. (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term (8 samples, 3.72%) +json.. + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) +<.. + + +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.47%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) + + + +std::panic::catch_unwind (206 samples, 95.81%) +std::panic::catch_unwind + + +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::new_in (2 samples, 0.93%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 3.72%) +<all.. + + +indexmap::map::core::equivalent::{{closure}} (8 samples, 3.72%) +inde.. + + +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::try_fold (15 samples, 6.98%) +core::ite.. + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (3 samples, 1.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) + + + +<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (3 samples, 1.40%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) + + + +hashbrown::raw::TableLayout::calculate_layout_for (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 0.93%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +alloc::alloc::dealloc (2 samples, 0.93%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::exprs (19 samples, 8.84%) +jsonpath_lib.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +<jsonpath_lib::paths::tokens::ParseToken as core::clone::Clone>::clone (1 samples, 0.47%) + + + +hashbrown::map::make_hash (2 samples, 0.93%) + + + +<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (8 samples, 3.72%) +<all.. + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) + + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.47%) + + + +std::collections::hash::set::HashSet<T,S>::contains (2 samples, 0.93%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (3 samples, 1.40%) + + + +int_malloc (4 samples, 1.86%) +i.. + + +alloc::vec::Vec<T,A>::as_ptr (1 samples, 0.47%) + + + +core::slice::<impl [T]>::first (1 samples, 0.47%) + + + +alloc::alloc::alloc (4 samples, 1.86%) +a.. + + +jsonpath_lib::selector::terms::ExprTerm::or (23 samples, 10.70%) +jsonpath_lib::s.. + + +jsonpath_lib::paths::path_parser::ParserImpl::compile (45 samples, 20.93%) +jsonpath_lib::paths::path_parser.. + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.47%) + + + +<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (3 samples, 1.40%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.40%) + + + +hashbrown::map::HashMap<K,V,S,A>::get_inner (2 samples, 0.93%) + + + +std::sys::unix::thread::guard::get_stack_start (1 samples, 0.47%) + + + +core::hash::Hasher::write_u8 (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::op (9 samples, 4.19%) +json.. + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 3.72%) +<all.. + + +alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.33%) +a.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 3.72%) +json.. + + +core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.47%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.47%) + + + +alloc::alloc::realloc (3 samples, 1.40%) + + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) + + + +std::collections::hash::set::HashSet<T>::new (3 samples, 1.40%) + + + +_x64_sys_execve (7 samples, 3.26%) +_x6.. + + +std::rt::lang_start_internal (206 samples, 95.81%) +std::rt::lang_start_internal + + +_memcmp_avx2_movbe (3 samples, 1.40%) + + + +hashbrown::map::make_hasher::{{closure}} (1 samples, 0.47%) + + + +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) + + + +change_protection (1 samples, 0.47%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +core::str::validations::next_code_point (2 samples, 0.93%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.47%) + + + +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 1.86%) +j.. + + +indexmap::map::core::equivalent::{{closure}} (2 samples, 0.93%) + + + +std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.47%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +exec_binprm (7 samples, 3.26%) +exe.. + + +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.47%) + + + +std::sys::unix::thread::guard::init (1 samples, 0.47%) + + + +_GI___libc_malloc (4 samples, 1.86%) +_.. + + +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) + + + +core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.47%) + + + +alloc::alloc::dealloc (1 samples, 0.47%) + + + +asm_exc_page_fault (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::fold (205 samples, 95.35%) +core::iter::traits::iterator::Iterator::fold + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.47%) + + + +std::panicking::try::do_call (206 samples, 95.81%) +std::panicking::try::do_call + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 2.79%) +in.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.47%) + + + +core::sync::atomic::atomic_load (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) + + + +alloc::vec::Vec<T,A>::extend_desugared (8 samples, 3.72%) +allo.. + + +alloc::vec::Vec<T,A>::reserve (4 samples, 1.86%) +a.. + + +_GI___libc_realloc (3 samples, 1.40%) + + + +hashbrown::raw::RawTableInner<A>::new_uninitialized (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term (6 samples, 2.79%) +js.. + + +int_malloc (2 samples, 0.93%) + + + +hashbrown::map::make_insert_hash (2 samples, 0.93%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::insert (14 samples, 6.51%) +hashbrow.. + + +core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 0.93%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (6 samples, 2.79%) +al.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.47%) + + + +load_elf_binary (7 samples, 3.26%) +loa.. + + +alloc::vec::Vec<T,A>::push (1 samples, 0.47%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) + + + +alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.47%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.47%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (22 samples, 10.23%) +<serde_json::va.. + + +alloc::alloc::alloc (1 samples, 0.47%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.40%) + + + +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::filter (40 samples, 18.60%) +jsonpath_lib::selector::terms.. + + +core::iter::traits::iterator::Iterator::collect (8 samples, 3.72%) +core.. + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.40%) + + + +std::collections::hash::map::RandomState::new (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.33%) +i.. + + +flush_tlb_func_commo.onstpro. (1 samples, 0.47%) + + + +tcache_put (2 samples, 0.93%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.40%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 3.72%) +<all.. + + +core::hash::Hasher::write_usize (1 samples, 0.47%) + + + +core::num::<impl u64>::wrapping_add (2 samples, 0.93%) + + + +std::sys_common::rt::init (1 samples, 0.47%) + + + +jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (2 samples, 0.93%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (4 samples, 1.86%) +c.. + + +alloc::alloc::exchange_malloc (4 samples, 1.86%) +a.. + + +_memmove_avx_unaligned_erms (14 samples, 6.51%) +_memmove.. + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) + + + +hashbrown::set::HashSet<T,S,A>::insert (17 samples, 7.91%) +hashbrown::.. + + +_rust_alloc (1 samples, 0.47%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (5 samples, 2.33%) +c.. + + +std::sys_common::backtrace::_rust_begin_short_backtrace (205 samples, 95.35%) +std::sys_common::backtrace::_rust_begin_short_backtrace + + +jsonpath_lib::paths::path_parser::ParserImpl::path_in_key (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 0.93%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) + + + +jsonpath_lib::selector::terms::ExprTerm::gt (8 samples, 3.72%) +json.. + + +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (15 samples, 6.98%) +<serde_js.. + + +core::iter::traits::iterator::Iterator::collect (8 samples, 3.72%) +core.. + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (4 samples, 1.86%) +<.. + + +alloc::alloc::alloc (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.47%) + + + +core::option::Option<T>::get_or_insert_with (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::json_path (45 samples, 20.93%) +jsonpath_lib::paths::path_parser.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::all (21 samples, 9.77%) +core::iter::tr.. + + +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.93%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.93%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) + + + +mprotect_fixup (1 samples, 0.47%) + + + +entry_SYSCALL_64_after_hwframe (7 samples, 3.26%) +ent.. + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.47%) + + + +elf_get_dynamic_info (1 samples, 0.47%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::exprs (36 samples, 16.74%) +jsonpath_lib::paths::path.. + + +core::ptr::drop_in_place<core::result::Result<alloc::vec::Vec<&serde_json::value::Value>,jsonpath_lib::select::JsonPathError>> (1 samples, 0.47%) + + + +alloc::alloc::exchange_malloc (1 samples, 0.47%) + + + +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.47%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::select (112 samples, 52.09%) +jsonpath_lib::selector::selector_impl::JsonSelector::select + + +hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (2 samples, 0.93%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 2.79%) +ha.. + + +core::num::<impl usize>::checked_add (1 samples, 0.47%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (2 samples, 0.93%) + + + +_GI___libc_realloc (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) + + + +alloc::alloc::realloc (2 samples, 0.93%) + + + +core::hash::Hasher::write_usize (1 samples, 0.47%) + + + +do_sys_openat2 (1 samples, 0.47%) + + + +std::rt::lang_start::{{closure}} (205 samples, 95.35%) +std::rt::lang_start::{{closure}} + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +<std::collections::hash::map::RandomState as core::default::Default>::default (1 samples, 0.47%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (4 samples, 1.86%) +a.. + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (3 samples, 1.40%) + + + +dl_start_final (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 1.86%) +h.. + + +<alloc::string::String as core::cmp::PartialEq>::eq (2 samples, 0.93%) + + + +setup_arg_pages (1 samples, 0.47%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 2.79%) +co.. + + +hashbrown::raw::RawTable<T,A>::get_mut (1 samples, 0.47%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 3.72%) +core.. + + +int_realloc (2 samples, 0.93%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.93%) + + + +int_free (3 samples, 1.40%) + + + +alloc::vec::Vec<T,A>::as_mut_ptr (1 samples, 0.47%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 2.79%) +co.. + + +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.47%) + + + +core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::close_token (1 samples, 0.47%) + + + +do_wp_page (1 samples, 0.47%) + + + +_libc_start_main (206 samples, 95.81%) +_libc_start_main + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) + + + +core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::pop_term (1 samples, 0.47%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) + + + +_GI__IO_file_open (1 samples, 0.47%) + + + +_GI___libc_malloc (1 samples, 0.47%) + + + +do_syscall_64 (1 samples, 0.47%) + + + +int_malloc (1 samples, 0.47%) + + + +tcache_get (1 samples, 0.47%) + + + +std::thread::local::LocalKey<T>::with (1 samples, 0.47%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.40%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::other (4 samples, 1.86%) +j.. + + +dl_start (1 samples, 0.47%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>> (8 samples, 3.72%) +core.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 1.86%) +j.. + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (7 samples, 3.26%) +<[A.. + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (4 samples, 1.86%) +j.. + + +alloc::alloc::dealloc (3 samples, 1.40%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.93%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 2.79%) +co.. + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) + + + +alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) + + + +alloc::vec::Vec<T,A>::insert (23 samples, 10.70%) +alloc::vec::Vec.. + + +core::iter::traits::iterator::Iterator::for_each (205 samples, 95.35%) +core::iter::traits::iterator::Iterator::for_each + + +flush_tlb_mm_range (1 samples, 0.47%) + + + +hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.47%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (12 samples, 5.58%) +hashbro.. + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) +<.. + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get (18 samples, 8.37%) +indexmap::m.. + + +hashbrown::raw::inner::RawTable<T,A>::get (4 samples, 1.86%) +h.. + + +dl_main (1 samples, 0.47%) + + + +<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (23 samples, 10.70%) +<jsonpath_lib::.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) + + + +ptep_clear_flush (1 samples, 0.47%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (46 samples, 21.40%) +jsonpath_lib::selector::selector_.. + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.47%) + + + +core::ptr::read (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (39 samples, 18.14%) +jsonpath_lib::selector::term.. + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (112 samples, 52.09%) +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 2.79%) +co.. + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) + + + +jsonpath_lib::selector::terms::FilterTerms::push_json_term (40 samples, 18.60%) +jsonpath_lib::selector::terms.. + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) + + + +core::ptr::write (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (12 samples, 5.58%) +indexma.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) + + + +alloc::alloc::Global::grow_impl (2 samples, 0.93%) + + + +alloc::alloc::exchange_malloc (1 samples, 0.47%) + + + +core::ptr::read (1 samples, 0.47%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.47%) + + + +all (215 samples, 100%) + + + +hashbrown::map::HashMap<K,V,S,A>::insert (17 samples, 7.91%) +hashbrown::.. + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (8 samples, 3.72%) +core.. + + +<alloc::string::String as core::hash::Hash>::hash (1 samples, 0.47%) + + + +begin_new_exec (7 samples, 3.26%) +beg.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (12 samples, 5.58%) +indexma.. + + +core::ops::function::FnOnce::call_once (205 samples, 95.35%) +core::ops::function::FnOnce::call_once + + +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) + + + +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (111 samples, 51.63%) +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handler.. + + +dl_sysdep_start (1 samples, 0.47%) + + + +core::ptr::drop_in_place<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>> (8 samples, 3.72%) +core.. + + +int_free (1 samples, 0.47%) + + + +hashbrown::raw::RawTableInner<A>::fallible_with_capacity (1 samples, 0.47%) + + + +cpumask_any_but (1 samples, 0.47%) + + + +_handle_mm_fault (1 samples, 0.47%) + + + +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.47%) + + + +alloc::raw_vec::finish_grow (4 samples, 1.86%) +a.. + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (5 samples, 2.33%) +c.. + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (7 samples, 3.26%) +cor.. + + +jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.40%) + + + +<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 0.93%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::filter (36 samples, 16.74%) +jsonpath_lib::paths::path.. + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (3 samples, 1.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 2.79%) +co.. + + +do_sys_open (1 samples, 0.47%) + + + +alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (19 samples, 8.84%) +jsonpath_lib.. + + +<alloc::string::String as core::hash::Hash>::hash (2 samples, 0.93%) + + + +hashbrown::map::HashMap<K,V,S,A>::contains_key (2 samples, 0.93%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (18 samples, 8.37%) +indexmap::m.. + + +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.47%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) + + + +hashbrown::raw::sse2::Group::match_empty_or_deleted (2 samples, 0.93%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +core::num::<impl usize>::checked_add (1 samples, 0.47%) + + + +core::iter::traits::iterator::Iterator::for_each (30 samples, 13.95%) +core::iter::traits::i.. + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (4 samples, 1.86%) +c.. + + +jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (5 samples, 2.33%) +j.. + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.47%) + + + +handle_mm_fault (1 samples, 0.47%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.47%) + + + +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (205 samples, 95.35%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once + + +hashbrown::raw::RawTableInner<A>::new_in (2 samples, 0.93%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) +<.. + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 0.93%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 0.93%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.93%) + + + + diff --git a/benchmark/gen_flamegraph.sh b/benchmark/gen_flamegraph.sh new file mode 100755 index 00000000..8e96e436 --- /dev/null +++ b/benchmark/gen_flamegraph.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e + +cargo clean && cargo build --release && \ + perf record --call-graph dwarf ./target/release/jsonpath_lib_benches && \ + perf script | stackcollapse-perf.pl | stackcollapse-recursive.pl | rust-unmangle | flamegraph.pl > flame.svg \ No newline at end of file diff --git a/benchmark/gen_valgrind.sh b/benchmark/gen_valgrind.sh new file mode 100755 index 00000000..c262a73d --- /dev/null +++ b/benchmark/gen_valgrind.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +valgrind \ + --tool=callgrind \ + --dump-instr=yes \ + --collect-jumps=yes \ + --simulate-cache=yes $1 -- $2 \ No newline at end of file diff --git a/benchmark/src/main.rs b/benchmark/src/main.rs index e71fdf55..843412e5 100644 --- a/benchmark/src/main.rs +++ b/benchmark/src/main.rs @@ -1 +1,54 @@ -fn main() {} \ No newline at end of file +extern crate jsonpath_lib as jsonpath; +extern crate serde_json; + +use serde_json::{json, Value}; + +fn main() { + let json: Value = json!( + { + "store": { + "book": [ + { + "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { + "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { + "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { + "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], + "bicycle": { + "color": "red", + "price": 19.95 + } + }, + "expensive": 10 + }); + + let path = r#"$.store.book[?( (@.price < 100 || @.price > 1) && @.price > 10 )]"#; + + (0..10000).for_each(|_| { + let r = jsonpath::select(&json, path); + if r.is_err() { + panic!(); + } + }); +} \ No newline at end of file From f42c71e3bf2ad12100d3df0a21561060199439cb Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 2 Aug 2021 17:34:11 +0900 Subject: [PATCH 12/22] Remove useless iteration in TokenReader --- benchmark/flame.svg | 2576 +++++++++++++++++++++------------------- src/paths/tokenizer.rs | 86 +- 2 files changed, 1368 insertions(+), 1294 deletions(-) diff --git a/benchmark/flame.svg b/benchmark/flame.svg index 4a34a0ef..40f29d4a 100644 --- a/benchmark/flame.svg +++ b/benchmark/flame.svg @@ -373,2488 +373,2580 @@ -jsonpath_lib::selector::terms::ExprTerm::and (17 samples, 7.91%) -jsonpath_li.. +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.56%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (16 samples, 7.44%) -<serde_jso.. +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (21 samples, 9.77%) -<serde_json::m.. +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.40%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.56%) + -perf (7 samples, 3.26%) -perf +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.69%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) - +_handle_mm_fault (1 samples, 0.56%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.40%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (30 samples, 13.95%) -<core::iter::adapters.. +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (5 samples, 2.33%) -j.. +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 4.52%) +core:.. -path_openat (1 samples, 0.47%) - +indexmap::map::core::equivalent::{{closure}} (2 samples, 1.13%) + -_x64_sys_openat (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (16 samples, 9.04%) +jsonpath_lib:.. -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (15 samples, 6.98%) -<indexmap.. +jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (59 samples, 33.33%) +jsonpath_lib::selector::selector_impl::JsonSelector::.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 0.93%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::array_start (37 samples, 17.21%) -jsonpath_lib::paths::path_.. +core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) + -int_free (1 samples, 0.47%) - +<alloc::string::String as core::cmp::PartialEq>::eq (8 samples, 4.52%) +<allo.. -alloc::raw_vec::finish_grow (3 samples, 1.40%) - +hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 1.13%) + -_GI___libc_malloc (1 samples, 0.47%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -core::sync::atomic::AtomicUsize::load (1 samples, 0.47%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.13%) + -_set_task_comm (7 samples, 3.26%) -_se.. +core::num::<impl u64>::rotate_left (2 samples, 1.13%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (45 samples, 25.42%) +jsonpath_lib::selector::selector_impl::J.. -wp_page_copy (1 samples, 0.47%) - +change_protection (1 samples, 0.56%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.13%) + -_memcmp_avx2_movbe (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (7 samples, 3.95%) +json.. -core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 3.72%) -core.. +core::num::<impl u64>::wrapping_add (1 samples, 0.56%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (8 samples, 3.72%) -<all.. +_x64_sys_execve (7 samples, 3.95%) +_x64.. -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 1.86%) -c.. +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (9 samples, 5.08%) +core::.. -jsonpath_lib::selector::terms::ExprTerm::cmp (23 samples, 10.70%) -jsonpath_lib::s.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (8 samples, 4.52%) +<[A] .. -core::core_arch::x86::sse2::mm_movemask_epi8 (2 samples, 0.93%) - +begin_new_exec (7 samples, 3.95%) +begi.. -core::iter::traits::iterator::Iterator::try_fold (21 samples, 9.77%) -core::iter::tr.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (4 samples, 2.26%) +<.. -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.47%) - +int_free (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::get (12 samples, 5.58%) -hashbro.. +jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 2.26%) +j.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) - +alloc::alloc::box_free (1 samples, 0.56%) + -entry_SYSCALL_64_after_hwframe (1 samples, 0.47%) - +jsonpath_lib_benches::main (167 samples, 94.35%) +jsonpath_lib_benches::main -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) -<.. +std::sys::unix::stack_overflow::imp::make_handler (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::all::check::{{closure}} (21 samples, 9.77%) -core::iter::tr.. +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) + -do_syscall_64 (1 samples, 0.47%) - +hashbrown::raw::RawTableInner<A>::fallible_with_capacity (1 samples, 0.56%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (8 samples, 3.72%) -core.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.13%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (2 samples, 0.93%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.47%) - +std::panicking::try (168 samples, 94.92%) +std::panicking::try -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (40 samples, 18.60%) -jsonpath_lib::selector::terms.. +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (45 samples, 20.93%) -jsonpath_lib::paths::path_parser.. +indexmap::map::IndexMap<K,V,S>::get (2 samples, 1.13%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::try_fold (13 samples, 7.34%) +core::iter.. -log::max_level (1 samples, 0.47%) - +core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (11 samples, 6.21%) +core::pt.. -jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (3 samples, 1.40%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (8 samples, 4.52%) +<Q as.. -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) + -native_flush_tlb_one_user (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (4 samples, 2.26%) +<.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (4 samples, 2.26%) +<.. -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.47%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_array_eof (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_absolute (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::find (16 samples, 9.04%) +hashbrown::ra.. -indexmap::map::IndexMap<K,V,S>::get_index_of (9 samples, 4.19%) -inde.. +jsonpath_lib::selector::terms::ExprTerm::gt (8 samples, 4.52%) +jsonp.. -hashbrown::set::HashSet<T,S,A>::contains (2 samples, 0.93%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -core::str::<impl str>::parse (3 samples, 1.40%) - +hashbrown::set::HashSet<T,S,A>::insert (13 samples, 7.34%) +hashbrown:.. -jsonpath_lib::paths::tokenizer::TokenReader::new (37 samples, 17.21%) -jsonpath_lib::paths::token.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -jsonpath_lib_benches::main (205 samples, 95.35%) -jsonpath_lib_benches::main +std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.56%) + -indexmap::map::core::equivalent::{{closure}} (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.56%) + -core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (8 samples, 3.72%) -core.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (26 samples, 14.69%) +<indexmap::map::IndexM.. -hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) + -core::num::<impl usize>::overflowing_add (1 samples, 0.47%) - +hashbrown::set::HashSet<T,S,A>::contains (6 samples, 3.39%) +has.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) + -jsonpath_lib::paths::tokens::Token::reset_span (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.69%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.47%) - +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) + -<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (16 samples, 7.44%) -<jsonpath_.. +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) - +core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.56%) + -main (206 samples, 95.81%) -main +core::num::<impl usize>::checked_add (1 samples, 0.56%) + -do_syscall_64 (7 samples, 3.26%) -do_.. +core::iter::traits::iterator::Iterator::all (26 samples, 14.69%) +core::iter::traits::it.. -hashbrown::raw::RawTable<T,A>::reserve_rehash (12 samples, 5.58%) -hashbro.. +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (6 samples, 2.79%) -js.. +indexmap::map::core::equivalent::{{closure}} (3 samples, 1.69%) + -alloc::boxed::Box<T>::new (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::vec::Vec<jsonpath_lib::paths::tokens::ParseToken>> (1 samples, 0.56%) + -core::num::dec2flt::dec2flt (3 samples, 1.40%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (2 samples, 1.13%) + -_x64_sys_execve (1 samples, 0.47%) - +core::str::<impl str>::parse (1 samples, 0.56%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (21 samples, 9.77%) -<indexmap::map.. +tcache_put (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::select (112 samples, 52.09%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.56%) + -core::result::Result<T,E>::map_err (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -_GI___open64_nocancel (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (15 samples, 8.47%) +jsonpath_lib.. -<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (3 samples, 1.40%) - +jsonpath_lib::paths::path_parser::ParserImpl::op (6 samples, 3.39%) +jso.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (9 samples, 4.19%) -serd.. +load_elf_binary (7 samples, 3.95%) +load.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 0.93%) - +std::panic::catch_unwind (167 samples, 94.35%) +std::panic::catch_unwind -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.47%) - +core::hash::impls::<impl core::hash::Hash for str>::hash (4 samples, 2.26%) +c.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 0.93%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (13 samples, 7.34%) +<indexmap:.. -do_user_addr_fault (1 samples, 0.47%) - +<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (30 samples, 13.95%) -jsonpath_lib::selecto.. +core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.56%) + -hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) + -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.56%) + -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 3.72%) -<all.. +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 2.26%) +j.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.40%) - +alloc::alloc::exchange_malloc (1 samples, 0.56%) + -hashbrown::map::make_hash (1 samples, 0.47%) - +hashbrown::map::HashMap<K,V,S,A>::contains_key (6 samples, 3.39%) +has.. -core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.47%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) + -alloc::alloc::box_free (2 samples, 0.93%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (5 samples, 2.82%) +<a.. -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (6 samples, 2.79%) -al.. +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.13%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +main (168 samples, 94.92%) +main -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.47%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (36 samples, 20.34%) +jsonpath_lib::selector::terms::.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (22 samples, 10.23%) -core::cmp::impl.. +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 4.52%) +core:.. -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.47%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.69%) + -jsonpath_lib::paths::path_parser::PathParser::parse (112 samples, 52.09%) -jsonpath_lib::paths::path_parser::PathParser::parse +core::option::Option<T>::unwrap (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.40%) - +core::num::<impl u64>::rotate_left (1 samples, 0.56%) + -jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.47%) - +alloc::vec::Vec<T,A>::extend_desugared (4 samples, 2.26%) +a.. -jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) - +alloc::alloc::alloc (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 0.93%) - +std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (1 samples, 0.56%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) - +hashbrown::raw::inner::RawTable<T,A>::find (6 samples, 3.39%) +has.. -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +int_free (1 samples, 0.56%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 0.93%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) +<.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 0.93%) - +all (177 samples, 100%) + -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.47%) - +core::hash::Hasher::write_usize (2 samples, 1.13%) + -jsonpath_lib::paths::str_reader::StrReader::take_while (4 samples, 1.86%) -j.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (26 samples, 14.69%) +<indexmap::map::IndexM.. -core::iter::traits::iterator::Iterator::all (15 samples, 6.98%) -core::ite.. +hashbrown::map::HashMap<K,V,S,A>::get_inner (6 samples, 3.39%) +has.. -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (167 samples, 94.35%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.47%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 2.26%) +<.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) - +alloc::alloc::Global::alloc_impl (1 samples, 0.56%) + -core::ptr::read (1 samples, 0.47%) - +alloc::vec::Vec<T,A>::reserve (2 samples, 1.13%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) + -_rust_dealloc (1 samples, 0.47%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.69%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (16 samples, 7.44%) -core::cmp:.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.69%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 0.93%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.69%) + -core::ptr::write (2 samples, 0.93%) - +jsonpath_lib_be (170 samples, 96.05%) +jsonpath_lib_be -jsonpath_lib::paths::str_reader::StrReader::next_char (2 samples, 0.93%) - +core::iter::traits::iterator::Iterator::try_fold (26 samples, 14.69%) +core::iter::traits::it.. -IO_new_fopen (1 samples, 0.47%) - +_libc_start_main (168 samples, 94.92%) +_libc_start_main -std::rt::lang_start_internal::{{closure}} (206 samples, 95.81%) -std::rt::lang_start_internal::{{closure}} +_GI___libc_free (1 samples, 0.56%) + -core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>>> (8 samples, 3.72%) -core.. +jsonpath_lib::paths::path_parser::ParserImpl::paths (3 samples, 1.69%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (6 samples, 2.79%) -ha.. +<f64 as core::ops::arith::Mul>::mul (1 samples, 0.56%) + -load_elf_binary (1 samples, 0.47%) - +_sigaltstack (1 samples, 0.56%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 1.86%) -<.. +std::rt::lang_start_internal (168 samples, 94.92%) +std::rt::lang_start_internal -hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.93%) - +_GI___libc_malloc (1 samples, 0.56%) + -alloc::alloc::Global::grow_impl (3 samples, 1.40%) - +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.56%) + -hashbrown::raw::RawTableInner<A>::prepare_insert_slot (6 samples, 2.79%) -ha.. +alloc::alloc::Global::alloc_impl (1 samples, 0.56%) + -core::num::<impl usize>::overflowing_add (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 0.93%) - +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.69%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 1.86%) -c.. +entry_SYSCALL_64_after_hwframe (7 samples, 3.95%) +entr.. -link_path_wal.ar. (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (3 samples, 1.69%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +strlcpy (7 samples, 3.95%) +strl.. -hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (30 samples, 13.95%) -core::iter::traits::i.. +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.56%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (4 samples, 1.86%) -a.. +jsonpath_lib::paths::path_parser::ParserImpl::paths (36 samples, 20.34%) +jsonpath_lib::paths::path_parse.. -jsonpath_lib::selector::terms::ExprTerm::lt (8 samples, 3.72%) -json.. +jsonpath_lib::paths::tokenizer::TokenReader::read_value (1 samples, 0.56%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.47%) - +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 1.86%) -a.. +std::rt::lang_start::{{closure}} (167 samples, 94.35%) +std::rt::lang_start::{{closure}} -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.69%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) - +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.56%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (7 samples, 3.26%) -cor.. +core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::expr (18 samples, 8.37%) -jsonpath_li.. +int_free (2 samples, 1.13%) + -indexmap::map::IndexMap<K,V,S>::hash (6 samples, 2.79%) -in.. +core::ptr::write (1 samples, 0.56%) + -hashbrown::raw::RawTableInner<A>::prepare_resize (2 samples, 0.93%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.56%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) - +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.56%) + -_memcmp_avx2_movbe (1 samples, 0.47%) - +alloc::raw_vec::finish_grow (1 samples, 0.56%) + -core::num::<impl u64>::wrapping_add (1 samples, 0.47%) - +alloc::alloc::box_free (2 samples, 1.13%) + -std::panicking::try (206 samples, 95.81%) -std::panicking::try +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.47%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.56%) + -core::option::Option<T>::map_or (3 samples, 1.40%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.56%) + -jsonpath_lib::paths::str_reader::StrReader::peek (2 samples, 0.93%) - +jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (6 samples, 3.39%) +jso.. -jsonpath_lib::selector::terms::FilterTerms::pop_term (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get (13 samples, 7.34%) +indexmap::.. -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (7 samples, 3.95%) +json.. -<alloc::alloc::Global as core::alloc::Allocator>::grow (3 samples, 1.40%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (7 samples, 3.26%) -cor.. +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) + -core::option::Option<T>::map_or (3 samples, 1.40%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (5 samples, 2.82%) +co.. -jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.47%) - +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::all::check::{{closure}} (15 samples, 6.98%) -core::ite.. +jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (5 samples, 2.82%) +js.. -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_span (1 samples, 0.56%) + -<alloc::string::String as core::cmp::PartialEq>::eq (2 samples, 0.93%) - +alloc::alloc::realloc (1 samples, 0.56%) + -_memcmp_avx2_movbe (1 samples, 0.47%) - +core::num::dec2flt::dec2flt (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::expr (12 samples, 5.58%) -jsonpat.. +<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (14 samples, 7.91%) +<jsonpath_l.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (8 samples, 3.72%) -core.. +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (8 samples, 4.52%) +core:.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.40%) - +core::str::validations::next_code_point (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::Tokenizer::and (1 samples, 0.47%) - +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (14 samples, 7.91%) +<jsonpath_l.. -jsonpath_lib::select (204 samples, 94.88%) -jsonpath_lib::select +_GI___libc_malloc (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::reserve (6 samples, 2.79%) -al.. +indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.82%) +in.. -jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (60 samples, 27.91%) -jsonpath_lib::selector::selector_impl::JsonS.. +jsonpath_lib_benches::main::{{closure}} (167 samples, 94.35%) +jsonpath_lib_benches::main::{{closure}} -indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.93%) - +alloc::alloc::Global::alloc_impl (1 samples, 0.56%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (5 samples, 2.33%) -c.. +alloc::vec::Vec<T,A>::push (3 samples, 1.69%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (21 samples, 9.77%) -<indexmap::map.. +core::iter::traits::iterator::Iterator::collect (7 samples, 3.95%) +core.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +core::ops::function::FnOnce::call_once (167 samples, 94.35%) +core::ops::function::FnOnce::call_once -indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.93%) - +core::hash::Hasher::write_u8 (2 samples, 1.13%) + -core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.47%) - +handle_mm_fault (1 samples, 0.56%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.40%) - +alloc::raw_vec::finish_grow (2 samples, 1.13%) + -indexmap::map::core::equivalent::{{closure}} (1 samples, 0.47%) - +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.56%) + -core::num::<impl u64>::rotate_left (2 samples, 0.93%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (2 samples, 1.13%) + -jsonpath_lib::paths::path_parser::ParserImpl::array (39 samples, 18.14%) -jsonpath_lib::paths::path_pa.. +<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.56%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (4 samples, 1.86%) -i.. +jsonpath_lib::paths::tokenizer::Tokenizer::little (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) - +std::panicking::try::do_call (168 samples, 94.92%) +std::panicking::try::do_call -jsonpath_lib::paths::path_parser::ParserImpl::new (37 samples, 17.21%) -jsonpath_lib::paths::path_.. +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (7 samples, 3.26%) -<Q .. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.40%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (9 samples, 5.08%) +core::.. -<alloc::string::String as core::cmp::PartialEq>::eq (7 samples, 3.26%) -<al.. +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) + -_do_execve_fil.sr. (7 samples, 3.26%) -_do.. +hashbrown::raw::RawTable<T,A>::get (4 samples, 2.26%) +h.. -indexmap::map::IndexMap<K,V,S>::contains_key (9 samples, 4.19%) -inde.. +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.13%) + -exc_page_fault (1 samples, 0.47%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.40%) - +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) + -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.13%) + -core::slice::<impl [T]>::last (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::get_mut (1 samples, 0.56%) + -hashbrown::raw::RawTable<T,A>::find (1 samples, 0.47%) - +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (36 samples, 20.34%) +<core::iter::adapters::enumerat.. -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) - +alloc::alloc::box_free (1 samples, 0.56%) + -alloc::boxed::Box<T>::new (4 samples, 1.86%) -a.. +std::sys::unix::thread::guard::init (1 samples, 0.56%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.93%) - +indexmap::map::core::equivalent::{{closure}} (9 samples, 5.08%) +indexm.. -IO_new_file_fopen (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 1.13%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 0.93%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (15 samples, 8.47%) +serde_json::.. -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.33%) -<.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.13%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.56%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (2 samples, 0.93%) - +hashbrown::raw::RawTableInner<A>::find_insert_slot (1 samples, 0.56%) + -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.56%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.56%) + -_fopen_internal (1 samples, 0.47%) - +core::hash::sip::u8to64_le (1 samples, 0.56%) + -_memmove_avx_unaligned_erms (2 samples, 0.93%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 4.52%) +core:.. -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) - +core::ptr::drop_in_place<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<&serde_json::value::Value,alloc::alloc::Global>> (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::op (5 samples, 2.33%) -j.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 1.13%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) - +hashbrown::raw::RawTableInner<A>::new_uninitialized (1 samples, 0.56%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 1.86%) -j.. +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (7 samples, 3.95%) +<all.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) - +alloc::alloc::dealloc (1 samples, 0.56%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (17 samples, 7.91%) -jsonpath_li.. +core::ptr::drop_in_place<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>> (9 samples, 5.08%) +core::.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (3 samples, 1.69%) + -core::core_arch::simd::i8x16::new (1 samples, 0.47%) - +core::ptr::drop_in_place<jsonpath_lib::paths::tokens::ParseToken> (1 samples, 0.56%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.40%) - +int_malloc (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get (12 samples, 5.58%) -indexma.. +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.13%) + -alloc::alloc::dealloc (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.69%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (15 samples, 6.98%) -<indexmap.. +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) -<.. +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) + -jsonpath_lib::selector::utils::to_path_str (1 samples, 0.47%) - +alloc::vec::Vec<T,A>::reserve (1 samples, 0.56%) + -core::ptr::drop_in_place<jsonpath_lib::selector::terms::ExprTerm> (1 samples, 0.47%) - +_GI___libc_realloc (1 samples, 0.56%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (30 samples, 13.95%) -<core::iter::adapters.. +core::num::<impl usize>::overflowing_add (1 samples, 0.56%) + -_memcmp_avx2_movbe (1 samples, 0.47%) - +alloc::vec::Vec<T,A>::push (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.93%) - +jsonpath_lib::paths::path_parser::PathParser::compile (38 samples, 21.47%) +jsonpath_lib::paths::path_parser:.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) - +jsonpath_lib::paths::str_reader::StrReader::read (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::fold (30 samples, 13.95%) -core::iter::traits::i.. +core::str::traits::<impl core::cmp::PartialEq for str>::eq (8 samples, 4.52%) +core:.. -int_realloc (3 samples, 1.40%) - +core::ptr::drop_in_place<alloc::vec::into_iter::IntoIter<&serde_json::value::Value>> (1 samples, 0.56%) + -_GI___libc_free (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) + -exec_binprm (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) - +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 1.86%) -h.. +hashbrown::map::make_insert_hash (3 samples, 1.69%) + -_GI___libc_malloc (1 samples, 0.47%) - +core::hash::sip::u8to64_le (2 samples, 1.13%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 0.93%) - +core::num::<impl u64>::rotate_left (2 samples, 1.13%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.40%) - +<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_array_eof (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.13%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (11 samples, 5.12%) -jsonpa.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.13%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 3.72%) -core.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.69%) + -indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.33%) -i.. +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (19 samples, 10.73%) +jsonpath_lib::p.. -<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (16 samples, 7.44%) -<jsonpath_.. +hashbrown::raw::RawTableInner<A>::prepare_resize (1 samples, 0.56%) + -std::panic::catch_unwind (205 samples, 95.35%) -std::panic::catch_unwind +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.69%) + -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) - +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.56%) + -do_filp_open (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (36 samples, 20.34%) +core::iter::traits::iterator::I.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.13%) + -core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (3 samples, 1.40%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (27 samples, 15.25%) +jsonpath_lib::selector:.. -jsonpath_lib::selector::utils::to_path_str (1 samples, 0.47%) - +alloc::boxed::Box<T>::new (2 samples, 1.13%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (30 samples, 13.95%) -jsonpath_lib::selecto.. +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (115 samples, 64.97%) +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit -jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (5 samples, 2.33%) -j.. +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.13%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -core::core_arch::simd::i8x16::new (1 samples, 0.47%) - +_do_execve_fil.sr. (7 samples, 3.95%) +_do_.. -core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.47%) - +_x86_indirect_thunk_rax (1 samples, 0.56%) + -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.47%) - +asm_exc_page_fault (1 samples, 0.56%) + -hashbrown::raw::sse2::Group::match_byte (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.47%) - +std::collections::hash::set::HashSet<T,S>::insert (13 samples, 7.34%) +std::colle.. -alloc::vec::Vec<T,A>::push (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -jsonpath_lib_be (208 samples, 96.74%) -jsonpath_lib_be +mprotect_fixup (1 samples, 0.56%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.40%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.39%) +cor.. -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (3 samples, 1.69%) + -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (205 samples, 95.35%) -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.13%) + -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) - +asm_exc_page_fault (1 samples, 0.56%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.47%) - +alloc::slice::<impl [T]>::to_vec (1 samples, 0.56%) + -_GI___libc_free (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.69%) + -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 1.13%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (38 samples, 21.47%) +jsonpath_lib::selector::terms::Fi.. -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (115 samples, 64.97%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8 samples, 3.72%) -<all.. +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) + -hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.47%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) + -alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (31 samples, 17.51%) +jsonpath_lib::paths::path_p.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.69%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 3.72%) -json.. +_memcmp_avx2_movbe (2 samples, 1.13%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.40%) - +hashbrown::map::make_hasher::{{closure}} (1 samples, 0.56%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::insert (8 samples, 4.52%) +hashb.. -<alloc::alloc::Global as core::alloc::Allocator>::allocate (4 samples, 1.86%) -<.. +alloc::alloc::alloc (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::compute_absolute_path_filter (1 samples, 0.47%) - +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (26 samples, 14.69%) +<serde_json::map::Map<.. -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.93%) - +core::iter::traits::iterator::Iterator::collect (5 samples, 2.82%) +co.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) - +std::panic::catch_unwind (168 samples, 94.92%) +std::panic::catch_unwind -start (207 samples, 96.28%) -start +jsonpath_lib::paths::tokenizer::Tokenizer::greater (1 samples, 0.56%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (8 samples, 3.72%) -<all.. +exc_page_fault (1 samples, 0.56%) + -strlen (7 samples, 3.26%) -str.. +alloc::alloc::dealloc (2 samples, 1.13%) + -alloc::boxed::Box<T>::new (1 samples, 0.47%) - +hashbrown::map::make_hash (1 samples, 0.56%) + -hashbrown::raw::RawTable<T,A>::resize (12 samples, 5.58%) -hashbro.. +<alloc::string::String as core::hash::Hash>::hash (2 samples, 1.13%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 1.13%) + -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::raw_vec::RawVec<jsonpath_lib::paths::tokens::ParseToken>> (1 samples, 0.56%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) - +core::hash::Hasher::write_usize (1 samples, 0.56%) + -pthread_getattr_np (1 samples, 0.47%) - +core::hash::impls::<impl core::hash::Hash for str>::hash (6 samples, 3.39%) +cor.. -jsonpath_lib_benches::main::{{closure}} (205 samples, 95.35%) -jsonpath_lib_benches::main::{{closure}} +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.69%) + -hashbrown::raw::RawTable<T,A>::reserve (12 samples, 5.58%) -hashbro.. +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.56%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 1.86%) -<.. +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (14 samples, 7.91%) +core::cmp::.. -core::num::dec2flt::parse::parse_number (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) + -std::panicking::try::do_call (205 samples, 95.35%) -std::panicking::try::do_call +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -std::panicking::try (205 samples, 95.35%) -std::panicking::try +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) + -alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) - +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::PathParser::compile (82 samples, 38.14%) -jsonpath_lib::paths::path_parser::PathParser::compile +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) + -flush_tlb_mm_range (1 samples, 0.47%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (16 samples, 9.04%) +indexmap::map.. -std::collections::hash::set::HashSet<T,S>::insert (17 samples, 7.91%) -std::collec.. +core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.56%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) - +alloc::alloc::Global::alloc_impl (2 samples, 1.13%) + -int_free (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (4 samples, 2.26%) +j.. -core::intrinsics::copy (14 samples, 6.51%) -core::in.. +alloc::slice::hack::to_vec (1 samples, 0.56%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -core::hash::sip::Hasher<S>::reset (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 1.13%) + -hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.47%) - +alloc::alloc::alloc (2 samples, 1.13%) + -alloc::alloc::Global::alloc_impl (4 samples, 1.86%) -a.. +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (36 samples, 20.34%) +<core::iter::adapters::enumerat.. -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.56%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (6 samples, 3.39%) +<st.. -std::thread::local::LocalKey<T>::try_with (1 samples, 0.47%) - +alloc::slice::<impl [T]>::to_vec (1 samples, 0.56%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.47%) - +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (13 samples, 7.34%) +<serde_jso.. -alloc::raw_vec::RawVec<T,A>::reserve (6 samples, 2.79%) -al.. +<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -_do_execve_fil.sr. (1 samples, 0.47%) - +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (8 samples, 3.72%) -json.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (13 samples, 7.34%) +<indexmap:.. -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) -<.. +indexmap::map::IndexMap<K,V,S>::hash (9 samples, 5.08%) +indexm.. -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.47%) - +core::core_arch::simd::i8x16::new (2 samples, 1.13%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -std::panic::catch_unwind (206 samples, 95.81%) -std::panic::catch_unwind +jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.56%) + -indexmap::map::core::equivalent::{{closure}} (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (26 samples, 14.69%) +indexmap::map::IndexMa.. -hashbrown::raw::RawTable<T,A>::new_in (2 samples, 0.93%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (1 samples, 0.56%) + -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 3.72%) -<all.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) + -indexmap::map::core::equivalent::{{closure}} (8 samples, 3.72%) -inde.. +core::hash::Hasher::write_u8 (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::try_fold (15 samples, 6.98%) -core::ite.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.13%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (3 samples, 1.40%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::path_in_key (1 samples, 0.56%) + -<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (3 samples, 1.40%) - +core::iter::traits::iterator::Iterator::for_each (36 samples, 20.34%) +core::iter::traits::iterator::I.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.13%) + -hashbrown::raw::TableLayout::calculate_layout_for (1 samples, 0.47%) - +rtld_timer_start (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 0.93%) - +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.13%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.56%) + -alloc::alloc::dealloc (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::exprs (19 samples, 8.84%) -jsonpath_lib.. +alloc::alloc::alloc (1 samples, 0.56%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) + -<jsonpath_lib::paths::tokens::ParseToken as core::clone::Clone>::clone (1 samples, 0.47%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (8 samples, 4.52%) +core:.. -hashbrown::map::make_hash (2 samples, 0.93%) - +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) + -<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (8 samples, 3.72%) -<all.. +std::panicking::try::do_call (167 samples, 94.35%) +std::panicking::try::do_call -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (1 samples, 0.56%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 4.52%) +jsonp.. -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -std::collections::hash::set::HashSet<T,S>::contains (2 samples, 0.93%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths (6 samples, 3.39%) +jso.. -jsonpath_lib::paths::tokenizer::TokenReader::next_token (3 samples, 1.40%) - +core::result::Result<T,E>::map_err (1 samples, 0.56%) + -int_malloc (4 samples, 1.86%) -i.. +core::option::Option<T>::get_or_insert_with (4 samples, 2.26%) +c.. -alloc::vec::Vec<T,A>::as_ptr (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::all::check::{{closure}} (13 samples, 7.34%) +core::iter.. -core::slice::<impl [T]>::first (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) + -alloc::alloc::alloc (4 samples, 1.86%) -a.. +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) + -jsonpath_lib::selector::terms::ExprTerm::or (23 samples, 10.70%) -jsonpath_lib::s.. +jsonpath_lib::selector::terms::FilterTerms::push_json_term (38 samples, 21.47%) +jsonpath_lib::selector::terms::Fi.. -jsonpath_lib::paths::path_parser::ParserImpl::compile (45 samples, 20.93%) -jsonpath_lib::paths::path_parser.. +<hashbrown::raw::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.47%) - +alloc::alloc::exchange_malloc (1 samples, 0.56%) + -<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (3 samples, 1.40%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.40%) - +std::sys_common::rt::init (1 samples, 0.56%) + -hashbrown::map::HashMap<K,V,S,A>::get_inner (2 samples, 0.93%) - +jsonpath_lib::paths::path_parser::ParserImpl::array_start (32 samples, 18.08%) +jsonpath_lib::paths::path_pa.. -std::sys::unix::thread::guard::get_stack_start (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (4 samples, 2.26%) +j.. -core::hash::Hasher::write_u8 (2 samples, 0.93%) - +hashbrown::raw::TableLayout::calculate_layout_for (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::op (9 samples, 4.19%) -json.. +int_free (1 samples, 0.56%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 3.72%) -<all.. +core::core_arch::simd::i8x16::new (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.33%) -a.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 3.72%) -json.. +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.47%) - +int_free (1 samples, 0.56%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -alloc::alloc::realloc (3 samples, 1.40%) - +indexmap::map::IndexMap<K,V,S>::get (26 samples, 14.69%) +indexmap::map::IndexMa.. -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) - +exec_binprm (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) + -std::collections::hash::set::HashSet<T>::new (3 samples, 1.40%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (37 samples, 20.90%) +jsonpath_lib::selector::terms::F.. -_x64_sys_execve (7 samples, 3.26%) -_x6.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (4 samples, 2.26%) +j.. -std::rt::lang_start_internal (206 samples, 95.81%) -std::rt::lang_start_internal +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.56%) + -_memcmp_avx2_movbe (3 samples, 1.40%) - +core::core_arch::simd::i8x16::new (1 samples, 0.56%) + -hashbrown::map::make_hasher::{{closure}} (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::PathParser::parse (115 samples, 64.97%) +jsonpath_lib::paths::path_parser::PathParser::parse -hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.47%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.56%) + -change_protection (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::json_path (37 samples, 20.90%) +jsonpath_lib::paths::path_parser.. -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +core::num::dec2flt::number::Number::try_fast_path (1 samples, 0.56%) + -core::str::validations::next_code_point (2 samples, 0.93%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.47%) - +core::ptr::drop_in_place<core::option::Option<alloc::vec::Vec<&serde_json::value::Value>>> (1 samples, 0.56%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.47%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (7 samples, 3.95%) +core.. -jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 1.86%) -j.. +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.56%) + -indexmap::map::core::equivalent::{{closure}} (2 samples, 0.93%) - +<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (27 samples, 15.25%) +<jsonpath_lib::selector.. -std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.47%) - +start (169 samples, 95.48%) +start -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.47%) - +do_fault (1 samples, 0.56%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) +<.. -exec_binprm (7 samples, 3.26%) -exe.. +core::str::<impl str>::is_char_boundary (1 samples, 0.56%) + -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.47%) - +_do_execve_fil.sr. (1 samples, 0.56%) + -std::sys::unix::thread::guard::init (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.13%) + -_GI___libc_malloc (4 samples, 1.86%) -_.. +alloc::slice::hack::to_vec (1 samples, 0.56%) + -<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (6 samples, 3.39%) +<co.. -core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.47%) - +_memcmp_avx2_movbe (1 samples, 0.56%) + -alloc::alloc::dealloc (1 samples, 0.47%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (7 samples, 3.95%) +<all.. -asm_exc_page_fault (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (15 samples, 8.47%) +indexmap::ma.. -core::iter::traits::iterator::Iterator::fold (205 samples, 95.35%) -core::iter::traits::iterator::Iterator::fold +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.93%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -core::num::<impl u64>::wrapping_add (1 samples, 0.47%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (14 samples, 7.91%) +<serde_json.. -std::panicking::try::do_call (206 samples, 95.81%) -std::panicking::try::do_call +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) +<.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 2.79%) -in.. +std::collections::hash::set::HashSet<T,S>::contains (6 samples, 3.39%) +std.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) - +core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.13%) + -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -core::sync::atomic::atomic_load (1 samples, 0.47%) - +exec_binprm (7 samples, 3.95%) +exec.. -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::extend_desugared (8 samples, 3.72%) -allo.. +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::reserve (4 samples, 1.86%) -a.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.56%) + -_GI___libc_realloc (3 samples, 1.40%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (4 samples, 2.26%) +<.. -hashbrown::raw::RawTableInner<A>::new_uninitialized (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.13%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +jsonpath_lib::selector::terms::FilterTerms::filter (38 samples, 21.47%) +jsonpath_lib::selector::terms::Fi.. -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) - +jsonpath_lib::selector::terms::ExprTerm::and (15 samples, 8.47%) +jsonpath_lib.. -jsonpath_lib::paths::path_parser::ParserImpl::term (6 samples, 2.79%) -js.. +jsonpath_lib::selector::terms::ExprTerm::cmp (14 samples, 7.91%) +jsonpath_li.. -int_malloc (2 samples, 0.93%) - +hashbrown::raw::RawTable<T,A>::find (4 samples, 2.26%) +h.. -hashbrown::map::make_insert_hash (2 samples, 0.93%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.47%) - +entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + -entry_SYSCALL_64_after_hwframe (1 samples, 0.47%) - +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (9 samples, 5.08%) +core::.. -hashbrown::raw::RawTable<T,A>::insert (14 samples, 6.51%) -hashbrow.. +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.26%) +<.. -core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.47%) - +core::num::<impl u64>::rotate_left (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 0.93%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (6 samples, 2.79%) -al.. +_rdl_dealloc (1 samples, 0.56%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.47%) - +core::hash::sip::u8to64_le (1 samples, 0.56%) + -load_elf_binary (7 samples, 3.26%) -loa.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::push (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.47%) - +tcache_put (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::push (1 samples, 0.47%) - +hashbrown::raw::RawIterHashInner<A>::new (2 samples, 1.13%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (22 samples, 10.23%) -<serde_json::va.. +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 2.26%) +<.. -alloc::alloc::alloc (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.40%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -jsonpath_lib::selector::terms::FilterTerms::filter (40 samples, 18.60%) -jsonpath_lib::selector::terms.. +std::sys::unix::thread::guard::get_stack_start (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::collect (8 samples, 3.72%) -core.. +hashbrown::raw::sse2::Group::match_byte (2 samples, 1.13%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.40%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.69%) + -std::collections::hash::map::RandomState::new (1 samples, 0.47%) - +core::hash::impls::<impl core::hash::Hash for *const T>::hash (2 samples, 1.13%) + -indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.33%) -i.. +<hashbrown::raw::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -flush_tlb_func_commo.onstpro. (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::op (2 samples, 1.13%) + -tcache_put (2 samples, 0.93%) - +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (5 samples, 2.82%) +<a.. -<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.40%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (8 samples, 4.52%) +index.. -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 3.72%) -<all.. +jsonpath_lib::paths::path_parser::ParserImpl::compile (37 samples, 20.90%) +jsonpath_lib::paths::path_parser.. -core::hash::Hasher::write_usize (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) + -core::num::<impl u64>::wrapping_add (2 samples, 0.93%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.69%) + -std::sys_common::rt::init (1 samples, 0.47%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (116 samples, 65.54%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (2 samples, 0.93%) - +core::num::dec2flt::dec2flt (1 samples, 0.56%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (4 samples, 1.86%) -c.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.13%) + -alloc::alloc::exchange_malloc (4 samples, 1.86%) -a.. +core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>>> (9 samples, 5.08%) +core::.. -_memmove_avx_unaligned_erms (14 samples, 6.51%) -_memmove.. +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.69%) + -hashbrown::set::HashSet<T,S,A>::insert (17 samples, 7.91%) -hashbrown::.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) + -_rust_alloc (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::filter (32 samples, 18.08%) +jsonpath_lib::paths::path_pa.. -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (5 samples, 2.33%) -c.. +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.26%) +c.. -std::sys_common::backtrace::_rust_begin_short_backtrace (205 samples, 95.35%) -std::sys_common::backtrace::_rust_begin_short_backtrace +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (7 samples, 3.95%) +core.. -jsonpath_lib::paths::path_parser::ParserImpl::path_in_key (1 samples, 0.47%) - +alloc::alloc::dealloc (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.69%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.93%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.39%) +cor.. -jsonpath_lib::selector::terms::ExprTerm::gt (8 samples, 3.72%) -json.. +dl_start (1 samples, 0.56%) + -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (15 samples, 6.98%) -<serde_js.. +alloc::alloc::dealloc (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::collect (8 samples, 3.72%) -core.. +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.56%) + -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.56%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (4 samples, 1.86%) -<.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.13%) + -alloc::alloc::alloc (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.40%) - +std::sys_common::backtrace::_rust_begin_short_backtrace (167 samples, 94.35%) +std::sys_common::backtrace::_rust_begin_short_backtrace -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.56%) + -core::option::Option<T>::get_or_insert_with (2 samples, 0.93%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::json_path (45 samples, 20.93%) -jsonpath_lib::paths::path_parser.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (5 samples, 2.82%) +co.. -core::iter::traits::iterator::Iterator::all (21 samples, 9.77%) -core::iter::tr.. +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) + -hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.93%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) + -core::num::<impl u64>::rotate_left (1 samples, 0.47%) - +core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::get (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.93%) - +int_malloc (1 samples, 0.56%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.56%) + -mprotect_fixup (1 samples, 0.47%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.13%) + -entry_SYSCALL_64_after_hwframe (7 samples, 3.26%) -ent.. +core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.47%) - +alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.56%) + -elf_get_dynamic_info (1 samples, 0.47%) - +perf (7 samples, 3.95%) +perf -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::reserve (6 samples, 3.39%) +has.. -jsonpath_lib::paths::path_parser::ParserImpl::exprs (36 samples, 16.74%) -jsonpath_lib::paths::path.. +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -core::ptr::drop_in_place<core::result::Result<alloc::vec::Vec<&serde_json::value::Value>,jsonpath_lib::select::JsonPathError>> (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -alloc::alloc::exchange_malloc (1 samples, 0.47%) - +do_syscall_64 (7 samples, 3.95%) +do_s.. -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.47%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::select (112 samples, 52.09%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.56%) + -hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (2 samples, 0.93%) - +core::ptr::drop_in_place<core::option::Option<alloc::vec::Vec<&serde_json::value::Value>>> (1 samples, 0.56%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::get (8 samples, 4.52%) +hashb.. -hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 2.79%) -ha.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) + -core::num::<impl usize>::checked_add (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) + -<alloc::alloc::Global as core::alloc::Allocator>::grow (2 samples, 0.93%) - +jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.56%) + -_GI___libc_realloc (2 samples, 0.93%) - +alloc::alloc::dealloc (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_token (1 samples, 0.47%) - +alloc::alloc::dealloc (1 samples, 0.56%) + -alloc::alloc::realloc (2 samples, 0.93%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.56%) + -core::hash::Hasher::write_usize (1 samples, 0.47%) - +_GI___libc_free (1 samples, 0.56%) + -do_sys_openat2 (1 samples, 0.47%) - +core::option::Option<T>::unwrap (1 samples, 0.56%) + -std::rt::lang_start::{{closure}} (205 samples, 95.35%) -std::rt::lang_start::{{closure}} +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +jsonpath_lib::paths::path_parser::ParserImpl::term (7 samples, 3.95%) +json.. -<std::collections::hash::map::RandomState as core::default::Default>::default (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::all (13 samples, 7.34%) +core::iter.. -alloc::raw_vec::RawVec<T,A>::reserve (4 samples, 1.86%) -a.. +alloc::alloc::Global::grow_impl (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (3 samples, 1.40%) - +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.56%) + -dl_start_final (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 1.86%) -h.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -<alloc::string::String as core::cmp::PartialEq>::eq (2 samples, 0.93%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.13%) + -setup_arg_pages (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 2.79%) -co.. +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (7 samples, 3.95%) +<all.. -hashbrown::raw::RawTable<T,A>::get_mut (1 samples, 0.47%) - +std::panicking::try (167 samples, 94.35%) +std::panicking::try -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.47%) - +jsonpath_lib::select (167 samples, 94.35%) +jsonpath_lib::select -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 3.72%) -core.. +jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.56%) + -int_realloc (2 samples, 0.93%) - +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) + -int_free (3 samples, 1.40%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -alloc::vec::Vec<T,A>::as_mut_ptr (1 samples, 0.47%) - +hashbrown::map::HashMap<K,V,S,A>::insert (13 samples, 7.34%) +hashbrown:.. -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 2.79%) -co.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) + -core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.47%) - +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.13%) + -indexmap::map::IndexMap<K,V,S>::get (2 samples, 0.93%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::close_token (1 samples, 0.47%) - +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) + -do_wp_page (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::find (1 samples, 0.56%) + -_libc_start_main (206 samples, 95.81%) -_libc_start_main +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) - +core::str::traits::<impl core::ops::index::Index<I> for str>::index (1 samples, 0.56%) + -core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) - +core::hash::Hasher::write_u8 (1 samples, 0.56%) + -jsonpath_lib::selector::terms::FilterTerms::pop_term (1 samples, 0.47%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.69%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) - +alloc::boxed::Box<T>::new (1 samples, 0.56%) + -_GI__IO_file_open (1 samples, 0.47%) - +jsonpath_lib::selector::selector_impl::JsonSelector::new (1 samples, 0.56%) + -_GI___libc_malloc (1 samples, 0.47%) - +core::hash::Hasher::write_u8 (2 samples, 1.13%) + -do_syscall_64 (1 samples, 0.47%) - +alloc::alloc::dealloc (1 samples, 0.56%) + -int_malloc (1 samples, 0.47%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.13%) + -tcache_get (1 samples, 0.47%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) + -std::thread::local::LocalKey<T>::with (1 samples, 0.47%) - +<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.56%) + -<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.40%) - +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 1.13%) + -jsonpath_lib::paths::tokenizer::Tokenizer::other (4 samples, 1.86%) -j.. +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.13%) + -dl_start (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>> (8 samples, 3.72%) -core.. +core::str::<impl str>::parse (1 samples, 0.56%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 1.86%) -j.. +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.93%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.39%) +cor.. -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (7 samples, 3.26%) -<[A.. +_memcmp_avx2_movbe (5 samples, 2.82%) +_m.. -jsonpath_lib::paths::path_parser::ParserImpl::paths (4 samples, 1.86%) -j.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) + -alloc::alloc::dealloc (3 samples, 1.40%) - +indexmap::map::IndexMap<K,V,S>::contains_key (15 samples, 8.47%) +indexmap::ma.. -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.93%) - +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (110 samples, 62.15%) +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHand.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 2.79%) -co.. +_GI___libc_malloc (2 samples, 1.13%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.93%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 3.39%) +ind.. -alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) - +_memcmp_avx2_movbe (1 samples, 0.56%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.13%) + -alloc::vec::Vec<T,A>::insert (23 samples, 10.70%) -alloc::vec::Vec.. +alloc::boxed::Box<T>::new (1 samples, 0.56%) + -core::iter::traits::iterator::Iterator::for_each (205 samples, 95.35%) -core::iter::traits::iterator::Iterator::for_each +_rust_alloc (1 samples, 0.56%) + -flush_tlb_mm_range (1 samples, 0.47%) - +int_realloc (1 samples, 0.56%) + -hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.47%) - +core::num::dec2flt::number::Number::try_fast_path (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::find (12 samples, 5.58%) -hashbro.. +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.56%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.86%) -<.. +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.56%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.47%) - +alloc::alloc::alloc (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get (18 samples, 8.37%) -indexmap::m.. +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -hashbrown::raw::inner::RawTable<T,A>::get (4 samples, 1.86%) -h.. +_x64_sys_execve (1 samples, 0.56%) + -dl_main (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (23 samples, 10.70%) -<jsonpath_lib::.. +alloc::alloc::Global::alloc_impl (1 samples, 0.56%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.13%) + -ptep_clear_flush (1 samples, 0.47%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.56%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (46 samples, 21.40%) -jsonpath_lib::selector::selector_.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.56%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) + -core::ptr::read (1 samples, 0.47%) - +core::hash::sip::u8to64_le (1 samples, 0.56%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (39 samples, 18.14%) -jsonpath_lib::selector::term.. +core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index (1 samples, 0.56%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) + -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (112 samples, 52.09%) -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit +jsonpath_lib::paths::path_parser::ParserImpl::array (32 samples, 18.08%) +jsonpath_lib::paths::path_pa.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 2.79%) -co.. +core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 1.13%) + -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) - +<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) + -jsonpath_lib::selector::terms::FilterTerms::push_json_term (40 samples, 18.60%) -jsonpath_lib::selector::terms.. +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.13%) + -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.47%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.13%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.47%) - +tcache_get (1 samples, 0.56%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.13%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.47%) - +do_user_addr_fault (1 samples, 0.56%) + -core::ptr::write (1 samples, 0.47%) - +hashbrown::raw::RawTable<T,A>::reserve_rehash (6 samples, 3.39%) +has.. -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.47%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (13 samples, 7.34%) +indexmap::.. -indexmap::map::IndexMap<K,V,S>::get_index_of (12 samples, 5.58%) -indexma.. +core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 3.39%) +has.. -alloc::alloc::Global::grow_impl (2 samples, 0.93%) - +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (35 samples, 19.77%) +jsonpath_lib::selector::value_.. -alloc::alloc::exchange_malloc (1 samples, 0.47%) - +core::iter::traits::iterator::Iterator::fold (167 samples, 94.35%) +core::iter::traits::iterator::Iterator::fold -core::ptr::read (1 samples, 0.47%) - +_GI___libc_free (1 samples, 0.56%) + -core::num::<impl u64>::wrapping_add (1 samples, 0.47%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.13%) + -all (215 samples, 100%) - +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (16 samples, 9.04%) +hashbrown::ra.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (6 samples, 3.39%) +<co.. + + +core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.13%) + + + +core::iter::traits::iterator::Iterator::for_each (167 samples, 94.35%) +core::iter::traits::iterator::Iterator::for_each + + +<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (9 samples, 5.08%) +<alloc.. + + +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.13%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (1 samples, 0.56%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.69%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.13%) + + + +<alloc::string::String as core::hash::Hash>::hash (4 samples, 2.26%) +<.. + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (3 samples, 1.69%) + + + +<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.56%) + + + +hashbrown::raw::RawTable<T,A>::iter_hash (2 samples, 1.13%) + -hashbrown::map::HashMap<K,V,S,A>::insert (17 samples, 7.91%) -hashbrown::.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.13%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (8 samples, 3.72%) -core.. +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.13%) + -<alloc::string::String as core::hash::Hash>::hash (1 samples, 0.47%) - +alloc::alloc::dealloc (2 samples, 1.13%) + -begin_new_exec (7 samples, 3.26%) -beg.. +_GI___libc_malloc (2 samples, 1.13%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (12 samples, 5.58%) -indexma.. +_rust_alloc (1 samples, 0.56%) + -core::ops::function::FnOnce::call_once (205 samples, 95.35%) -core::ops::function::FnOnce::call_once +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.47%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (27 samples, 15.25%) +<serde_json::value::Val.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) + -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (111 samples, 51.63%) -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handler.. +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.13%) + -dl_sysdep_start (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>> (8 samples, 3.72%) -core.. +<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.69%) + -int_free (1 samples, 0.47%) - +hashbrown::raw::RawIterHash<T,A>::new (2 samples, 1.13%) + -hashbrown::raw::RawTableInner<A>::fallible_with_capacity (1 samples, 0.47%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) + -cpumask_any_but (1 samples, 0.47%) - +hashbrown::raw::inner::RawTable<T,A>::find (7 samples, 3.95%) +hash.. -_handle_mm_fault (1 samples, 0.47%) - +core::num::<impl u64>::rotate_left (1 samples, 0.56%) + -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.47%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (8 samples, 4.52%) +core:.. -alloc::raw_vec::finish_grow (4 samples, 1.86%) -a.. +_memmove_avx_unaligned_erms (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.40%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (5 samples, 2.33%) -c.. +indexmap::map::IndexMap<K,V,S>::hash (10 samples, 5.65%) +indexma.. -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.47%) - +do_syscall_64 (1 samples, 0.56%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>> (9 samples, 5.08%) +core::.. + + +jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 2.26%) +j.. + + +jsonpath_lib::paths::tokens::Token::reset_span (1 samples, 0.56%) + + + +alloc::alloc::dealloc (1 samples, 0.56%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.47%) - +jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.56%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.47%) - +alloc::alloc::exchange_malloc (2 samples, 1.13%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (7 samples, 3.26%) -cor.. +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.69%) + -jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.40%) - +jsonpath_lib::paths::path_parser::ParserImpl::key (1 samples, 0.56%) + -<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.47%) - +alloc::alloc::box_free (2 samples, 1.13%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.47%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (2 samples, 1.13%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.47%) - +jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 0.93%) - +std::rt::lang_start_internal::{{closure}} (168 samples, 94.92%) +std::rt::lang_start_internal::{{closure}} -jsonpath_lib::paths::path_parser::ParserImpl::filter (36 samples, 16.74%) -jsonpath_lib::paths::path.. +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 1.13%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (3 samples, 1.40%) - +core::result::Result<T,E>::map_err (1 samples, 0.56%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 2.79%) -co.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.69%) + -do_sys_open (1 samples, 0.47%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) +<.. -alloc::vec::Vec<T,A>::pop (1 samples, 0.47%) - +jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.56%) + -jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (19 samples, 8.84%) -jsonpath_lib.. +hashbrown::raw::RawTable<T,A>::resize (5 samples, 2.82%) +ha.. -<alloc::string::String as core::hash::Hash>::hash (2 samples, 0.93%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.56%) + -hashbrown::map::HashMap<K,V,S,A>::contains_key (2 samples, 0.93%) - +jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (1 samples, 0.56%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (18 samples, 8.37%) -indexmap::m.. +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (5 samples, 2.82%) +co.. -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.47%) - +alloc::vec::Vec<T,A>::extend_desugared (4 samples, 2.26%) +a.. -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.40%) - +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.56%) + -hashbrown::raw::sse2::Group::match_empty_or_deleted (2 samples, 0.93%) - +int_malloc (1 samples, 0.56%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.40%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (27 samples, 15.25%) +core::cmp::impls::<impl.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +jsonpath_lib::selector::terms::ExprTerm::or (27 samples, 15.25%) +jsonpath_lib::selector:.. -core::num::<impl usize>::checked_add (1 samples, 0.47%) - +jsonpath_lib::selector::terms::ExprTerm::lt (7 samples, 3.95%) +json.. -core::iter::traits::iterator::Iterator::for_each (30 samples, 13.95%) -core::iter::traits::i.. +core::iter::traits::iterator::Iterator::all::check::{{closure}} (26 samples, 14.69%) +core::iter::traits::it.. -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (4 samples, 1.86%) -c.. +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.56%) + -jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (5 samples, 2.33%) -j.. +core::iter::traits::iterator::Iterator::fold (36 samples, 20.34%) +core::iter::traits::iterator::I.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.47%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) + -handle_mm_fault (1 samples, 0.47%) - +<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.47%) - +jsonpath_lib::paths::str_reader::StrReader::peek_char (1 samples, 0.56%) + -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (205 samples, 95.35%) -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) + -hashbrown::raw::RawTableInner<A>::new_in (2 samples, 0.93%) - +indexmap::map::core::equivalent::{{closure}} (3 samples, 1.69%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.86%) -<.. +jsonpath_lib::paths::path_parser::PathParser::parse::{{closure}} (1 samples, 0.56%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 0.93%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.56%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 0.93%) - +setup_arg_pages (1 samples, 0.56%) + + + +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (167 samples, 94.35%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once + + +hashbrown::map::make_hash (2 samples, 1.13%) + + + +load_elf_binary (1 samples, 0.56%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.93%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.13%) + diff --git a/src/paths/tokenizer.rs b/src/paths/tokenizer.rs index 547fb4c9..52fd4030 100644 --- a/src/paths/tokenizer.rs +++ b/src/paths/tokenizer.rs @@ -245,72 +245,54 @@ impl<'a> Tokenizer<'a> { #[derive(Clone, Debug)] pub(super) struct TokenReader<'a> { tokenizer: Tokenizer<'a>, - tokens: Vec<(usize, Token)>, curr_pos: usize, - err: TokenError, + err: Option, + peeked: Option>, } impl<'a> TokenReader<'a> { pub fn new(input: &'a str) -> Self { - let mut tokenizer = Tokenizer::new(input); - let mut tokens = Vec::new(); - loop { - match tokenizer.next_token() { - Ok(mut token) => { - let prev_pos = if let Some((pos, _)) = tokens.get(0) { - *pos - } else { - 0 - }; - - // let new_token = match token { - // Token::SingleQuoted(ref range) | Token::DoubleQuoted(ref range) => { - // token.reset_span(StrRange::new(prev_pos + 1, tokenizer.current_pos() - prev_pos - 2)) - // } - // _ => token.reset_span(StrRange::new(prev_pos, tokenizer.current_pos() - prev_pos)) - // }; - let token = token.reset_span(StrRange::new(prev_pos, tokenizer.current_pos() - prev_pos)); - tokens.insert(0, (tokenizer.current_pos(), token)); - } - Err(err) => { - return TokenReader { - tokenizer, - tokens, - curr_pos: 0, - err, - }; - } - } + TokenReader { + tokenizer: Tokenizer::new(input), + curr_pos: 0, + err: None, + peeked: None, } } - pub fn read_value(&self, span: &StrRange) -> &'a str { - self.tokenizer.read_span(span) + pub fn read_value(&self, str_range: &StrRange) -> &'a str { + self.tokenizer.read_span(str_range) } - pub fn peek_token(&mut self) -> Result<&Token, TokenError> { - match self.tokens.last() { - Some((_, t)) => { - trace!("%{:?}", t); - Ok(t) + pub fn peek_token(&mut self) -> Result<&Token, &TokenError> { + let tokenizer = &mut self.tokenizer; + let prev_pos = self.curr_pos; + let peeked = self.peeked.get_or_insert_with(|| { + let mut token = tokenizer.next_token(); + if let Ok(token) = &mut token { + let token = token.reset_span(StrRange::new(prev_pos, tokenizer.current_pos() - prev_pos)); + return Ok(token); } - _ => { - trace!("%{:?}", self.err); - Err(self.err.clone()) - } - } + token + }); + self.curr_pos = tokenizer.current_pos(); + peeked.as_ref() } pub fn next_token(&mut self) -> Result { - match self.tokens.pop() { - Some((pos, t)) => { - self.curr_pos = pos; - trace!("@{:?}", t); - Ok(t) - } - _ => { - trace!("@{:?}", self.err); - Err(self.err.clone()) + match self.peeked.take() { + Some(v) => v, + None => { + let prev_pos = self.curr_pos; + let tokenizer = &mut self.tokenizer; + let mut token = tokenizer.next_token(); + if let Ok(token) = &mut token { + let current_pos = tokenizer.current_pos(); + let token = token.reset_span(StrRange::new(prev_pos, current_pos - prev_pos)); + self.curr_pos = current_pos; + return Ok(token); + } + token } } } From 241c74aa245bd7350f93ef962d212c94d8d24725 Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 2 Aug 2021 18:20:40 +0900 Subject: [PATCH 13/22] turn off 'deprecated' warning --- src/ffi/mod.rs | 3 +++ src/lib.rs | 13 ++++++++++--- src/parser/mod.rs | 2 ++ src/select/mod.rs | 8 ++++++++ src/selector/terms.rs | 4 ++-- tests/lib.rs | 1 + 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/ffi/mod.rs b/src/ffi/mod.rs index 2ad259b5..813486cd 100644 --- a/src/ffi/mod.rs +++ b/src/ffi/mod.rs @@ -33,6 +33,7 @@ pub extern "C" fn ffi_select(json_str: *const c_char, path: *const c_char) -> *c #[allow(clippy::forget_copy)] pub extern "C" fn ffi_path_compile(path: *const c_char) -> *mut c_void { let path = to_str(path, INVALID_PATH); + #[allow(deprecated)] let ref_node = Box::into_raw(Box::new(parser::Parser::compile(path).unwrap())); let ptr = ref_node as *mut c_void; std::mem::forget(ref_node); @@ -44,11 +45,13 @@ pub extern "C" fn ffi_select_with_compiled_path( path_ptr: *mut c_void, json_ptr: *const c_char, ) -> *const c_char { + #[allow(deprecated)] let node = unsafe { Box::from_raw(path_ptr as *mut parser::Node) }; let json_str = to_str(json_ptr, INVALID_JSON); let json = serde_json::from_str(json_str) .unwrap_or_else(|_| panic!("invalid json string: {}", json_str)); + #[allow(deprecated)] let mut selector = select::Selector::default(); let found = selector.compiled_path(&node).value(&json).select().unwrap(); std::mem::forget(node); diff --git a/src/lib.rs b/src/lib.rs index da371f22..a275c9d6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -130,8 +130,11 @@ extern crate serde_json; use serde_json::Value; +#[allow(deprecated)] use parser::Node; +#[allow(deprecated)] pub use parser::Parser; +#[allow(deprecated)] pub use select::{Selector, SelectorMut}; #[deprecated( @@ -195,9 +198,11 @@ since = "0.2.5", note = "Please use the PathCompiled::compile function instead. It will be removed since 0.4.1" )] pub fn compile(path: &str) -> impl FnMut(&Value) -> Result, JsonPathError> { + #[allow(deprecated)] let node = parser::Parser::compile(path); move |json| match &node { Ok(node) => { + #[allow(deprecated)] let mut selector = Selector::default(); selector.compiled_path(node).value(json).select() } @@ -548,19 +553,21 @@ pub fn replace_with(value: Value, path: &str, fun: &mut F) -> Result Result { + pub fn compile(path: &str) -> Result { let node = parser::Parser::compile(path)?; - Ok(Compiled { + Ok(Self { node }) } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ce618c5b..ae23cfc1 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -79,6 +79,7 @@ pub struct Node { #[deprecated(since = "0.4.0", note = "Please use `paths::PathParser`")] pub struct Parser; +#[allow(deprecated)] impl Parser { pub fn compile(input: &str) -> ParseResult { let mut tokenizer = TokenReader::new(input); @@ -610,6 +611,7 @@ impl Parser { } } +#[allow(deprecated)] pub trait NodeVisitor { fn visit(&mut self, node: &Node) { match &node.token { diff --git a/src/select/mod.rs b/src/select/mod.rs index cf3ca875..1355b7ae 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -330,15 +330,19 @@ impl<'a> FilterTerms<'a> { #[deprecated(since = "0.4.0", note = "Please use `JsonSelector`")] #[derive(Debug, Default)] pub struct Selector<'a, 'b> { + #[allow(deprecated)] node: Option, + #[allow(deprecated)] node_ref: Option<&'b Node>, value: Option<&'a Value>, tokens: Vec, current: Option>, + #[allow(deprecated)] selectors: Vec>, selector_filter: FilterTerms<'a>, } +#[allow(deprecated)] impl<'a, 'b> Selector<'a, 'b> { pub fn new() -> Self { Self::default() @@ -466,6 +470,7 @@ impl<'a, 'b> Selector<'a, 'b> { } } +#[allow(deprecated)] impl<'a, 'b> Selector<'a, 'b> { fn visit_absolute(&mut self) { if self.current.is_some() { @@ -743,6 +748,7 @@ impl<'a, 'b> Selector<'a, 'b> { } } +#[allow(deprecated)] impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { fn visit_token(&mut self, token: &ParseToken) { debug!("token: {:?}, stack: {:?}", token, self.tokens); @@ -780,6 +786,7 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { #[deprecated(since = "0.4.0", note = "Please use `JsonSelectorMut`")] #[derive(Default)] pub struct SelectorMut { + #[allow(deprecated)] path: Option, value: Option, } @@ -839,6 +846,7 @@ fn replace_value Option>( } } +#[allow(deprecated)] impl SelectorMut { pub fn new() -> Self { Self::default() diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 8711c3aa..96f34f7e 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -341,8 +341,8 @@ impl<'a> FilterTerms<'a> { visited.insert(ptr); acc.push(*v) } - } else { - if let Some(set) = not_matched { set.insert(idx); } + } else if let Some(set) = not_matched { + set.insert(idx); } } Value::Array(ay) => { diff --git a/tests/lib.rs b/tests/lib.rs index 60f83524..d2c48cb2 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -36,6 +36,7 @@ fn compile() { }; fn compile_error() { + #[allow(deprecated)] let template = jsonpath::Compiled::compile("$["); assert!(template.is_err()); } From e69449b7ef20020b649a99a46f6027ef4cae8ecb Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 2 Aug 2021 18:46:19 +0900 Subject: [PATCH 14/22] fix clippy --- benchmark/benches/bench.rs | 3 +- benchmark/flame.svg | 2582 ++++++++++++++++----------------- src/lib.rs | 8 +- src/parser/mod.rs | 2 +- src/paths/path_parser.rs | 8 +- src/paths/tokenizer.rs | 2 +- src/select/expr_term.rs | 6 +- src/select/mod.rs | 10 +- src/select/value_walker.rs | 2 +- src/selector/selector_impl.rs | 30 +- src/selector/terms.rs | 12 +- src/selector/utils.rs | 2 +- src/selector/value_walker.rs | 26 +- wasm/src/lib.rs | 47 +- 14 files changed, 1320 insertions(+), 1420 deletions(-) diff --git a/benchmark/benches/bench.rs b/benchmark/benches/bench.rs index 0645e863..bd01c4c1 100644 --- a/benchmark/benches/bench.rs +++ b/benchmark/benches/bench.rs @@ -123,11 +123,10 @@ fn bench_delete(b: &mut Bencher) { fn bench_select_to_compare_with_delete(b: &mut Bencher) { let json = &get_json(); - let parser = Rc::new(Box::new(PathParser::compile(get_path()).unwrap())); + let parser = Rc::new(PathParser::compile(get_path()).unwrap()); b.iter(move || { for _ in 1..100 { - let json = json.clone(); let mut s = JsonSelector::new_ref(Rc::clone(&parser)); let _ = s.value(&json); let r = s.select(); diff --git a/benchmark/flame.svg b/benchmark/flame.svg index 40f29d4a..12e4682a 100644 --- a/benchmark/flame.svg +++ b/benchmark/flame.svg @@ -1,6 +1,6 @@ - + @@ -364,2589 +364,2493 @@ } ]]> - + Flame Graph - + Reset Zoom Search ic - + -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.56%) - +core::core_arch::simd::i8x16::new (3 samples, 1.59%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.56%) - +core::hash::sip::u8to64_le (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.69%) - +_rust_alloc (1 samples, 0.53%) + -_handle_mm_fault (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +jsonpath_lib_benches::main (179 samples, 94.71%) +jsonpath_lib_benches::main -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (8 samples, 4.52%) -core:.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) + -indexmap::map::core::equivalent::{{closure}} (2 samples, 1.13%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.65%) +<a.. -jsonpath_lib::paths::path_parser::ParserImpl::exprs (16 samples, 9.04%) -jsonpath_lib:.. +core::num::<impl u64>::rotate_left (1 samples, 0.53%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (59 samples, 33.33%) -jsonpath_lib::selector::selector_impl::JsonSelector::.. +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.53%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.56%) - +_memmove_avx_unaligned_erms (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -<alloc::string::String as core::cmp::PartialEq>::eq (8 samples, 4.52%) -<allo.. +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.59%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 1.13%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.59%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.13%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) + -core::num::<impl u64>::rotate_left (2 samples, 1.13%) - +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (6 samples, 3.17%) +has.. -jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (45 samples, 25.42%) -jsonpath_lib::selector::selector_impl::J.. +int_free (1 samples, 0.53%) + -change_protection (1 samples, 0.56%) - - - -alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.13%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::expr (7 samples, 3.95%) -json.. - - -core::num::<impl u64>::wrapping_add (1 samples, 0.56%) - +jsonpath_lib::selector::terms::ExprTerm::or (31 samples, 16.40%) +jsonpath_lib::selector::t.. -_x64_sys_execve (7 samples, 3.95%) -_x64.. +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (9 samples, 5.08%) -core::.. +core::option::Option<T>::get_or_insert_with (3 samples, 1.59%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (8 samples, 4.52%) -<[A] .. +indexmap::map::core::equivalent::{{closure}} (10 samples, 5.29%) +indexm.. -begin_new_exec (7 samples, 3.95%) -begi.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (4 samples, 2.26%) -<.. +alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.53%) + -int_free (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 2.26%) -j.. +jsonpath_lib::selector::terms::ExprTerm::gt (16 samples, 8.47%) +jsonpath_lib.. -alloc::alloc::box_free (1 samples, 0.56%) - +hashbrown::raw::RawTableInner<A>::fallible_with_capacity (3 samples, 1.59%) + -jsonpath_lib_benches::main (167 samples, 94.35%) -jsonpath_lib_benches::main +alloc::vec::Vec<T,A>::reserve (4 samples, 2.12%) +a.. -std::sys::unix::stack_overflow::imp::make_handler (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::new_filter_context (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) - +core::iter::traits::iterator::Iterator::fold (44 samples, 23.28%) +core::iter::traits::iterator::Iterat.. -hashbrown::raw::RawTableInner<A>::fallible_with_capacity (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (2 samples, 1.06%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.13%) - +alloc::alloc::dealloc (2 samples, 1.06%) + -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.56%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.06%) + -std::panicking::try (168 samples, 94.92%) -std::panicking::try +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (3 samples, 1.59%) + -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.56%) - +_GI___libc_free (2 samples, 1.06%) + -indexmap::map::IndexMap<K,V,S>::get (2 samples, 1.13%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.06%) + -core::iter::traits::iterator::Iterator::try_fold (13 samples, 7.34%) -core::iter.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.59%) + -core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (11 samples, 6.21%) -core::pt.. +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (8 samples, 4.52%) -<Q as.. +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (3 samples, 1.59%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::get (5 samples, 2.65%) +ha.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (4 samples, 2.26%) -<.. +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (6 samples, 3.17%) +jso.. -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (4 samples, 2.26%) -<.. +std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.53%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_array_eof (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::find (16 samples, 9.04%) -hashbrown::ra.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -jsonpath_lib::selector::terms::ExprTerm::gt (8 samples, 4.52%) -jsonp.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::reserve_rehash (18 samples, 9.52%) +hashbrown::ra.. -hashbrown::set::HashSet<T,S,A>::insert (13 samples, 7.34%) -hashbrown:.. +core::iter::traits::iterator::Iterator::for_each (44 samples, 23.28%) +core::iter::traits::iterator::Iterat.. -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) + -std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.56%) - +<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.56%) - +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (26 samples, 14.69%) -<indexmap::map::IndexM.. +<f64 as core::ops::arith::Mul>::mul (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.53%) + -hashbrown::set::HashSet<T,S,A>::contains (6 samples, 3.39%) -has.. +core::core_arch::simd::i8x16::new (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::op (6 samples, 3.17%) +jso.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.69%) - +core::result::Result<T,E>::map_err (1 samples, 0.53%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.06%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.53%) + -core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.56%) - +core::num::<impl u64>::rotate_left (1 samples, 0.53%) + -core::num::<impl usize>::checked_add (1 samples, 0.56%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.06%) + -core::iter::traits::iterator::Iterator::all (26 samples, 14.69%) -core::iter::traits::it.. +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.06%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) + -indexmap::map::core::equivalent::{{closure}} (3 samples, 1.69%) - +begin_new_exec (7 samples, 3.70%) +begi.. -core::ptr::drop_in_place<alloc::vec::Vec<jsonpath_lib::paths::tokens::ParseToken>> (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (3 samples, 1.59%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (2 samples, 1.13%) - +hashbrown::map::HashMap<K,V,S,A>::contains_key (2 samples, 1.06%) + -core::str::<impl str>::parse (1 samples, 0.56%) - +core::ptr::mut_ptr::<impl *mut T>::offset (3 samples, 1.59%) + -tcache_put (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.56%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (3 samples, 1.59%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::find (16 samples, 8.47%) +hashbrown::r.. -jsonpath_lib::paths::path_parser::ParserImpl::expr (15 samples, 8.47%) -jsonpath_lib.. +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::op (6 samples, 3.39%) -jso.. +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -load_elf_binary (7 samples, 3.95%) -load.. +alloc::alloc::alloc (1 samples, 0.53%) + -std::panic::catch_unwind (167 samples, 94.35%) -std::panic::catch_unwind +indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.65%) +in.. -core::hash::impls::<impl core::hash::Hash for str>::hash (4 samples, 2.26%) -c.. +core::str::<impl str>::parse (3 samples, 1.59%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (13 samples, 7.34%) -<indexmap:.. +tcache_put (1 samples, 0.53%) + -<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) + -core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.56%) - +core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.56%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.12%) +<.. -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (4 samples, 2.26%) -j.. +hashbrown::raw::inner::RawTable<T,A>::get (10 samples, 5.29%) +hashbr.. -alloc::alloc::exchange_malloc (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::reserve (3 samples, 1.59%) + -hashbrown::map::HashMap<K,V,S,A>::contains_key (6 samples, 3.39%) -has.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.06%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +jsonpath_lib::paths::path_parser::ParserImpl::filter (31 samples, 16.40%) +jsonpath_lib::paths::path.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (5 samples, 2.82%) -<a.. +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -main (168 samples, 94.92%) -main +alloc::alloc::alloc (2 samples, 1.06%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (36 samples, 20.34%) -jsonpath_lib::selector::terms::.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (30 samples, 15.87%) +<indexmap::map::IndexMap.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 4.52%) -core:.. +<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (31 samples, 16.40%) +<jsonpath_lib::selector::.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.69%) - +core::iter::traits::iterator::Iterator::all::check::{{closure}} (11 samples, 5.82%) +core::i.. -core::option::Option<T>::unwrap (1 samples, 0.56%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -core::num::<impl u64>::rotate_left (1 samples, 0.56%) - +hashbrown::set::HashSet<T,S,A>::contains (2 samples, 1.06%) + -alloc::vec::Vec<T,A>::extend_desugared (4 samples, 2.26%) -a.. +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.53%) + -alloc::alloc::alloc (1 samples, 0.56%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) + -std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (1 samples, 0.56%) - +int_malloc (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::find (6 samples, 3.39%) -has.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -int_free (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) -<.. +core::num::<impl u64>::wrapping_add (1 samples, 0.53%) + -all (177 samples, 100%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -core::hash::Hasher::write_usize (2 samples, 1.13%) - +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (26 samples, 14.69%) -<indexmap::map::IndexM.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.06%) + -hashbrown::map::HashMap<K,V,S,A>::get_inner (6 samples, 3.39%) -has.. +alloc::alloc::Global::alloc_impl (2 samples, 1.06%) + -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (167 samples, 94.35%) -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 2.26%) -<.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.56%) - +core::ptr::mut_ptr::<impl *mut T>::sub (3 samples, 1.59%) + -alloc::vec::Vec<T,A>::reserve (2 samples, 1.13%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (31 samples, 16.40%) +core::cmp::impls::<impl c.. -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (31 samples, 16.40%) +jsonpath_lib::paths::path.. -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.69%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.59%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.69%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (3 samples, 1.59%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.69%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (9 samples, 4.76%) +core:.. -jsonpath_lib_be (170 samples, 96.05%) -jsonpath_lib_be +alloc::raw_vec::finish_grow (1 samples, 0.53%) + -core::iter::traits::iterator::Iterator::try_fold (26 samples, 14.69%) -core::iter::traits::it.. +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) + -_libc_start_main (168 samples, 94.92%) -_libc_start_main +jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.53%) + -_GI___libc_free (1 samples, 0.56%) - +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (3 samples, 1.69%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.53%) + -<f64 as core::ops::arith::Mul>::mul (1 samples, 0.56%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.53%) + -_sigaltstack (1 samples, 0.56%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.53%) + -std::rt::lang_start_internal (168 samples, 94.92%) -std::rt::lang_start_internal +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (7 samples, 3.70%) +<cor.. -_GI___libc_malloc (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (4 samples, 2.12%) +i.. -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::push (1 samples, 0.53%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::op (8 samples, 4.23%) +jsonp.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.56%) - +hashbrown::raw::RawTableInner<A>::find_insert_slot (3 samples, 1.59%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.56%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) +c.. -jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 1.69%) - +core::ptr::write (1 samples, 0.53%) + -entry_SYSCALL_64_after_hwframe (7 samples, 3.95%) -entr.. +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) +<.. -core::option::Option<T>::get_or_insert_with (3 samples, 1.69%) - +core::num::dec2flt::convert (2 samples, 1.06%) + -strlcpy (7 samples, 3.95%) -strl.. +core::num::dec2flt::algorithm::fast_path (2 samples, 1.06%) + -indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.56%) - +<hashbrown::raw::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.56%) - +IO_new_file_underflow (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (36 samples, 20.34%) -jsonpath_lib::paths::path_parse.. +jsonpath_lib::paths::path_parser::PathParser::parse (133 samples, 70.37%) +jsonpath_lib::paths::path_parser::PathParser::parse -jsonpath_lib::paths::tokenizer::TokenReader::read_value (1 samples, 0.56%) - +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (2 samples, 1.06%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (9 samples, 4.76%) +core:.. -std::rt::lang_start::{{closure}} (167 samples, 94.35%) -std::rt::lang_start::{{closure}} +hashbrown::map::make_hasher::{{closure}} (5 samples, 2.65%) +ha.. -core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.69%) - +hashbrown::raw::RawTableInner<A>::prepare_resize::{{closure}} (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) + -core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.56%) - +std::collections::hash::set::HashSet<T,S>::contains (2 samples, 1.06%) + -int_free (2 samples, 1.13%) - +core::ops::function::FnOnce::call_once (179 samples, 94.71%) +core::ops::function::FnOnce::call_once -core::ptr::write (1 samples, 0.56%) - +std::sys_common::backtrace::_rust_begin_short_backtrace (179 samples, 94.71%) +std::sys_common::backtrace::_rust_begin_short_backtrace -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.56%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.56%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.06%) + -alloc::raw_vec::finish_grow (1 samples, 0.56%) - +std::sys::unix::thread::guard::get_stack_start (1 samples, 0.53%) + -alloc::alloc::box_free (2 samples, 1.13%) - +entry_SYSCALL_64_after_hwframe (7 samples, 3.70%) +entr.. -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +std::thread::local::LocalKey<T>::try_with (1 samples, 0.53%) + -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.56%) - +_set_task_comm (7 samples, 3.70%) +_set.. -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.56%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.06%) + -jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (6 samples, 3.39%) -jso.. +alloc::vec::Vec<T,A>::push (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get (13 samples, 7.34%) -indexmap::.. +std::sys::unix::thread::guard::init (1 samples, 0.53%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (7 samples, 3.95%) -json.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (16 samples, 8.47%) +<alloc::vec:.. -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) - +core::str::validations::next_code_point (1 samples, 0.53%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (5 samples, 2.82%) -co.. +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) +c.. -hashbrown::raw::RawTableInner<A>::prepare_insert_slot (1 samples, 0.56%) - +alloc::vec::Vec<T>::with_capacity (1 samples, 0.53%) + -jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (5 samples, 2.82%) -js.. +core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_span (1 samples, 0.56%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -alloc::alloc::realloc (1 samples, 0.56%) - +int_malloc (1 samples, 0.53%) + -core::num::dec2flt::dec2flt (1 samples, 0.56%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (72 samples, 38.10%) +jsonpath_lib::selector::selector_impl::JsonSelector::visit_fi.. -<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (14 samples, 7.91%) -<jsonpath_l.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (8 samples, 4.52%) -core:.. +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 2.12%) +a.. -core::str::validations::next_code_point (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.59%) + -<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (14 samples, 7.91%) -<jsonpath_l.. +core::cell::Cell<T>::set (1 samples, 0.53%) + -_GI___libc_malloc (1 samples, 0.56%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (7 samples, 3.70%) +<cor.. -indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.82%) -in.. +core::hash::Hasher::write_u8 (1 samples, 0.53%) + -jsonpath_lib_benches::main::{{closure}} (167 samples, 94.35%) -jsonpath_lib_benches::main::{{closure}} +main (180 samples, 95.24%) +main -alloc::alloc::Global::alloc_impl (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -alloc::vec::Vec<T,A>::push (3 samples, 1.69%) - +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.06%) + -core::iter::traits::iterator::Iterator::collect (7 samples, 3.95%) -core.. +core::core_arch::x86::sse2::mm_set1_epi8 (3 samples, 1.59%) + -core::ops::function::FnOnce::call_once (167 samples, 94.35%) -core::ops::function::FnOnce::call_once +jsonpath_lib::selector::terms::ExprTerm::lt (7 samples, 3.70%) +json.. -core::hash::Hasher::write_u8 (2 samples, 1.13%) - +core::core_arch::simd::i8x16::new (1 samples, 0.53%) + -handle_mm_fault (1 samples, 0.56%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (44 samples, 23.28%) +core::iter::traits::iterator::Iterat.. -alloc::raw_vec::finish_grow (2 samples, 1.13%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.06%) + -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (2 samples, 1.13%) - +_GI___libc_malloc (2 samples, 1.06%) + -<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.56%) - +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (9 samples, 4.76%) +<[A] .. -jsonpath_lib::paths::tokenizer::Tokenizer::little (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (13 samples, 6.88%) +jsonpath_.. -std::panicking::try::do_call (168 samples, 94.92%) -std::panicking::try::do_call +core::ptr::const_ptr::<impl *const T>::offset (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.65%) +se.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (4 samples, 2.12%) +a.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (9 samples, 5.08%) -core::.. +indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.53%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::array (32 samples, 16.93%) +jsonpath_lib::paths::path_.. -hashbrown::raw::RawTable<T,A>::get (4 samples, 2.26%) -h.. +core::hash::impls::<impl core::hash::Hash for str>::hash (3 samples, 1.59%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.13%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.13%) - +_libc_start_main (180 samples, 95.24%) +_libc_start_main -hashbrown::raw::RawTable<T,A>::get_mut (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.06%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (36 samples, 20.34%) -<core::iter::adapters::enumerat.. +indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.65%) +in.. -alloc::alloc::box_free (1 samples, 0.56%) - +<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.53%) + -std::sys::unix::thread::guard::init (1 samples, 0.56%) - +hashbrown::map::HashMap<K,V,S,A>::get_inner (2 samples, 1.06%) + -indexmap::map::core::equivalent::{{closure}} (9 samples, 5.08%) -indexm.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 1.13%) - +alloc::vec::Vec<T,A>::as_ptr (1 samples, 0.53%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (15 samples, 8.47%) -serde_json::.. +std::collections::hash::set::HashSet<T>::new (1 samples, 0.53%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.13%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (12 samples, 6.35%) +<indexma.. -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.56%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.53%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) + -alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.56%) - +<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (7 samples, 3.70%) +<std.. -core::hash::sip::u8to64_le (1 samples, 0.56%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (9 samples, 4.76%) +core:.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (8 samples, 4.52%) -core:.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.53%) + -core::ptr::drop_in_place<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<&serde_json::value::Value,alloc::alloc::Global>> (1 samples, 0.56%) - +tcache_get (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 1.13%) - +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (43 samples, 22.75%) +jsonpath_lib::selector::value_walke.. -hashbrown::raw::RawTableInner<A>::new_uninitialized (1 samples, 0.56%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) - +alloc::alloc::alloc (3 samples, 1.59%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (7 samples, 3.95%) -<all.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.59%) + -alloc::alloc::dealloc (1 samples, 0.56%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (5 samples, 2.65%) +<a.. -core::ptr::drop_in_place<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>> (9 samples, 5.08%) -core::.. +core::iter::traits::iterator::Iterator::all (12 samples, 6.35%) +core::it.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (3 samples, 1.69%) - +core::slice::<impl [T]>::iter (1 samples, 0.53%) + -core::ptr::drop_in_place<jsonpath_lib::paths::tokens::ParseToken> (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -int_malloc (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::get (2 samples, 1.06%) + -hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.13%) - +alloc::vec::Vec<T,A>::pop (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.69%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (3 samples, 1.59%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) + -alloc::vec::Vec<T,A>::reserve (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths (2 samples, 1.06%) + -_GI___libc_realloc (1 samples, 0.56%) - +load_elf_binary (7 samples, 3.70%) +load.. -core::num::<impl usize>::overflowing_add (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (10 samples, 5.29%) +indexm.. -alloc::vec::Vec<T,A>::push (1 samples, 0.56%) - +strlcpy (7 samples, 3.70%) +strl.. -jsonpath_lib::paths::path_parser::PathParser::compile (38 samples, 21.47%) -jsonpath_lib::paths::path_parser:.. +<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::try_fold::check::{{closure}} (1 samples, 0.53%) + -jsonpath_lib::paths::str_reader::StrReader::read (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::get (16 samples, 8.47%) +hashbrown::r.. -core::str::traits::<impl core::cmp::PartialEq for str>::eq (8 samples, 4.52%) -core:.. +core::iter::traits::iterator::Iterator::all::check::{{closure}} (30 samples, 15.87%) +core::iter::traits::iter.. -core::ptr::drop_in_place<alloc::vec::into_iter::IntoIter<&serde_json::value::Value>> (1 samples, 0.56%) - +nv033032rm (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) - +<alloc::alloc::Global as core::alloc::Allocator>::grow (4 samples, 2.12%) +<.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.65%) +in.. -alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.56%) - +core::hash::sip::u8to64_le (1 samples, 0.53%) + -hashbrown::map::make_insert_hash (3 samples, 1.69%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -core::hash::sip::u8to64_le (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) + -core::num::<impl u64>::rotate_left (2 samples, 1.13%) - +core::core_arch::x86::sse2::mm_set_epi8 (3 samples, 1.59%) + -<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.56%) - +int_free (2 samples, 1.06%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.13%) - +_do_execve_fil.sr. (7 samples, 3.70%) +_do_.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.13%) - +<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.53%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.69%) - +core::hash::Hasher::write_u8 (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (19 samples, 10.73%) -jsonpath_lib::p.. +indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.65%) +in.. -hashbrown::raw::RawTableInner<A>::prepare_resize (1 samples, 0.56%) - +_GI___libc_malloc (2 samples, 1.06%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.69%) - +alloc::alloc::box_free (2 samples, 1.06%) + -core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::insert (22 samples, 11.64%) +hashbrown::raw::R.. -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (36 samples, 20.34%) -core::iter::traits::iterator::I.. +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.13%) - +std::collections::hash::set::HashSet<T,S>::insert (27 samples, 14.29%) +std::collections::has.. -jsonpath_lib::selector::terms::ExprTerm::cmp (27 samples, 15.25%) -jsonpath_lib::selector:.. +core::iter::traits::iterator::Iterator::collect (6 samples, 3.17%) +cor.. -alloc::boxed::Box<T>::new (2 samples, 1.13%) - +hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.59%) + -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (115 samples, 64.97%) -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.13%) - +_memcmp_avx2_movbe (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) +c.. -_do_execve_fil.sr. (7 samples, 3.95%) -_do_.. +hashbrown::raw::bitmask::BitMask::lowest_set_bit (3 samples, 1.59%) + -_x86_indirect_thunk_rax (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::resize (18 samples, 9.52%) +hashbrown::ra.. -asm_exc_page_fault (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +alloc::alloc::box_free (2 samples, 1.06%) + -std::collections::hash::set::HashSet<T,S>::insert (13 samples, 7.34%) -std::colle.. +core::num::dec2flt::parse::parse_decimal (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.06%) + -mprotect_fixup (1 samples, 0.56%) - +core::cell::Cell<T>::replace (1 samples, 0.53%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.53%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.39%) -cor.. +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (3 samples, 1.69%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.13%) - +hashbrown::raw::alloc::inner::do_alloc (3 samples, 1.59%) + -asm_exc_page_fault (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.53%) + -alloc::slice::<impl [T]>::to_vec (1 samples, 0.56%) - +alloc::raw_vec::finish_grow (4 samples, 2.12%) +a.. -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.69%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 1.59%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 1.13%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.65%) +in.. -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (38 samples, 21.47%) -jsonpath_lib::selector::terms::Fi.. +core::ptr::write (1 samples, 0.53%) + -jsonpath_lib::selector::selector_impl::JsonSelector::select (115 samples, 64.97%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) - +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::exprs (31 samples, 17.51%) -jsonpath_lib::paths::path_p.. +core::num::dec2flt::dec2flt (3 samples, 1.59%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.69%) - +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (179 samples, 94.71%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once -_memcmp_avx2_movbe (2 samples, 1.13%) - +jsonpath_lib::paths::str_reader::StrReader::peek_char (1 samples, 0.53%) + -hashbrown::map::make_hasher::{{closure}} (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -hashbrown::raw::RawTable<T,A>::insert (8 samples, 4.52%) -hashb.. +hashbrown::raw::inner::RawTable<T,A>::iter_hash (3 samples, 1.59%) + -alloc::alloc::alloc (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::reserve (19 samples, 10.05%) +hashbrown::raw.. -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (26 samples, 14.69%) -<serde_json::map::Map<.. +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (133 samples, 70.37%) +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle -core::iter::traits::iterator::Iterator::collect (5 samples, 2.82%) -co.. +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.53%) + -std::panic::catch_unwind (168 samples, 94.92%) -std::panic::catch_unwind +jsonpath_lib_be (182 samples, 96.30%) +jsonpath_lib_be -jsonpath_lib::paths::tokenizer::Tokenizer::greater (1 samples, 0.56%) - +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.53%) + -exc_page_fault (1 samples, 0.56%) - +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (7 samples, 3.70%) +<cor.. -alloc::alloc::dealloc (2 samples, 1.13%) - +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) + -hashbrown::map::make_hash (1 samples, 0.56%) - +hashbrown::raw::RawTableInner<A>::new_uninitialized (3 samples, 1.59%) + -<alloc::string::String as core::hash::Hash>::hash (2 samples, 1.13%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.06%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.59%) + -core::ptr::drop_in_place<alloc::raw_vec::RawVec<jsonpath_lib::paths::tokens::ParseToken>> (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.59%) + -core::hash::Hasher::write_usize (1 samples, 0.56%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) +c.. -core::hash::impls::<impl core::hash::Hash for str>::hash (6 samples, 3.39%) -cor.. +<alloc::string::String as core::hash::Hash>::hash (3 samples, 1.59%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.69%) - +core::core_arch::simd::i8x16::new (1 samples, 0.53%) + -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.56%) - +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (44 samples, 23.28%) +<core::iter::adapters::enumerate::En.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (14 samples, 7.91%) -core::cmp::.. +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) - +core::slice::iter::Iter<T>::new (1 samples, 0.53%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +indexmap::map::core::equivalent::{{closure}} (2 samples, 1.06%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.56%) - +std::panicking::try (179 samples, 94.71%) +std::panicking::try -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.56%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) +c.. -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.56%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) - +core::mem::replace (1 samples, 0.53%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (16 samples, 9.04%) -indexmap::map.. +do_syscall_64 (1 samples, 0.53%) + -core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.56%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (57 samples, 30.16%) +jsonpath_lib::selector::selector_impl::JsonSelec.. -alloc::alloc::Global::alloc_impl (2 samples, 1.13%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::term_num (4 samples, 2.26%) -j.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) + -alloc::slice::hack::to_vec (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::push (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) - +hashbrown::map::HashMap<K,V,S,A>::insert (27 samples, 14.29%) +hashbrown::map::HashM.. -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 1.13%) - +<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.53%) + -alloc::alloc::alloc (2 samples, 1.13%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (1 samples, 0.53%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (36 samples, 20.34%) -<core::iter::adapters::enumerat.. +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.56%) - +std::sys_common::rt::init (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (6 samples, 3.39%) -<st.. +dl_sysdep_start (1 samples, 0.53%) + -alloc::slice::<impl [T]>::to_vec (1 samples, 0.56%) - +int_free (2 samples, 1.06%) + -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (13 samples, 7.34%) -<serde_jso.. +jsonpath_lib::selector::terms::FilterTerms::push_json_term (48 samples, 25.40%) +jsonpath_lib::selector::terms::FilterTer.. -<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::reserve (4 samples, 2.12%) +a.. -hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (44 samples, 23.28%) +jsonpath_lib::selector::terms::Filte.. -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (13 samples, 7.34%) -<indexmap:.. +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::hash (9 samples, 5.08%) -indexm.. +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (30 samples, 15.87%) +<serde_json::map::Map<al.. -core::core_arch::simd::i8x16::new (2 samples, 1.13%) - +alloc::boxed::Box<T>::new (2 samples, 1.06%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (2 samples, 1.06%) + -jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.56%) - +core::char::methods::<impl char>::is_whitespace (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (26 samples, 14.69%) -indexmap::map::IndexMa.. +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (1 samples, 0.56%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (179 samples, 94.71%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) - +<hashbrown::raw::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -core::hash::Hasher::write_u8 (1 samples, 0.56%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (1 samples, 0.56%) - +<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (4 samples, 2.12%) +<.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.13%) - +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (11 samples, 5.82%) +indexma.. -jsonpath_lib::paths::path_parser::ParserImpl::path_in_key (1 samples, 0.56%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (30 samples, 15.87%) +<indexmap::map::IndexMap.. -core::iter::traits::iterator::Iterator::for_each (36 samples, 20.34%) -core::iter::traits::iterator::I.. +<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (1 samples, 0.53%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.13%) - +do_syscall_64 (7 samples, 3.70%) +do_s.. -rtld_timer_start (1 samples, 0.56%) - +hashbrown::raw::RawTableInner<A>::prepare_resize (5 samples, 2.65%) +ha.. -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +core::ptr::drop_in_place<jsonpath_lib::selector::terms::ExprTerm> (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.13%) - +core::num::dec2flt::simplify (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.56%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +alloc::raw_vec::finish_grow (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths (37 samples, 19.58%) +jsonpath_lib::paths::path_pars.. -alloc::alloc::alloc (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) - +indexmap::map::IndexMap<K,V,S>::get (28 samples, 14.81%) +indexmap::map::IndexMa.. -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (8 samples, 4.52%) -core:.. +<hashbrown::scopeguard::ScopeGuard<T,F> as core::ops::drop::Drop>::drop (1 samples, 0.53%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) + -std::panicking::try::do_call (167 samples, 94.35%) -std::panicking::try::do_call +_GI___libc_malloc (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::term_num (1 samples, 0.56%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) +<.. -jsonpath_lib::selector::terms::ExprTerm::cmp (8 samples, 4.52%) -jsonp.. +hashbrown::raw::RawTableInner<A>::find_insert_slot (6 samples, 3.17%) +has.. -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::push (3 samples, 1.59%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (10 samples, 5.29%) +<alloc.. -jsonpath_lib::paths::path_parser::ParserImpl::paths (6 samples, 3.39%) -jso.. +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (6 samples, 3.17%) +<al.. -core::result::Result<T,E>::map_err (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (7 samples, 3.70%) +<cor.. -core::option::Option<T>::get_or_insert_with (4 samples, 2.26%) -c.. +alloc::alloc::Global::alloc_impl (1 samples, 0.53%) + -core::iter::traits::iterator::Iterator::all::check::{{closure}} (13 samples, 7.34%) -core::iter.. +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.06%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::push (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -jsonpath_lib::selector::terms::FilterTerms::push_json_term (38 samples, 21.47%) -jsonpath_lib::selector::terms::Fi.. +core::iter::traits::iterator::Iterator::all (30 samples, 15.87%) +core::iter::traits::iter.. -<hashbrown::raw::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +indexmap::map::IndexMap<K,V,S>::get (10 samples, 5.29%) +indexm.. -alloc::alloc::exchange_malloc (1 samples, 0.56%) - +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (6 samples, 3.17%) +cor.. -std::sys_common::rt::init (1 samples, 0.56%) - +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::array_start (32 samples, 18.08%) -jsonpath_lib::paths::path_pa.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (4 samples, 2.26%) -j.. +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (9 samples, 4.76%) +<Q as.. -hashbrown::raw::TableLayout::calculate_layout_for (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.53%) + -int_free (1 samples, 0.56%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.06%) + -core::core_arch::simd::i8x16::new (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +hashbrown::raw::RawTable<T,A>::find (2 samples, 1.06%) + -<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -int_free (1 samples, 0.56%) - +_x64_sys_execve (7 samples, 3.70%) +_x64.. -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get (26 samples, 14.69%) -indexmap::map::IndexMa.. +core::option::Option<T>::map_or (1 samples, 0.53%) + -exec_binprm (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths (5 samples, 2.65%) +js.. -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (37 samples, 20.90%) -jsonpath_lib::selector::terms::F.. +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (3 samples, 1.59%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (4 samples, 2.26%) -j.. +jsonpath_lib::selector::terms::ExprTerm::cmp (16 samples, 8.47%) +jsonpath_lib.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.56%) - +jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.53%) + -core::core_arch::simd::i8x16::new (1 samples, 0.56%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) +c.. -jsonpath_lib::paths::path_parser::PathParser::parse (115 samples, 64.97%) -jsonpath_lib::paths::path_parser::PathParser::parse +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (4 samples, 2.12%) +c.. -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.56%) - +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (133 samples, 70.37%) +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit -jsonpath_lib::paths::path_parser::ParserImpl::json_path (37 samples, 20.90%) -jsonpath_lib::paths::path_parser.. +_memcmp_avx2_movbe (6 samples, 3.17%) +_me.. -core::num::dec2flt::number::Number::try_fast_path (1 samples, 0.56%) - +core::hash::sip::u8to64_le (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.13%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (6 samples, 3.17%) +jso.. -core::ptr::drop_in_place<core::option::Option<alloc::vec::Vec<&serde_json::value::Value>>> (1 samples, 0.56%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (1 samples, 0.53%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (7 samples, 3.95%) -core.. +pthread_getattr_np (1 samples, 0.53%) + -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.56%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.06%) + -<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (27 samples, 15.25%) -<jsonpath_lib::selector.. +core::num::dec2flt::dec2flt (2 samples, 1.06%) + -start (169 samples, 95.48%) -start +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) + -do_fault (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.06%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) -<.. +core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (5 samples, 2.65%) +co.. -core::str::<impl str>::is_char_boundary (1 samples, 0.56%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (134 samples, 70.90%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -_do_execve_fil.sr. (1 samples, 0.56%) +entry_SYSCALL_64_after_hwframe (1 samples, 0.53%) -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.13%) - - - -alloc::slice::hack::to_vec (1 samples, 0.56%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (6 samples, 3.39%) -<co.. - - -_memcmp_avx2_movbe (1 samples, 0.56%) - - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (7 samples, 3.95%) -<all.. - - -indexmap::map::IndexMap<K,V,S>::get_index_of (15 samples, 8.47%) -indexmap::ma.. - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - - - -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - - - -<serde_json::value::Value as core::cmp::PartialEq>::eq (14 samples, 7.91%) -<serde_json.. - - -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) -<.. - - -std::collections::hash::set::HashSet<T,S>::contains (6 samples, 3.39%) -std.. +jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) + -core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.13%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (3 samples, 1.59%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) + -exec_binprm (7 samples, 3.95%) -exec.. +hashbrown::map::make_insert_hash (4 samples, 2.12%) +h.. -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.56%) - +checked_request2size (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (4 samples, 2.26%) -<.. +<std::collections::hash::map::RandomState as core::default::Default>::default (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.13%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) + -jsonpath_lib::selector::terms::FilterTerms::filter (38 samples, 21.47%) -jsonpath_lib::selector::terms::Fi.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -jsonpath_lib::selector::terms::ExprTerm::and (15 samples, 8.47%) -jsonpath_lib.. +core::core_arch::x86::sse2::mm_movemask_epi8 (2 samples, 1.06%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (14 samples, 7.91%) -jsonpath_li.. +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) + -hashbrown::raw::RawTable<T,A>::find (4 samples, 2.26%) -h.. +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) - +hashbrown::set::HashSet<T,S,A>::insert (27 samples, 14.29%) +hashbrown::set::HashS.. -entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) - - - -core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (9 samples, 5.08%) -core::.. - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.26%) -<.. - - -core::num::<impl u64>::rotate_left (1 samples, 0.56%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) - - - -_rdl_dealloc (1 samples, 0.56%) - - - -core::hash::sip::u8to64_le (1 samples, 0.56%) - - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.56%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - - - -tcache_put (1 samples, 0.56%) - - - -hashbrown::raw::RawIterHashInner<A>::new (2 samples, 1.13%) - +exec_binprm (1 samples, 0.53%) + -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 2.26%) -<.. +core::hash::Hasher::write_usize (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::reserve (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.53%) + -std::sys::unix::thread::guard::get_stack_start (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::path (1 samples, 0.53%) + -hashbrown::raw::sse2::Group::match_byte (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.69%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) + -core::hash::impls::<impl core::hash::Hash for *const T>::hash (2 samples, 1.13%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -<hashbrown::raw::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +int_free (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::op (2 samples, 1.13%) - +alloc::alloc::exchange_malloc (2 samples, 1.06%) + -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (5 samples, 2.82%) -<a.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (8 samples, 4.52%) -index.. +alloc::raw_vec::finish_grow (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::compile (37 samples, 20.90%) -jsonpath_lib::paths::path_parser.. +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.69%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 1.06%) + -jsonpath_lib::selector::selector_impl::JsonSelector::select (116 samples, 65.54%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) +c.. -core::num::dec2flt::dec2flt (1 samples, 0.56%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (17 samples, 8.99%) +indexmap::ma.. -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.13%) - +alloc::alloc::dealloc (2 samples, 1.06%) + -core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>>>> (9 samples, 5.08%) -core::.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.69%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) - +core::num::<impl u64>::wrapping_add (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::filter (32 samples, 18.08%) -jsonpath_lib::paths::path_pa.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.26%) -c.. +IO_getdelim (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (7 samples, 3.95%) -core.. +alloc::alloc::realloc (1 samples, 0.53%) + -alloc::alloc::dealloc (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.69%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.39%) -cor.. +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 1.06%) + -dl_start (1 samples, 0.56%) - +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (44 samples, 23.28%) +<core::iter::adapters::enumerate::En.. -alloc::alloc::dealloc (1 samples, 0.56%) - +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) + -core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.56%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (13 samples, 6.88%) +serde_jso.. -core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.53%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.06%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +alloc::alloc::Global::grow_impl (1 samples, 0.53%) + -std::sys_common::backtrace::_rust_begin_short_backtrace (167 samples, 94.35%) -std::sys_common::backtrace::_rust_begin_short_backtrace +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.56%) - +core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>>> (5 samples, 2.65%) +co.. -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +core::num::<impl u64>::rotate_left (2 samples, 1.06%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (5 samples, 2.82%) -co.. +core::option::Option<T>::map_or (2 samples, 1.06%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) - +jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.53%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.56%) - +exec_binprm (7 samples, 3.70%) +exec.. -core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::get (1 samples, 0.56%) - +jsonpath_lib::paths::str_reader::StrReader::next (1 samples, 0.53%) + -int_malloc (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.56%) - +all (189 samples, 100%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.13%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -core::ptr::mut_ptr::<impl *mut T>::add (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) + -alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.56%) - +core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) + -perf (7 samples, 3.95%) -perf +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) + -hashbrown::raw::RawTable<T,A>::reserve (6 samples, 3.39%) -has.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) + -do_syscall_64 (7 samples, 3.95%) -do_s.. +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.59%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.65%) +al.. -indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.56%) - +core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 1.06%) + -core::ptr::drop_in_place<core::option::Option<alloc::vec::Vec<&serde_json::value::Value>>> (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::get (8 samples, 4.52%) -hashb.. +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.59%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.56%) - +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.53%) + -jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.56%) - +int_malloc (1 samples, 0.53%) + -alloc::alloc::dealloc (1 samples, 0.56%) - +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.53%) + -alloc::alloc::dealloc (1 samples, 0.56%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (12 samples, 6.35%) +core::cm.. -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.56%) - +core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) + -_GI___libc_free (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.06%) + -core::option::Option<T>::unwrap (1 samples, 0.56%) - +core::iter::traits::iterator::Iterator::try_fold (12 samples, 6.35%) +core::it.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) - +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (7 samples, 3.95%) -json.. +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (15 samples, 7.94%) +<alloc::vec.. -core::iter::traits::iterator::Iterator::all (13 samples, 7.34%) -core::iter.. +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) + -alloc::alloc::Global::grow_impl (1 samples, 0.56%) - +<f64 as core::num::dec2flt::rawfp::RawFloat>::from_int (1 samples, 0.53%) + -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (13 samples, 6.88%) +jsonpath_.. -indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.59%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.13%) - +setup_arg_pages (1 samples, 0.53%) + -hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.56%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.53%) + -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (7 samples, 3.95%) -<all.. +alloc::vec::Vec<T,A>::reserve (1 samples, 0.53%) + -std::panicking::try (167 samples, 94.35%) -std::panicking::try +core::iter::traits::iterator::Iterator::try_fold (30 samples, 15.87%) +core::iter::traits::iter.. -jsonpath_lib::select (167 samples, 94.35%) -jsonpath_lib::select +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) +c.. -jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.56%) - +tcache_get (1 samples, 0.53%) + -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (12 samples, 6.35%) +jsonpath.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.53%) + -hashbrown::map::HashMap<K,V,S,A>::insert (13 samples, 7.34%) -hashbrown:.. +alloc::vec::Vec<T,A>::extend_desugared (9 samples, 4.76%) +alloc.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::compile (38 samples, 20.11%) +jsonpath_lib::paths::path_parse.. -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.13%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other::{{closure}} (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::json_path (38 samples, 20.11%) +jsonpath_lib::paths::path_parse.. -hashbrown::raw::RawTable<T,A>::find (1 samples, 0.56%) - +core::num::dec2flt::convert (2 samples, 1.06%) + -hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (30 samples, 15.87%) +<serde_json::value::Valu.. -core::str::traits::<impl core::ops::index::Index<I> for str>::index (1 samples, 0.56%) - +_GI___libc_malloc (2 samples, 1.06%) + -indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (7 samples, 3.70%) +<cor.. -core::hash::Hasher::write_u8 (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::PathParser::compile (38 samples, 20.11%) +jsonpath_lib::paths::path_parse.. -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.69%) - +core::hash::Hasher::write_u8 (1 samples, 0.53%) + -alloc::boxed::Box<T>::new (1 samples, 0.56%) - +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) + -jsonpath_lib::selector::selector_impl::JsonSelector::new (1 samples, 0.56%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.06%) + -core::hash::Hasher::write_u8 (2 samples, 1.13%) - +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (14 samples, 7.41%) +jsonpath_l.. -alloc::alloc::dealloc (1 samples, 0.56%) - +alloc::raw_vec::RawVec<T,A>::capacity_from_bytes (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.13%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (4 samples, 2.12%) +c.. -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.69%) - +core::iter::traits::iterator::Iterator::count (1 samples, 0.53%) + -<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.56%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) +c.. -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 1.13%) - +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.53%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.13%) - +jsonpath_lib::select (179 samples, 94.71%) +jsonpath_lib::select -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +core::ptr::drop_in_place<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>> (5 samples, 2.65%) +co.. -core::str::<impl str>::parse (1 samples, 0.56%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) +<.. -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::reserve (3 samples, 1.59%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.39%) -cor.. +hashbrown::raw::inner::RawTable<T,A>::find (10 samples, 5.29%) +hashbr.. -_memcmp_avx2_movbe (5 samples, 2.82%) -_m.. +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.56%) - +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (12 samples, 6.35%) +<jsonpat.. -indexmap::map::IndexMap<K,V,S>::contains_key (15 samples, 8.47%) -indexmap::ma.. +indexmap::map::IndexMap<K,V,S>::get_index_of (13 samples, 6.88%) +indexmap:.. -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (110 samples, 62.15%) -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHand.. +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.53%) + -_GI___libc_malloc (2 samples, 1.13%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (28 samples, 14.81%) +indexmap::map::IndexMa.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 3.39%) -ind.. +jsonpath_lib_benches::main::{{closure}} (179 samples, 94.71%) +jsonpath_lib_benches::main::{{closure}} -_memcmp_avx2_movbe (1 samples, 0.56%) - +core::ptr::write (3 samples, 1.59%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.13%) - +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.06%) + -alloc::boxed::Box<T>::new (1 samples, 0.56%) - +alloc::alloc::Global::alloc_impl (3 samples, 1.59%) + -_rust_alloc (1 samples, 0.56%) - +<alloc::string::String as core::cmp::PartialEq>::eq (9 samples, 4.76%) +<allo.. -int_realloc (1 samples, 0.56%) - +core::ptr::read (1 samples, 0.53%) + -core::num::dec2flt::number::Number::try_fast_path (1 samples, 0.56%) - +std::thread::local::LocalKey<T>::with (1 samples, 0.53%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.56%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (10 samples, 5.29%) +indexm.. -alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::push_term (3 samples, 1.59%) + -alloc::alloc::alloc (1 samples, 0.56%) - +core::ptr::drop_in_place<hashbrown::scopeguard::ScopeGuard<hashbrown::raw::RawTableInner<alloc::alloc::Global>,hashbrown::raw::RawTableInner<alloc::alloc::Global>::prepare_resize::{{closure}}>> (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::reserve (2 samples, 1.06%) + -_x64_sys_execve (1 samples, 0.56%) - +core::ptr::const_ptr::<impl *const T>::add (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.06%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.56%) - +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.13%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (1 samples, 0.53%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.56%) - +core::ptr::write (1 samples, 0.53%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.56%) - +std::collections::hash::map::RandomState::new::{{closure}} (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.56%) - +hashbrown::raw::inner::sse2::Group::match_byte (3 samples, 1.59%) + -core::hash::sip::u8to64_le (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (48 samples, 25.40%) +jsonpath_lib::selector::terms::FilterTer.. -core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index (1 samples, 0.56%) - +jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.56%) - +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::array (32 samples, 18.08%) -jsonpath_lib::paths::path_pa.. +_GI___libc_realloc (1 samples, 0.53%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 1.13%) - +_x64_sys_execve (1 samples, 0.53%) + -<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (2 samples, 1.13%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.13%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) + -tcache_get (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.13%) - +hashbrown::raw::inner::RawIterHashInner<A>::new (3 samples, 1.59%) + -do_user_addr_fault (1 samples, 0.56%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (2 samples, 1.06%) + -hashbrown::raw::RawTable<T,A>::reserve_rehash (6 samples, 3.39%) -has.. +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (13 samples, 7.34%) -indexmap::.. +core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.13%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) + -hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 3.39%) -has.. +start (181 samples, 95.77%) +start -jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (35 samples, 19.77%) -jsonpath_lib::selector::value_.. +dl_start_final (1 samples, 0.53%) + -core::iter::traits::iterator::Iterator::fold (167 samples, 94.35%) -core::iter::traits::iterator::Iterator::fold +jsonpath_lib::selector::terms::FilterTerms::filter (48 samples, 25.40%) +jsonpath_lib::selector::terms::FilterTer.. -_GI___libc_free (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::little (1 samples, 0.53%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.13%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) + -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) - +core::iter::traits::iterator::Iterator::collect (16 samples, 8.47%) +core::iter::.. -hashbrown::raw::inner::RawTable<T,A>::get (16 samples, 9.04%) -hashbrown::ra.. +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.53%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (6 samples, 3.39%) -<co.. +<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.53%) + -core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.13%) - +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) + -core::iter::traits::iterator::Iterator::for_each (167 samples, 94.35%) -core::iter::traits::iterator::Iterator::for_each +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (6 samples, 3.17%) +<al.. -<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (9 samples, 5.08%) -<alloc.. +<alloc::string::String as core::hash::Hash>::hash (2 samples, 1.06%) + -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.56%) - +core::str::<impl str>::parse (2 samples, 1.06%) + -hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.13%) - +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.13%) - +std::collections::hash::map::RandomState::new (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +core::num::<impl u64>::rotate_left (2 samples, 1.06%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.69%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.53%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.13%) - +int_realloc (1 samples, 0.53%) + -<alloc::string::String as core::hash::Hash>::hash (4 samples, 2.26%) -<.. +<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.53%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (3 samples, 1.69%) - +std::panic::catch_unwind (179 samples, 94.71%) +std::panic::catch_unwind -<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.53%) + -hashbrown::raw::RawTable<T,A>::iter_hash (2 samples, 1.13%) - +hashbrown::raw::inner::RawTableInner<A>::probe_seq (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.13%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.53%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.13%) - +jsonpath_lib::paths::path_parser::ParserImpl::array_start (31 samples, 16.40%) +jsonpath_lib::paths::path.. -alloc::alloc::dealloc (2 samples, 1.13%) - +std::rt::lang_start_internal (180 samples, 95.24%) +std::rt::lang_start_internal -_GI___libc_malloc (2 samples, 1.13%) - +<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (12 samples, 6.35%) +<jsonpat.. -_rust_alloc (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::contains_key (13 samples, 6.88%) +indexmap:.. -<serde_json::value::Value as core::cmp::PartialEq>::eq (27 samples, 15.25%) -<serde_json::value::Val.. +_do_execve_fil.sr. (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.56%) - +hashbrown::raw::sse2::Group::match_empty_or_deleted (2 samples, 1.06%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.13%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.06%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.59%) + -<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.69%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (3 samples, 1.59%) + -hashbrown::raw::RawIterHash<T,A>::new (2 samples, 1.13%) - +jsonpath_lib::selector::terms::ExprTerm::and (12 samples, 6.35%) +jsonpath.. -core::option::Option<T>::get_or_insert_with (1 samples, 0.56%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (5 samples, 2.65%) +js.. -hashbrown::raw::inner::RawTable<T,A>::find (7 samples, 3.95%) -hash.. +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.06%) + -core::num::<impl u64>::rotate_left (1 samples, 0.56%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (12 samples, 6.35%) +<serde_j.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (8 samples, 4.52%) -core:.. +_GI___libc_realloc (4 samples, 2.12%) +_.. -_memmove_avx_unaligned_erms (1 samples, 0.56%) - +alloc::alloc::Global::grow_impl (4 samples, 2.12%) +a.. -core::num::<impl u64>::wrapping_add (1 samples, 0.56%) - +dl_start (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::hash (10 samples, 5.65%) -indexma.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (5 samples, 2.65%) +in.. -do_syscall_64 (1 samples, 0.56%) - +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.53%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::PathParser>> (9 samples, 5.08%) -core::.. +jsonpath_lib::selector::terms::ExprTerm::cmp (31 samples, 16.40%) +jsonpath_lib::selector::t.. -jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 2.26%) -j.. +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.06%) + -jsonpath_lib::paths::tokens::Token::reset_span (1 samples, 0.56%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) +c.. -alloc::alloc::dealloc (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::find (5 samples, 2.65%) +ha.. -jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.56%) - +jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (8 samples, 4.23%) +jsonp.. -alloc::alloc::exchange_malloc (2 samples, 1.13%) - +hashbrown::raw::is_full (1 samples, 0.53%) + -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.69%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) + -jsonpath_lib::paths::path_parser::ParserImpl::key (1 samples, 0.56%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) + -alloc::alloc::box_free (2 samples, 1.13%) - +indexmap::map::core::equivalent::{{closure}} (2 samples, 1.06%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (2 samples, 1.13%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (133 samples, 70.37%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.56%) - +core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) + -std::rt::lang_start_internal::{{closure}} (168 samples, 94.92%) -std::rt::lang_start_internal::{{closure}} +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (45 samples, 23.81%) +jsonpath_lib::selector::terms::Filter.. -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (2 samples, 1.13%) - +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.53%) + -core::result::Result<T,E>::map_err (1 samples, 0.56%) - +jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (8 samples, 4.23%) +jsonp.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.69%) - +int_realloc (3 samples, 1.59%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.26%) -<.. +core::iter::traits::iterator::Iterator::try_fold (1 samples, 0.53%) + -jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.56%) - +std::rt::lang_start::{{closure}} (179 samples, 94.71%) +std::rt::lang_start::{{closure}} -hashbrown::raw::RawTable<T,A>::resize (5 samples, 2.82%) -ha.. +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (12 samples, 6.35%) +<serde_j.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.56%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.59%) + -jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (1 samples, 0.56%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.59%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (5 samples, 2.82%) -co.. +_GI___libc_malloc (1 samples, 0.53%) + -alloc::vec::Vec<T,A>::extend_desugared (4 samples, 2.26%) -a.. +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.53%) + -alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.56%) - +hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.59%) + -int_malloc (1 samples, 0.56%) - +core::num::dec2flt::algorithm::fast_path (1 samples, 0.53%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (27 samples, 15.25%) -core::cmp::impls::<impl.. +_GI___tunables_init (1 samples, 0.53%) + -jsonpath_lib::selector::terms::ExprTerm::or (27 samples, 15.25%) -jsonpath_lib::selector:.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (11 samples, 5.82%) +<indexm.. -jsonpath_lib::selector::terms::ExprTerm::lt (7 samples, 3.95%) -json.. +core::iter::traits::iterator::Iterator::fold (179 samples, 94.71%) +core::iter::traits::iterator::Iterator::fold -core::iter::traits::iterator::Iterator::all::check::{{closure}} (26 samples, 14.69%) -core::iter::traits::it.. +alloc::alloc::realloc (4 samples, 2.12%) +a.. -alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.56%) - +perf (7 samples, 3.70%) +perf -core::iter::traits::iterator::Iterator::fold (36 samples, 20.34%) -core::iter::traits::iterator::I.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.59%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.56%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.06%) + -<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.56%) - +hashbrown::map::make_hash (5 samples, 2.65%) +ha.. -jsonpath_lib::paths::str_reader::StrReader::peek_char (1 samples, 0.56%) - +alloc::vec::Vec<T,A>::push (3 samples, 1.59%) + -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.56%) - +core::num::<impl u64>::rotate_left (1 samples, 0.53%) + -indexmap::map::core::equivalent::{{closure}} (3 samples, 1.69%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (12 samples, 6.35%) +jsonpath.. -jsonpath_lib::paths::path_parser::PathParser::parse::{{closure}} (1 samples, 0.56%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.65%) +se.. -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.56%) - +std::panicking::try::do_call (179 samples, 94.71%) +std::panicking::try::do_call -setup_arg_pages (1 samples, 0.56%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) + -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (167 samples, 94.35%) -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) +<.. -hashbrown::map::make_hash (2 samples, 1.13%) - +core::iter::traits::iterator::Iterator::for_each (179 samples, 94.71%) +core::iter::traits::iterator::Iterator::for_each -load_elf_binary (1 samples, 0.56%) - +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (16 samples, 8.47%) +<alloc::vec:.. -<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.13%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.53%) + diff --git a/src/lib.rs b/src/lib.rs index a275c9d6..b9de61d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -148,6 +148,10 @@ pub use paths::PathParser; use std::rc::Rc; #[doc(hidden)] +#[deprecated( +since = "0.4.0", +note = "It will be move to other location like wasm. since 0.5" +)] mod ffi; #[doc(hidden)] mod parser; @@ -623,7 +627,7 @@ impl Compiled { /// ``` #[derive(Clone, Debug)] pub struct PathCompiled<'a> { - parser: Rc>>, + parser: Rc>, } impl<'a> PathCompiled<'a> { @@ -633,7 +637,7 @@ impl<'a> PathCompiled<'a> { pub fn compile(path: &str) -> Result { let parser = PathParser::compile(path).map_err(|e| JsonPathError::from(&e))?; Ok(PathCompiled { - parser: Rc::new(Box::new(parser)) + parser: Rc::new(parser) }) } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ae23cfc1..affb887a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -517,7 +517,7 @@ impl Parser { match tokenizer.next_token() { Ok(Token::Key(pos, frac)) => { let mut f = String::new(); - f.push_str(&num); + f.push_str(num); f.push('.'); f.push_str(frac.as_str()); let number = utils::string_to_num(&f, || tokenizer.err_msg_with_pos(pos))?; diff --git a/src/paths/path_parser.rs b/src/paths/path_parser.rs index 83c27b8f..2df6acf2 100644 --- a/src/paths/path_parser.rs +++ b/src/paths/path_parser.rs @@ -27,7 +27,7 @@ impl<'a> PathParser<'a> { let token_reader = &self.parser.token_reader; if let Some(parse_node) = self.parser.parse_node.as_ref() { - self.visit(&parse_node, parse_token_handler, &|s| { + self.visit(parse_node, parse_token_handler, &|s| { token_reader.read_value(s) }); } @@ -347,7 +347,7 @@ impl<'a> ParserImpl<'a> { match self.token_reader.next_token() { Ok(Token::Key(s)) => { let str_step = self.token_reader.read_value(&s); - match Self::string_to_num(&str_step, || self.token_reader.to_error()) { + match Self::string_to_num(str_step, || self.token_reader.to_error()) { Ok(step) => Ok(Some(step)), Err(e) => Err(e), } @@ -495,7 +495,7 @@ impl<'a> ParserImpl<'a> { match self.token_reader.peek_token() { Ok(Token::Dot(_)) => self.term_num_float(val), _ => { - let number = Self::string_to_num(&val, || self.token_reader.to_error())?; + let number = Self::string_to_num(val, || self.token_reader.to_error())?; Ok(self.create_node(ParseToken::Number(number))) } } @@ -520,7 +520,7 @@ impl<'a> ParserImpl<'a> { fn term(&mut self) -> Result { debug!("#term"); - if let Err(_) = self.token_reader.peek_token() { + if self.token_reader.peek_token().is_err() { return Err(self.token_reader.to_error()); } diff --git a/src/paths/tokenizer.rs b/src/paths/tokenizer.rs index 52fd4030..fd61c7e5 100644 --- a/src/paths/tokenizer.rs +++ b/src/paths/tokenizer.rs @@ -229,7 +229,7 @@ impl<'a> Tokenizer<'a> { let (span, ch) = self.input.next_char().map_err(to_token_error)?; match self.read_token(span, ch) { Ok(t) => Ok(t), - Err(e) => Err(e.clone()), + Err(e) => Err(e), } } diff --git a/src/select/expr_term.rs b/src/select/expr_term.rs index 60f47564..0130913e 100644 --- a/src/select/expr_term.rs +++ b/src/select/expr_term.rs @@ -20,17 +20,17 @@ impl<'a> ExprTerm<'a> { match &self { ExprTerm::String(s1) => match &other { ExprTerm::String(s2) => ExprTerm::Bool(cmp_fn.cmp_string(s1, s2)), - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Number(n1) => match &other { ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(to_f64(n1), to_f64(n2))), - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Bool(b1) => match &other { ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Json(rel, fk1, vec1) => { diff --git a/src/select/mod.rs b/src/select/mod.rs index 1355b7ae..7da78422 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -153,7 +153,7 @@ impl<'a> FilterTerms<'a> { fn filter_all_with_str(&mut self, current: &Option>, key: &str) { self.filter(current, |vec, tmp, _| { - ValueWalker::all_with_str(&vec, tmp, key, true); + ValueWalker::all_with_str(vec, tmp, key, true); FilterKey::All }); @@ -294,7 +294,7 @@ impl<'a> FilterTerms<'a> { fn collect_all(&mut self, current: &Option>) -> Option> { if let Some(current) = current { let mut tmp = Vec::new(); - ValueWalker::all(¤t, &mut tmp); + ValueWalker::all(current, &mut tmp); return Some(tmp); } debug!("collect_all: {:?}", ¤t); @@ -305,7 +305,7 @@ impl<'a> FilterTerms<'a> { fn collect_all_with_str(&mut self, current: &Option>, key: &str) -> Option> { if let Some(current) = current { let mut tmp = Vec::new(); - ValueWalker::all_with_str(¤t, &mut tmp, key, false); + ValueWalker::all_with_str(current, &mut tmp, key, false); return Some(tmp); } @@ -317,7 +317,7 @@ impl<'a> FilterTerms<'a> { fn collect_all_with_num(&mut self, current: &Option>, index: f64) -> Option> { if let Some(current) = current { let mut tmp = Vec::new(); - ValueWalker::all_with_num(¤t, &mut tmp, index); + ValueWalker::all_with_num(current, &mut tmp, index); return Some(tmp); } @@ -944,7 +944,7 @@ impl SelectorMut { fn select(&self) -> Result, JsonPathError> { if let Some(node) = &self.path { let mut selector = Selector::default(); - selector.compiled_path(&node); + selector.compiled_path(node); if let Some(value) = &self.value { selector.value(value); diff --git a/src/select/value_walker.rs b/src/select/value_walker.rs index 87a0deff..63be27df 100644 --- a/src/select/value_walker.rs +++ b/src/select/value_walker.rs @@ -59,7 +59,7 @@ impl<'a> ValueWalker { } Value::Object(map) => { for (_, v) in map { - Self::_walk(&v, tmp, fun); + Self::_walk(v, tmp, fun); } } _ => {} diff --git a/src/selector/selector_impl.rs b/src/selector/selector_impl.rs index baf6e851..81e93a29 100644 --- a/src/selector/selector_impl.rs +++ b/src/selector/selector_impl.rs @@ -12,7 +12,7 @@ use super::terms::*; #[derive(Debug, Default)] pub struct JsonSelector<'a> { - parser: Option>>>, + parser: Option>>, value: Option<&'a Value>, tokens: Vec, current: Option>, @@ -23,7 +23,7 @@ pub struct JsonSelector<'a> { impl<'a> JsonSelector<'a> { pub fn new(parser: PathParser<'a>) -> Self { JsonSelector { - parser: Some(Rc::new(Box::new(parser))), + parser: Some(Rc::new(parser)), value: None, tokens: Vec::new(), current: None, @@ -32,7 +32,7 @@ impl<'a> JsonSelector<'a> { } } - pub fn new_ref(parser: Rc>>) -> Self { + pub fn new_ref(parser: Rc>) -> Self { JsonSelector { parser: Some(parser), value: None, @@ -44,11 +44,11 @@ impl<'a> JsonSelector<'a> { } pub fn reset_parser(&mut self, parser: PathParser<'a>) -> &mut Self { - self.parser = Some(Rc::new(Box::new(parser))); + self.parser = Some(Rc::new(parser)); self } - pub fn reset_parser_ref(&mut self, parser: Rc>>) -> &mut Self { + pub fn reset_parser_ref(&mut self, parser: Rc>) -> &mut Self { self.parser = Some(parser); self } @@ -284,20 +284,20 @@ impl<'a> JsonSelector<'a> { if self.selector_filter.is_term_empty() { match t { ParseToken::Leaves => { - self.current = self.selector_filter.collect_all_with_str(self.current.take(), &key) + self.current = self.selector_filter.collect_all_with_str(self.current.take(), key) } ParseToken::In => { - self.current = self.selector_filter.collect_next_with_str(self.current.take(), &[&key]) + self.current = self.selector_filter.collect_next_with_str(self.current.take(), &[key]) } _ => {} } } else { match t { ParseToken::Leaves => { - self.current = self.selector_filter.filter_all_with_str(self.current.take(), &key); + self.current = self.selector_filter.filter_all_with_str(self.current.take(), key); } ParseToken::In => { - self.current = self.selector_filter.filter_next_with_str(self.current.take(), &key); + self.current = self.selector_filter.filter_next_with_str(self.current.take(), key); } _ => {} } @@ -433,7 +433,7 @@ impl<'a> ParseTokenHandler<'a> for JsonSelector<'a> { { debug!("token: {:?}, stack: {:?}", token, self.tokens); - if self.compute_absolute_path_filter(&token, parse_value_reader) { + if self.compute_absolute_path_filter(token, parse_value_reader) { return; } @@ -472,15 +472,15 @@ impl<'a> ParseTokenHandler<'a> for JsonSelector<'a> { #[derive(Default)] pub struct JsonSelectorMut<'a> { value: Option, - parser: Option>>>, + parser: Option>>, } impl<'a> JsonSelectorMut<'a> { pub fn new(parser: PathParser<'a>) -> Self { - Self::new_ref(Rc::new(Box::new(parser))) + Self::new_ref(Rc::new(parser)) } - pub fn new_ref(parser: Rc>>) -> Self { + pub fn new_ref(parser: Rc>) -> Self { JsonSelectorMut { value: None, parser: Some(parser), @@ -488,11 +488,11 @@ impl<'a> JsonSelectorMut<'a> { } pub fn reset_parser(&mut self, parser: PathParser<'a>) -> &mut Self { - self.parser = Some(Rc::new(Box::new(parser))); + self.parser = Some(Rc::new(parser)); self } - pub fn reset_parser_ref(&mut self, parser: Rc>>) -> &mut Self { + pub fn reset_parser_ref(&mut self, parser: Rc>) -> &mut Self { self.parser = Some(parser); self } diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 96f34f7e..9e76354a 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -32,17 +32,17 @@ impl<'a> ExprTerm<'a> { ExprTerm::Bool(cmp_fn.cmp_string(k1, k2)) } - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Number(n1) => match &other { ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Bool(b1) => match &other { ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), - ExprTerm::Json(_, _, _) => other.cmp(&self, reverse_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), _ => ExprTerm::Bool(cmp_fn.default()), }, ExprTerm::Json(rel, fk1, vec1) => { @@ -277,7 +277,7 @@ impl<'a> FilterTerms<'a> { } else { let not_matched = not_matched.unwrap(); let filtered = vec.iter().enumerate() - .filter(|(idx, _)| !not_matched.contains(&idx)) + .filter(|(idx, _)| !not_matched.contains(idx)) .map(|(_, v)| *v).collect(); self.push_term(Some(ExprTerm::Json(Some(filtered), Some(filter_key), collected))); } @@ -319,7 +319,7 @@ impl<'a> FilterTerms<'a> { pub fn filter_all_with_str(&mut self, current: Option>, key: &'a str) -> Option> { let current = self.filter(current, |vec, _| { - (FilterKey::All, ValueWalker::all_with_str(vec, key, true)) + (FilterKey::All, ValueWalker::all_with_str(vec, key)) }); debug!("filter_all_with_str : {}, {:?}", key, self.0); @@ -450,7 +450,7 @@ impl<'a> FilterTerms<'a> { return current; } - let ret = ValueWalker::all_with_str(current.unwrap(), key, false); + let ret = ValueWalker::all_with_str(current.unwrap(), key); Some(ret) } diff --git a/src/selector/utils.rs b/src/selector/utils.rs index e124221f..c68f1ad2 100644 --- a/src/selector/utils.rs +++ b/src/selector/utils.rs @@ -18,7 +18,7 @@ pub fn abs_index(n: isize, len: usize) -> usize { } } -pub fn to_path_str<'a>(key: &'a str) -> (&'a str, Option) { +pub fn to_path_str(key: &str) -> (&str, Option) { let key = if key.starts_with('\'') || key.starts_with('"') { let s = &key[1..key.len() - 1]; if key.contains('\\') { diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index 8c7d5486..7e029270 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -16,28 +16,12 @@ impl<'a> ValueWalker { }) } - pub fn all_with_str(vec: Vec<&'a Value>, key: &'a str, is_filter: bool) -> Vec<&'a Value> { + pub fn all_with_str(vec: Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { let (key, opt) = utils::to_path_str(key); let k = if let Some(opt) = opt.as_ref() { opt } else { key }; - Self::walk(vec, &|v, acc| { - if is_filter { - match v { - Value::Object(map) => { - if let Some(v) = map.get(k) { - acc.push(v); - } - } - _ => {} - } - } else { - match v { - Value::Object(map) => { - if let Some(v) = map.get(k) { - acc.push(v); - } - } - _ => {} - } + Self::walk(vec, &|v, acc| if let Value::Object(map) = v { + if let Some(v) = map.get(k) { + acc.push(v); } }) } @@ -96,7 +80,7 @@ impl<'a> ValueWalker { vec.iter().for_each(|v| Self::_walk(v, acc, fun)); } Value::Object(map) => { - map.values().into_iter().for_each(|v| Self::_walk(&v, acc, fun)); + map.values().into_iter().for_each(|v| Self::_walk(v, acc, fun)); } _ => {} } diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index e99fe13c..6236ea08 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -5,8 +5,11 @@ extern crate serde_json; extern crate wasm_bindgen; use cfg_if::cfg_if; +#[allow(deprecated)] use jsonpath::Selector as _Selector; +#[allow(deprecated)] use jsonpath::SelectorMut as _SelectorMut; +#[allow(deprecated)] use jsonpath::{JsonPathError, Parser}; use serde_json::Value; use wasm_bindgen::prelude::*; @@ -40,8 +43,8 @@ macro_rules! console_error { } fn into_serde_json(js_value: &JsValue) -> Result -where - D: for<'a> serde::de::Deserialize<'a>, + where + D: for<'a> serde::de::Deserialize<'a>, { if js_value.is_string() { match serde_json::from_str(js_value.as_string().unwrap().as_str()) { @@ -81,7 +84,8 @@ fn replace_fun(v: Value, fun: &js_sys::Function) -> Option { #[wasm_bindgen] pub fn compile(path: &str) -> JsValue { - let node = Parser::compile(path); + #[allow(deprecated)] + let node = Parser::compile(path); if let Err(e) = &node { return JsValue::from_str(&format!("{:?}", JsonPathError::Path(e.clone()))); @@ -93,7 +97,8 @@ pub fn compile(path: &str) -> JsValue { Err(e) => return JsValue::from_str(&format!("{:?}", JsonPathError::Serde(e))), }; - let mut selector = _Selector::new(); + #[allow(deprecated)] + let mut selector = _Selector::new(); match &node { Ok(node) => selector.compiled_path(node), @@ -121,23 +126,24 @@ pub fn selector(js_value: JsValue) -> JsValue { Err(e) => return JsValue::from_str(&format!("{:?}", JsonPathError::Serde(e.to_string()))), }; + #[allow(deprecated)] let cb = Closure::wrap( Box::new(move |path: String| match Parser::compile(path.as_str()) { - Ok(node) => { - let mut selector = _Selector::new(); - let _ = selector.compiled_path(&node); - match selector.value(&json).select() { - Ok(ret) => match JsValue::from_serde(&ret) { - Ok(ret) => ret, - Err(e) => { - JsValue::from_str(&format!("{:?}", JsonPathError::Serde(e.to_string()))) - } - }, - Err(e) => JsValue::from_str(&format!("{:?}", e)), + Ok(node) => { + let mut selector = _Selector::new(); + let _ = selector.compiled_path(&node); + match selector.value(&json).select() { + Ok(ret) => match JsValue::from_serde(&ret) { + Ok(ret) => ret, + Err(e) => { + JsValue::from_str(&format!("{:?}", JsonPathError::Serde(e.to_string()))) + } + }, + Err(e) => JsValue::from_str(&format!("{:?}", e)), + } } - } - Err(e) => JsValue::from_str(&format!("{:?}", JsonPathError::Path(e))), - }) as Box JsValue>, + Err(e) => JsValue::from_str(&format!("{:?}", JsonPathError::Path(e))), + }) as Box JsValue>, ); let ret = cb.as_ref().clone(); @@ -227,11 +233,12 @@ impl Selector { #[wasm_bindgen(catch, js_name = select)] pub fn select(&mut self) -> Result { + #[allow(deprecated)] let mut selector = _Selector::new(); if let Some(path) = &self.path { let _ = selector - .str_path(&path) + .str_path(path) .map_err(|e| JsValue::from_str(&format!("{:?}", e)))?; } else { return Err(JsValue::from_str(&format!( @@ -295,6 +302,7 @@ impl SelectorMut { #[wasm_bindgen(catch, js_name = "deleteValue")] pub fn delete(&mut self) -> Result<(), JsValue> { + #[allow(deprecated)] let mut selector = _SelectorMut::new(); if let Some(path) = &self.path { @@ -326,6 +334,7 @@ impl SelectorMut { #[wasm_bindgen(catch, js_name = replaceWith)] pub fn replace_with(&mut self, fun: js_sys::Function) -> Result<(), JsValue> { + #[allow(deprecated)] let mut selector = _SelectorMut::new(); if let Some(path) = &self.path { From ff4ed1c811cc1360d77af819c50a93e7fe025540 Mon Sep 17 00:00:00 2001 From: freestrings Date: Tue, 3 Aug 2021 00:15:26 +0900 Subject: [PATCH 15/22] rewrite small logic --- benchmark/flame.svg | 2650 ++++++++++++++++++---------------- src/lib.rs | 4 +- src/selector/terms.rs | 304 ++-- src/selector/value_walker.rs | 5 +- 4 files changed, 1592 insertions(+), 1371 deletions(-) diff --git a/benchmark/flame.svg b/benchmark/flame.svg index 12e4682a..6e5719bb 100644 --- a/benchmark/flame.svg +++ b/benchmark/flame.svg @@ -1,6 +1,6 @@ - + @@ -364,2493 +364,2657 @@ } ]]> - + Flame Graph - + Reset Zoom Search ic - + -core::core_arch::simd::i8x16::new (3 samples, 1.59%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.72%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.53%) - +alloc::boxed::Box<T>::new (1 samples, 0.57%) + -core::hash::sip::u8to64_le (1 samples, 0.53%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -_rust_alloc (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (11 samples, 6.32%) +jsonpath.. -jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) - +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.57%) + -jsonpath_lib_benches::main (179 samples, 94.71%) -jsonpath_lib_benches::main +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (10 samples, 5.75%) +<serde_.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.53%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.15%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 2.30%) +<.. -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.65%) -<a.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.57%) + -core::num::<impl u64>::rotate_left (1 samples, 0.53%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (5 samples, 2.87%) +<c.. -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.53%) - +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (163 samples, 93.68%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once -_memmove_avx_unaligned_erms (1 samples, 0.53%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (6 samples, 3.45%) +<al.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.59%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 3.45%) +ind.. -jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.59%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (4 samples, 2.30%) +j.. -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) - +alloc::alloc::exchange_malloc (1 samples, 0.57%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.30%) +c.. -hashbrown::raw::RawTableInner<A>::prepare_insert_slot (6 samples, 3.17%) -has.. +unmap_single_vma (1 samples, 0.57%) + -int_free (1 samples, 0.53%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (5 samples, 2.87%) +js.. -jsonpath_lib::selector::terms::ExprTerm::or (31 samples, 16.40%) -jsonpath_lib::selector::t.. +memcpy_erms (7 samples, 4.02%) +memc.. -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) - +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) +cor.. -core::option::Option<T>::get_or_insert_with (3 samples, 1.59%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (3 samples, 1.72%) + -indexmap::map::core::equivalent::{{closure}} (10 samples, 5.29%) -indexm.. +do_exit (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::all (28 samples, 16.09%) +core::iter::traits::iter.. -alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (4 samples, 2.30%) +c.. -jsonpath_lib::selector::terms::ExprTerm::gt (16 samples, 8.47%) -jsonpath_lib.. +_GI___libc_malloc (1 samples, 0.57%) + -hashbrown::raw::RawTableInner<A>::fallible_with_capacity (3 samples, 1.59%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) + -alloc::vec::Vec<T,A>::reserve (4 samples, 2.12%) -a.. +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (4 samples, 2.30%) +j.. -jsonpath_lib::selector::terms::FilterTerms::new_filter_context (1 samples, 0.53%) - +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::fold (44 samples, 23.28%) -core::iter::traits::iterator::Iterat.. +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (2 samples, 1.06%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) +<c.. -alloc::alloc::dealloc (2 samples, 1.06%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (64 samples, 36.78%) +jsonpath_lib::selector::selector_impl::JsonSelector::visit_.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.06%) - +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) +<c.. -core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (3 samples, 1.59%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) + -_GI___libc_free (2 samples, 1.06%) - +std::collections::hash::set::HashSet<T>::new (1 samples, 0.57%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.06%) - +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (10 samples, 5.75%) +<jsonpa.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::all::check::{{closure}} (27 samples, 15.52%) +core::iter::traits::ite.. -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) - +_vma_adjust (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (3 samples, 1.59%) - +core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>>> (6 samples, 3.45%) +cor.. -hashbrown::raw::inner::RawTable<T,A>::get (5 samples, 2.65%) -ha.. +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.57%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (6 samples, 3.17%) -jso.. +indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.57%) + -std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +core::ptr::write (3 samples, 1.72%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) + -hashbrown::raw::RawTable<T,A>::reserve_rehash (18 samples, 9.52%) -hashbrown::ra.. +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.30%) +c.. -core::iter::traits::iterator::Iterator::for_each (44 samples, 23.28%) -core::iter::traits::iterator::Iterat.. +dl_fixup (1 samples, 0.57%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 1.59%) - +indexmap::map::IndexMap<K,V,S>::get (24 samples, 13.79%) +indexmap::map::Index.. -<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.53%) - +<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (6 samples, 3.45%) +<al.. -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (7 samples, 4.02%) +json.. -<f64 as core::ops::arith::Mul>::mul (1 samples, 0.53%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.15%) + -alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.53%) - +hashbrown::raw::sse2::Group::static_empty (1 samples, 0.57%) + -core::core_arch::simd::i8x16::new (1 samples, 0.53%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.30%) +<.. -jsonpath_lib::paths::path_parser::ParserImpl::op (6 samples, 3.17%) -jso.. +jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.57%) + -core::result::Result<T,E>::map_err (1 samples, 0.53%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.06%) - +_memcmp_avx2_movbe (2 samples, 1.15%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.53%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (11 samples, 6.32%) +<alloc::.. -core::num::<impl u64>::rotate_left (1 samples, 0.53%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.06%) - +alloc::vec::Vec<T,A>::reserve (1 samples, 0.57%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.06%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) - +core::iter::adapters::map::map_fold::{{closure}} (1 samples, 0.57%) + -begin_new_exec (7 samples, 3.70%) -begi.. +core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::hash (3 samples, 1.59%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) + -hashbrown::map::HashMap<K,V,S,A>::contains_key (2 samples, 1.06%) - +int_free (1 samples, 0.57%) + -core::ptr::mut_ptr::<impl *mut T>::offset (3 samples, 1.59%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.53%) - +int_realloc (1 samples, 0.57%) + -hashbrown::raw::inner::Bucket<T>::from_base_index (3 samples, 1.59%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::find (16 samples, 8.47%) -hashbrown::r.. +hashbrown::raw::inner::RawIterHashInner<A>::new (2 samples, 1.15%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +hashbrown::raw::RawTableInner<A>::prepare_resize::{{closure}} (1 samples, 0.57%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) - +_x64_sys_execve (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +hashbrown::set::HashSet<T,S,A>::contains (5 samples, 2.87%) +ha.. -alloc::alloc::alloc (1 samples, 0.53%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.72%) + -indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.65%) -in.. +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) + -core::str::<impl str>::parse (3 samples, 1.59%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) + -tcache_put (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) + -core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.72%) + -core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +core::option::Option<T>::map_or (3 samples, 1.72%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.12%) -<.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::get (10 samples, 5.29%) -hashbr.. +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (3 samples, 1.72%) + -alloc::raw_vec::RawVec<T,A>::reserve (3 samples, 1.59%) - +hashbrown::raw::is_full (2 samples, 1.15%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.06%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::filter (31 samples, 16.40%) -jsonpath_lib::paths::path.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.72%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (4 samples, 2.30%) +c.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 1.06%) - +core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.57%) + -alloc::alloc::alloc (2 samples, 1.06%) - +core::ptr::drop_in_place<hashbrown::scopeguard::ScopeGuard<hashbrown::raw::RawTableInner<alloc::alloc::Global>,hashbrown::raw::RawTableInner<alloc::alloc::Global>::prepare_resize::{{closure}}>> (1 samples, 0.57%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (30 samples, 15.87%) -<indexmap::map::IndexMap.. +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (31 samples, 16.40%) -<jsonpath_lib::selector::.. +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (6 samples, 3.45%) +jso.. -core::iter::traits::iterator::Iterator::all::check::{{closure}} (11 samples, 5.82%) -core::i.. +indexmap::map::IndexMap<K,V,S>::hash (6 samples, 3.45%) +ind.. -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) + -hashbrown::set::HashSet<T,S,A>::contains (2 samples, 1.06%) - +alloc::raw_vec::finish_grow (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.57%) + -int_malloc (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +core::ops::function::FnOnce::call_once (163 samples, 93.68%) +core::ops::function::FnOnce::call_once -core::num::<impl u64>::wrapping_add (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (5 samples, 2.87%) +co.. -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.15%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.06%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.30%) +c.. -alloc::alloc::Global::alloc_impl (2 samples, 1.06%) - +core::char::methods::<impl char>::is_whitespace (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::close_token (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +core::ptr::mut_ptr::<impl *mut T>::sub (2 samples, 1.15%) + -core::ptr::mut_ptr::<impl *mut T>::sub (3 samples, 1.59%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (2 samples, 1.15%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (31 samples, 16.40%) -core::cmp::impls::<impl c.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) - +jsonpath_lib_benches::main (163 samples, 93.68%) +jsonpath_lib_benches::main -jsonpath_lib::paths::path_parser::ParserImpl::exprs (31 samples, 16.40%) -jsonpath_lib::paths::path.. +hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.72%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.59%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) + -hashbrown::raw::inner::RawTableInner<A>::bucket (3 samples, 1.59%) - +hashbrown::raw::RawTableInner<A>::set_ctrl (1 samples, 0.57%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (9 samples, 4.76%) -core:.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) + -alloc::raw_vec::finish_grow (1 samples, 0.53%) - +hashbrown::raw::RawIterHashInner<A>::new (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.57%) + -jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::lt (8 samples, 4.60%) +jsonp.. -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.72%) + -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.15%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.53%) - +<alloc::string::String as core::cmp::PartialEq>::eq (4 samples, 2.30%) +<.. -core::num::<impl u64>::wrapping_add (1 samples, 0.53%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (7 samples, 4.02%) +<all.. -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (7 samples, 3.70%) -<cor.. +hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::hash (4 samples, 2.12%) -i.. +jsonpath_lib::selector::terms::ExprTerm::cmp_json (11 samples, 6.32%) +jsonpath.. -alloc::vec::Vec<T,A>::push (1 samples, 0.53%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.72%) + -jsonpath_lib::paths::path_parser::ParserImpl::op (8 samples, 4.23%) -jsonp.. +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::op (3 samples, 1.72%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (3 samples, 1.59%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.57%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) -c.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (4 samples, 2.30%) +<.. -core::ptr::write (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.57%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) -<.. +hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.57%) + -core::num::dec2flt::convert (2 samples, 1.06%) - +alloc::alloc::Global::alloc_impl (1 samples, 0.57%) + -core::num::dec2flt::algorithm::fast_path (2 samples, 1.06%) - +<alloc::string::String as core::hash::Hash>::hash (4 samples, 2.30%) +<.. -<hashbrown::raw::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +hashbrown::map::HashMap<K,V,S,A>::contains_key (5 samples, 2.87%) +ha.. -IO_new_file_underflow (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (4 samples, 2.30%) +j.. -jsonpath_lib::paths::path_parser::PathParser::parse (133 samples, 70.37%) -jsonpath_lib::paths::path_parser::PathParser::parse +_GI___libc_malloc (1 samples, 0.57%) + -core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (2 samples, 1.06%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (10 samples, 5.75%) +<indexm.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (9 samples, 4.76%) -core:.. +core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.15%) + -hashbrown::map::make_hasher::{{closure}} (5 samples, 2.65%) -ha.. +core::ptr::drop_in_place<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>> (6 samples, 3.45%) +cor.. -hashbrown::raw::RawTableInner<A>::prepare_resize::{{closure}} (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) - +alloc::alloc::dealloc (2 samples, 1.15%) + -std::collections::hash::set::HashSet<T,S>::contains (2 samples, 1.06%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (1 samples, 0.57%) + -core::ops::function::FnOnce::call_once (179 samples, 94.71%) -core::ops::function::FnOnce::call_once +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.57%) + -std::sys_common::backtrace::_rust_begin_short_backtrace (179 samples, 94.71%) -std::sys_common::backtrace::_rust_begin_short_backtrace +core::hash::impls::<impl core::hash::Hash for str>::hash (4 samples, 2.30%) +c.. -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.53%) - +int_free (1 samples, 0.57%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.06%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 2.30%) +<.. -std::sys::unix::thread::guard::get_stack_start (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (9 samples, 5.17%) +<core:.. -entry_SYSCALL_64_after_hwframe (7 samples, 3.70%) -entr.. +jsonpath_lib::paths::path_parser::ParserImpl::paths (5 samples, 2.87%) +js.. -std::thread::local::LocalKey<T>::try_with (1 samples, 0.53%) - +core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.57%) + -_set_task_comm (7 samples, 3.70%) -_set.. +int_free (1 samples, 0.57%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.06%) - +alloc::alloc::Global::alloc_impl (1 samples, 0.57%) + -alloc::vec::Vec<T,A>::push (1 samples, 0.53%) - +core::core_arch::simd::i8x16::new (1 samples, 0.57%) + -std::sys::unix::thread::guard::init (1 samples, 0.53%) - +hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.57%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +alloc::alloc::dealloc (1 samples, 0.57%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (16 samples, 8.47%) -<alloc::vec:.. +indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.87%) +in.. -core::str::validations::next_code_point (1 samples, 0.53%) - +hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (1 samples, 0.57%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) -c.. +jsonpath_lib::paths::path_parser::ParserImpl::term (2 samples, 1.15%) + -alloc::vec::Vec<T>::with_capacity (1 samples, 0.53%) - +std::panicking::try::do_call (163 samples, 93.68%) +std::panicking::try::do_call -core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) - +alloc::alloc::box_free (2 samples, 1.15%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) + -int_malloc (1 samples, 0.53%) - +IO_new_fopen (1 samples, 0.57%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (72 samples, 38.10%) -jsonpath_lib::selector::selector_impl::JsonSelector::visit_fi.. +core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.72%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (3 samples, 1.72%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 2.12%) -a.. +hashbrown::raw::RawTableInner<A>::new_in (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.59%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (4 samples, 2.30%) +s.. -core::cell::Cell<T>::set (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (7 samples, 3.70%) -<cor.. +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) + -core::hash::Hasher::write_u8 (1 samples, 0.53%) - +_GI___libc_malloc (2 samples, 1.15%) + -main (180 samples, 95.24%) -main +<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.72%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (13 samples, 7.47%) +jsonpath_l.. -hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.57%) + -core::core_arch::x86::sse2::mm_set1_epi8 (3 samples, 1.59%) - +core::option::Option<T>::get_or_insert_with (4 samples, 2.30%) +c.. -jsonpath_lib::selector::terms::ExprTerm::lt (7 samples, 3.70%) -json.. +<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (1 samples, 0.57%) + -core::core_arch::simd::i8x16::new (1 samples, 0.53%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (44 samples, 23.28%) -core::iter::traits::iterator::Iterat.. +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.15%) + -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.06%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::push (1 samples, 0.57%) + -_GI___libc_malloc (2 samples, 1.06%) - +_x64_sys_execve (7 samples, 4.02%) +_x64.. -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (9 samples, 4.76%) -<[A] .. +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::expr (13 samples, 6.88%) -jsonpath_.. +<serde_json::value::Value as core::cmp::PartialEq>::eq (2 samples, 1.15%) + -core::ptr::const_ptr::<impl *const T>::offset (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.65%) -se.. +alloc::alloc::dealloc (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (4 samples, 2.12%) -a.. +jsonpath_lib::paths::path_parser::ParserImpl::filter (23 samples, 13.22%) +jsonpath_lib::paths:.. -indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) + -jsonpath_lib::paths::path_parser::ParserImpl::array (32 samples, 16.93%) -jsonpath_lib::paths::path_.. +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.15%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (3 samples, 1.59%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (4 samples, 2.30%) +c.. -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) + -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.53%) - +std::panicking::try::do_call (164 samples, 94.25%) +std::panicking::try::do_call -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.06%) - +all (174 samples, 100%) + -_libc_start_main (180 samples, 95.24%) -_libc_start_main +hashbrown::raw::RawTable<T,A>::find (3 samples, 1.72%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.06%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.65%) -in.. +core::iter::traits::iterator::Iterator::for_each (36 samples, 20.69%) +core::iter::traits::iterator::It.. -<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.53%) - +do_syscall_64 (2 samples, 1.15%) + -hashbrown::map::HashMap<K,V,S,A>::get_inner (2 samples, 1.06%) - +hashbrown::raw::RawTable<T,A>::get (3 samples, 1.72%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::get (9 samples, 5.17%) +hashbr.. -alloc::vec::Vec<T,A>::as_ptr (1 samples, 0.53%) - +std::panicking::try (163 samples, 93.68%) +std::panicking::try -std::collections::hash::set::HashSet<T>::new (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.15%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (12 samples, 6.35%) -<indexma.. +_memcmp_avx2_movbe (1 samples, 0.57%) + -core::num::<impl u64>::wrapping_add (1 samples, 0.53%) - +core::hash::Hasher::write_usize (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (5 samples, 2.87%) +in.. -<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.53%) - +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (7 samples, 3.70%) -<std.. +ptmalloc_init (1 samples, 0.57%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (9 samples, 4.76%) -core:.. +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.57%) + -tcache_get (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) + -jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (43 samples, 22.75%) -jsonpath_lib::selector::value_walke.. +core::ptr::write (1 samples, 0.57%) + -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.72%) + -alloc::alloc::alloc (3 samples, 1.59%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.59%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (29 samples, 16.67%) +jsonpath_lib::selector::t.. -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (5 samples, 2.65%) -<a.. +core::num::<impl u64>::wrapping_add (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::all (12 samples, 6.35%) -core::it.. +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) + -core::slice::<impl [T]>::iter (1 samples, 0.53%) - +exec_binprm (7 samples, 4.02%) +exec.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (122 samples, 70.11%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -hashbrown::raw::RawTable<T,A>::get (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other::{{closure}} (1 samples, 0.57%) + -alloc::vec::Vec<T,A>::pop (1 samples, 0.53%) - +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.72%) + -<alloc::alloc::Global as core::alloc::Allocator>::allocate (3 samples, 1.59%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (4 samples, 2.30%) +<.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) - +core::result::Result<T,E>::is_ok (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (2 samples, 1.06%) - +core::iter::traits::iterator::Iterator::fold (1 samples, 0.57%) + -load_elf_binary (7 samples, 3.70%) -load.. +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (10 samples, 5.29%) -indexm.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) + -strlcpy (7 samples, 3.70%) -strl.. +core::core_arch::simd::i8x16::new (2 samples, 1.15%) + -<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::try_fold::check::{{closure}} (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::get (16 samples, 8.47%) -hashbrown::r.. +jsonpath_lib::selector::terms::ExprTerm::and (10 samples, 5.75%) +jsonpat.. -core::iter::traits::iterator::Iterator::all::check::{{closure}} (30 samples, 15.87%) -core::iter::traits::iter.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.57%) + -nv033032rm (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) + -<alloc::alloc::Global as core::alloc::Allocator>::grow (4 samples, 2.12%) -<.. +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.30%) +<.. -indexmap::map::IndexMap<K,V,S>::hash (5 samples, 2.65%) -in.. +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (11 samples, 6.32%) +<alloc::.. -core::hash::sip::u8to64_le (1 samples, 0.53%) - +main (164 samples, 94.25%) +main -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend::{{closure}} (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) - +hashbrown::set::HashSet<T,S,A>::insert (15 samples, 8.62%) +hashbrown::s.. -core::core_arch::x86::sse2::mm_set_epi8 (3 samples, 1.59%) - +core::hash::Hasher::write_u8 (1 samples, 0.57%) + -int_free (2 samples, 1.06%) - +std::sys_common::backtrace::_rust_begin_short_backtrace (163 samples, 93.68%) +std::sys_common::backtrace::_rust_begin_short_backtrace -_do_execve_fil.sr. (7 samples, 3.70%) -_do_.. +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.87%) +se.. -<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (10 samples, 5.75%) +jsonpat.. -core::hash::Hasher::write_u8 (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.65%) -in.. +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.57%) + -_GI___libc_malloc (2 samples, 1.06%) - +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.30%) +<.. -alloc::alloc::box_free (2 samples, 1.06%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (6 samples, 3.45%) +cor.. -hashbrown::raw::RawTable<T,A>::insert (22 samples, 11.64%) -hashbrown::raw::R.. +std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) + -std::collections::hash::set::HashSet<T,S>::insert (27 samples, 14.29%) -std::collections::has.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (2 samples, 1.15%) + -core::iter::traits::iterator::Iterator::collect (6 samples, 3.17%) -cor.. +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.87%) +<a.. -hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.59%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.53%) - +_memcmp_avx2_movbe (2 samples, 1.15%) + -_memcmp_avx2_movbe (1 samples, 0.53%) - +load_elf_binary (7 samples, 4.02%) +load.. -core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) -c.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) + -hashbrown::raw::bitmask::BitMask::lowest_set_bit (3 samples, 1.59%) - +jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.57%) + -hashbrown::raw::RawTable<T,A>::resize (18 samples, 9.52%) -hashbrown::ra.. +hashbrown::raw::RawTable<T,A>::insert (12 samples, 6.90%) +hashbrown.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) + -alloc::alloc::box_free (2 samples, 1.06%) - +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.57%) + -core::num::dec2flt::parse::parse_decimal (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::hash (14 samples, 8.05%) +indexmap::m.. -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.06%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) + -core::cell::Cell<T>::replace (1 samples, 0.53%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) + -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.53%) - +core::ptr::mut_ptr::<impl *mut T>::offset (2 samples, 1.15%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) + -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.53%) - +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.57%) + -hashbrown::raw::alloc::inner::do_alloc (3 samples, 1.59%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (6 samples, 3.45%) +<co.. -jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) + -alloc::raw_vec::finish_grow (4 samples, 2.12%) -a.. +hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 3.45%) +has.. -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 1.59%) - +std::rt::lang_start::{{closure}} (163 samples, 93.68%) +std::rt::lang_start::{{closure}} -indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.65%) -in.. +indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.57%) + -core::ptr::write (1 samples, 0.53%) - +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.57%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) + -<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 1.15%) + -core::num::dec2flt::dec2flt (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (1 samples, 0.57%) + -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (179 samples, 94.71%) -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (29 samples, 16.67%) +core::cmp::impls::<impl c.. -jsonpath_lib::paths::str_reader::StrReader::peek_char (1 samples, 0.53%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (42 samples, 24.14%) +jsonpath_lib::selector::terms::FilterT.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::path (6 samples, 3.45%) +jso.. -hashbrown::raw::inner::RawTable<T,A>::iter_hash (3 samples, 1.59%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (2 samples, 1.15%) + -hashbrown::raw::RawTable<T,A>::reserve (19 samples, 10.05%) -hashbrown::raw.. +jsonpath_lib::paths::path_parser::ParserImpl::paths (32 samples, 18.39%) +jsonpath_lib::paths::path_pa.. -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (133 samples, 70.37%) -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle +std::sys::unix::thread::guard::init (1 samples, 0.57%) + -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) + -jsonpath_lib_be (182 samples, 96.30%) -jsonpath_lib_be +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (36 samples, 20.69%) +jsonpath_lib::selector::value_wa.. -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.53%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.57%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (7 samples, 3.70%) -<cor.. +jsonpath_lib::selector::terms::ExprTerm::or (30 samples, 17.24%) +jsonpath_lib::selector::te.. -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) - +int_malloc (1 samples, 0.57%) + -hashbrown::raw::RawTableInner<A>::new_uninitialized (3 samples, 1.59%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (7 samples, 4.02%) +json.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.06%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (8 samples, 4.60%) +index.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.59%) - +alloc::vec::Vec<T>::with_capacity (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.59%) - +jsonpath_lib::paths::path_parser::ParserImpl::array (23 samples, 13.22%) +jsonpath_lib::paths:.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) -c.. +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) + -<alloc::string::String as core::hash::Hash>::hash (3 samples, 1.59%) - +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -core::core_arch::simd::i8x16::new (1 samples, 0.53%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (44 samples, 23.28%) -<core::iter::adapters::enumerate::En.. +core::hash::Hasher::write_u8 (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) + -core::slice::iter::Iter<T>::new (1 samples, 0.53%) - +begin_new_exec (7 samples, 4.02%) +begi.. -indexmap::map::core::equivalent::{{closure}} (2 samples, 1.06%) - +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (121 samples, 69.54%) +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle -std::panicking::try (179 samples, 94.71%) -std::panicking::try +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) -c.. +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) - +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -core::mem::replace (1 samples, 0.53%) - +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) + -do_syscall_64 (1 samples, 0.53%) - +<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (10 samples, 5.75%) +<jsonpa.. + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (27 samples, 15.52%) +<indexmap::map::IndexMa.. -jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (57 samples, 30.16%) -jsonpath_lib::selector::selector_impl::JsonSelec.. +<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (29 samples, 16.67%) +<jsonpath_lib::selector::.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.06%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (9 samples, 5.17%) +hashbr.. -alloc::vec::Vec<T,A>::push (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.72%) + -hashbrown::map::HashMap<K,V,S,A>::insert (27 samples, 14.29%) -hashbrown::map::HashM.. +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) + -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.53%) - +indexmap::map::core::equivalent::{{closure}} (2 samples, 1.15%) + -<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.53%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.15%) + -jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (4 samples, 2.30%) +j.. -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.72%) + -std::sys_common::rt::init (1 samples, 0.53%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) + -dl_sysdep_start (1 samples, 0.53%) - +alloc::alloc::dealloc (2 samples, 1.15%) + -int_free (2 samples, 1.06%) - +core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::push_json_term (48 samples, 25.40%) -jsonpath_lib::selector::terms::FilterTer.. +hashbrown::raw::RawTable<T,A>::new_in (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::reserve (4 samples, 2.12%) -a.. +jsonpath_lib::select (162 samples, 93.10%) +jsonpath_lib::select -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (44 samples, 23.28%) -jsonpath_lib::selector::terms::Filte.. +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (5 samples, 2.87%) +js.. -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.53%) - +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) + -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (30 samples, 15.87%) -<serde_json::map::Map<al.. +alloc::alloc::Global::grow_impl (1 samples, 0.57%) + -alloc::boxed::Box<T>::new (2 samples, 1.06%) - +hashbrown::raw::sse2::Group::match_byte (1 samples, 0.57%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (2 samples, 1.06%) - +jsonpath_lib::paths::path_parser::PathParser::compile (32 samples, 18.39%) +jsonpath_lib::paths::path_pa.. -core::char::methods::<impl char>::is_whitespace (1 samples, 0.53%) - +core::result::Result<T,E>::is_err (1 samples, 0.57%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) + -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (179 samples, 94.71%) -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} +core::num::<impl u64>::rotate_left (4 samples, 2.30%) +c.. -<hashbrown::raw::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +core::core_arch::simd::i8x16::new (1 samples, 0.57%) + -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) + -<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (4 samples, 2.12%) -<.. +alloc::alloc::dealloc (1 samples, 0.57%) + -hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.53%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::hash (11 samples, 5.82%) -indexma.. +jsonpath_lib::paths::path_parser::ParserImpl::op (5 samples, 2.87%) +js.. -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (30 samples, 15.87%) -<indexmap::map::IndexMap.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 2.30%) +<.. -<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (1 samples, 0.53%) - +jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (50 samples, 28.74%) +jsonpath_lib::selector::selector_impl::JsonSe.. -do_syscall_64 (7 samples, 3.70%) -do_s.. +hashbrown::raw::sse2::Group::match_byte (2 samples, 1.15%) + -hashbrown::raw::RawTableInner<A>::prepare_resize (5 samples, 2.65%) -ha.. +_do_execve_fil.sr. (7 samples, 4.02%) +_do_.. -core::ptr::drop_in_place<jsonpath_lib::selector::terms::ExprTerm> (1 samples, 0.53%) - +dl_start_final (1 samples, 0.57%) + -core::num::dec2flt::simplify (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.57%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +jsonpath_lib::selector::selector_impl::JsonSelector::select (122 samples, 70.11%) +jsonpath_lib::selector::selector_impl::JsonSelector::select -alloc::raw_vec::finish_grow (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json (10 samples, 5.75%) +jsonpat.. -jsonpath_lib::paths::path_parser::ParserImpl::paths (37 samples, 19.58%) -jsonpath_lib::paths::path_pars.. +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.53%) - +<log::Level as core::cmp::PartialOrd<log::LevelFilter>>::le (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::get (28 samples, 14.81%) -indexmap::map::IndexMa.. +hashbrown::map::make_insert_hash (1 samples, 0.57%) + -<hashbrown::scopeguard::ScopeGuard<T,F> as core::ops::drop::Drop>::drop (1 samples, 0.53%) - +do_group_exit (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.53%) - +hashbrown::raw::RawTableInner<A>::set_ctrl_h2 (1 samples, 0.57%) + -_GI___libc_malloc (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) + -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) -<.. +exit_mmap (1 samples, 0.57%) + -hashbrown::raw::RawTableInner<A>::find_insert_slot (6 samples, 3.17%) -has.. +std::panic::catch_unwind (164 samples, 94.25%) +std::panic::catch_unwind -alloc::vec::Vec<T,A>::push (3 samples, 1.59%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (1 samples, 0.57%) + -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (10 samples, 5.29%) -<alloc.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) + -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (6 samples, 3.17%) -<al.. +core::str::traits::<impl core::cmp::PartialEq for str>::eq (4 samples, 2.30%) +c.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (7 samples, 3.70%) -<cor.. +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 1.15%) + -alloc::alloc::Global::alloc_impl (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.06%) - +load_elf_binary (1 samples, 0.57%) + -alloc::vec::Vec<T,A>::push (1 samples, 0.53%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (36 samples, 20.69%) +jsonpath_lib::selector::terms::F.. -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 1.72%) + -core::iter::traits::iterator::Iterator::all (30 samples, 15.87%) -core::iter::traits::iter.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::get (10 samples, 5.29%) -indexm.. +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (4 samples, 2.30%) +c.. -core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.53%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (6 samples, 3.17%) -cor.. +core::iter::traits::iterator::Iterator::for_each (163 samples, 93.68%) +core::iter::traits::iterator::Iterator::for_each -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::reserve (3 samples, 1.72%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (4 samples, 2.30%) +c.. -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (9 samples, 4.76%) -<Q as.. +jsonpath_lib_benches::main::{{closure}} (163 samples, 93.68%) +jsonpath_lib_benches::main::{{closure}} -jsonpath_lib::paths::tokenizer::TokenReader::next_token (1 samples, 0.53%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (4 samples, 2.30%) +<.. -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.06%) - +std::sys::unix::thread::guard::get_stack_start (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (9 samples, 5.17%) +<std::.. -hashbrown::raw::RawTable<T,A>::find (2 samples, 1.06%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (2 samples, 1.15%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -_x64_sys_execve (7 samples, 3.70%) -_x64.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.72%) + -core::option::Option<T>::map_or (1 samples, 0.53%) - +<indexmap::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths (5 samples, 2.65%) -js.. +core::iter::traits::iterator::Iterator::collect (7 samples, 4.02%) +core.. -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +core::option::Option<T>::unwrap (1 samples, 0.57%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (3 samples, 1.59%) - +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.57%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (16 samples, 8.47%) -jsonpath_lib.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) + -jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.53%) - +hashbrown::map::make_hash (2 samples, 1.15%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) -c.. +_memcmp_avx2_movbe (2 samples, 1.15%) + -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (4 samples, 2.12%) -c.. +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) + -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (133 samples, 70.37%) -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) + -_memcmp_avx2_movbe (6 samples, 3.17%) -_me.. +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (122 samples, 70.11%) +jsonpath_lib::paths::handlers::ParseNodeVisitor::visit -core::hash::sip::u8to64_le (1 samples, 0.53%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.45%) +cor.. -jsonpath_lib::selector::terms::ExprTerm::cmp (6 samples, 3.17%) -jso.. +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.72%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (1 samples, 0.53%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (2 samples, 1.15%) + -pthread_getattr_np (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (5 samples, 2.87%) +js.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.06%) - +core::iter::traits::iterator::Iterator::try_fold (10 samples, 5.75%) +core::i.. -core::num::dec2flt::dec2flt (2 samples, 1.06%) - +<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::collect (3 samples, 1.72%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.06%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) + -core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (5 samples, 2.65%) -co.. +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.15%) + -jsonpath_lib::selector::selector_impl::JsonSelector::select (134 samples, 70.90%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) + -entry_SYSCALL_64_after_hwframe (1 samples, 0.53%) - +core::ptr::drop_in_place<alloc::vec::Vec< (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) - +jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::grow_amortized (3 samples, 1.59%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.57%) + -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) - +_rust_dealloc (1 samples, 0.57%) + -hashbrown::map::make_insert_hash (4 samples, 2.12%) -h.. +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) + -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (10 samples, 5.75%) +<serde_.. -checked_request2size (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.15%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) + -<std::collections::hash::map::RandomState as core::default::Default>::default (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::gt (12 samples, 6.90%) +jsonpath_.. -jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.59%) - +setup_arg_pages (1 samples, 0.57%) + + + +hashbrown::raw::RawTable<T,A>::iter_hash (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::next (1 samples, 0.57%) + -core::core_arch::x86::sse2::mm_movemask_epi8 (2 samples, 1.06%) - +core::iter::traits::iterator::Iterator::fold (36 samples, 20.69%) +core::iter::traits::iterator::It.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.53%) - +_GI___libc_realloc (1 samples, 0.57%) + -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.53%) - +<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.57%) + -hashbrown::set::HashSet<T,S,A>::insert (27 samples, 14.29%) -hashbrown::set::HashS.. +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (12 samples, 6.90%) +serde_jso.. -exec_binprm (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (5 samples, 2.87%) +js.. -core::hash::Hasher::write_usize (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) + -alloc::vec::Vec<T,A>::reserve (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::reserve_rehash (7 samples, 4.02%) +hash.. -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (4 samples, 2.30%) +i.. -jsonpath_lib::paths::path_parser::ParserImpl::path (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) - +_GI___libc_free (1 samples, 0.57%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +alloc::boxed::Box<T>::new (2 samples, 1.15%) + -int_free (1 samples, 0.53%) - +std::collections::hash::set::HashSet<T,S>::contains (5 samples, 2.87%) +st.. -alloc::alloc::exchange_malloc (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) - +jsonpath_lib_be (167 samples, 95.98%) +jsonpath_lib_be -alloc::raw_vec::finish_grow (2 samples, 1.06%) - +core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (6 samples, 3.45%) +cor.. -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.53%) - +core::iter::traits::iterator::Iterator::collect (11 samples, 6.32%) +core::it.. -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.72%) + -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.12%) -c.. +hashbrown::raw::RawIterHash<T,A>::new (2 samples, 1.15%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (17 samples, 8.99%) -indexmap::ma.. +hashbrown::map::make_hash (2 samples, 1.15%) + -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.15%) + -alloc::alloc::dealloc (2 samples, 1.06%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.45%) +cor.. -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.15%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +hashbrown::map::HashMap<K,V,S,A>::insert (15 samples, 8.62%) +hashbrown::m.. -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) + -core::num::<impl u64>::wrapping_add (2 samples, 1.06%) - +perf (7 samples, 4.02%) +perf + + +shift_arg_pages (1 samples, 0.57%) + -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) + -IO_getdelim (1 samples, 0.53%) - +hashbrown::raw::RawTableInner<A>::find_insert_slot (3 samples, 1.72%) + -alloc::alloc::realloc (1 samples, 0.53%) - +hashbrown::raw::inner::RawIterHash<T,A>::new (2 samples, 1.15%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.53%) - +_x64_sys_exit_group (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) + -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) + -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (44 samples, 23.28%) -<core::iter::adapters::enumerate::En.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) - +core::ptr::write (1 samples, 0.57%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (13 samples, 6.88%) -serde_jso.. +alloc::vec::Vec<T,A>::reserve (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.53%) - +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.06%) - +std::rt::lang_start_internal::{{closure}} (164 samples, 94.25%) +std::rt::lang_start_internal::{{closure}} -alloc::alloc::Global::grow_impl (1 samples, 0.53%) - +entry_SYSCALL_64_after_hwframe (7 samples, 4.02%) +entr.. -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +std::panic::catch_unwind (163 samples, 93.68%) +std::panic::catch_unwind -core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>>> (5 samples, 2.65%) -co.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (28 samples, 16.09%) +<indexmap::map::IndexMap.. -core::num::<impl u64>::rotate_left (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) + -<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (1 samples, 0.53%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.15%) + -core::option::Option<T>::map_or (2 samples, 1.06%) - +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.30%) +c.. -jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.53%) - +core::num::<impl u64>::rotate_left (2 samples, 1.15%) + -exec_binprm (7 samples, 3.70%) -exec.. +alloc::alloc::dealloc (1 samples, 0.57%) + -jsonpath_lib::paths::str_reader::StrReader::next (1 samples, 0.53%) - +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) - +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (7 samples, 4.02%) +<all.. -all (189 samples, 100%) +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) +<c.. + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (6 samples, 3.45%) +cor.. + + +_do_execve_fil.sr. (1 samples, 0.57%) -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (163 samples, 93.68%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} -core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) - +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) - +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (41 samples, 23.56%) +jsonpath_lib::selector::terms::Filter.. -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) - +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.57%) + -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 1.59%) - +alloc::vec::Vec<T,A>::push (3 samples, 1.72%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.15%) + -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.53%) - +int_free (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 1.59%) - +indexmap::map::IndexMap<K,V,S>::get (4 samples, 2.30%) +i.. -alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.65%) -al.. +core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.57%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 1.06%) - +tcache_put (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.53%) - +hashbrown::raw::sse2::Group::match_empty_or_deleted (1 samples, 0.57%) + -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::get_mut (2 samples, 1.15%) + -jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.59%) - +core::core_arch::simd::i8x16::new (2 samples, 1.15%) + -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.53%) - +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.57%) + -int_malloc (1 samples, 0.53%) - +malloc_hook_ini (1 samples, 0.57%) + -core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) + -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (12 samples, 6.35%) -core::cm.. +std::rt::lang_start_internal (164 samples, 94.25%) +std::rt::lang_start_internal -core::hash::sip::Hasher<S>::reset (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::contains_key (12 samples, 6.90%) +indexmap:.. -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.06%) - +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) + -core::iter::traits::iterator::Iterator::try_fold (12 samples, 6.35%) -core::it.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.15%) + -<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::extend_desugared (6 samples, 3.45%) +all.. -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (15 samples, 7.94%) -<alloc::vec.. +alloc::alloc::Global::alloc_impl (2 samples, 1.15%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::json_path (32 samples, 18.39%) +jsonpath_lib::paths::path_pa.. -<f64 as core::num::dec2flt::rawfp::RawFloat>::from_int (1 samples, 0.53%) - +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (11 samples, 6.32%) +<alloc::.. -jsonpath_lib::paths::path_parser::ParserImpl::exprs (13 samples, 6.88%) -jsonpath_.. +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.72%) + -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::all::check::{{closure}} (10 samples, 5.75%) +core::i.. -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::push (4 samples, 2.30%) +a.. -setup_arg_pages (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.53%) - +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) + -alloc::vec::Vec<T,A>::reserve (1 samples, 0.53%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::try_fold (30 samples, 15.87%) -core::iter::traits::iter.. +jsonpath_lib::paths::path_parser::ParserImpl::path (4 samples, 2.30%) +j.. -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) -c.. +core::num::<impl u64>::rotate_left (1 samples, 0.57%) + -tcache_get (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) + -jsonpath_lib::paths::path_parser::ParserImpl::expr (12 samples, 6.35%) -jsonpath.. +std::sys_common::rt::init (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (4 samples, 2.30%) +j.. -alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.53%) - +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) + -alloc::vec::Vec<T,A>::extend_desugared (9 samples, 4.76%) -alloc.. +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (10 samples, 5.75%) +core::c.. -jsonpath_lib::paths::path_parser::ParserImpl::compile (38 samples, 20.11%) -jsonpath_lib::paths::path_parse.. +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.53%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (11 samples, 6.32%) +jsonpath.. -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.53%) - +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::other::{{closure}} (1 samples, 0.53%) - +core::num::<impl u64>::wrapping_add (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::json_path (38 samples, 20.11%) -jsonpath_lib::paths::path_parse.. +unmap_vmas (1 samples, 0.57%) + -core::num::dec2flt::convert (2 samples, 1.06%) - +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.72%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (30 samples, 15.87%) -<serde_json::value::Valu.. +_libc_start_main (164 samples, 94.25%) +_libc_start_main -_GI___libc_malloc (2 samples, 1.06%) - +indexmap::map::IndexMap<K,V,S>::get_index_of (12 samples, 6.90%) +indexmap:.. -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (7 samples, 3.70%) -<cor.. +_GI___libc_malloc (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::PathParser::compile (38 samples, 20.11%) -jsonpath_lib::paths::path_parse.. +hashbrown::raw::inner::RawTable<T,A>::find (6 samples, 3.45%) +has.. -core::hash::Hasher::write_u8 (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (11 samples, 6.32%) +jsonpath.. -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) - +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.15%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.06%) - +_fopen_internal (1 samples, 0.57%) + -jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (14 samples, 7.41%) -jsonpath_l.. +hashbrown::raw::inner::RawTable<T,A>::iter_hash (2 samples, 1.15%) + -alloc::raw_vec::RawVec<T,A>::capacity_from_bytes (1 samples, 0.53%) - +core::iter::traits::iterator::Iterator::try_fold (28 samples, 16.09%) +core::iter::traits::iter.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (4 samples, 2.12%) -c.. +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::count (1 samples, 0.53%) - +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) +<c.. -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.12%) -c.. +jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (29 samples, 16.67%) +jsonpath_lib::selector::t.. -alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (5 samples, 2.87%) +ha.. -jsonpath_lib::select (179 samples, 94.71%) -jsonpath_lib::select +std::panicking::try (164 samples, 94.25%) +std::panicking::try -core::ptr::drop_in_place<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>> (5 samples, 2.65%) -co.. +tcache_put (1 samples, 0.57%) + -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) -<.. +alloc::alloc::alloc (2 samples, 1.15%) + -alloc::vec::Vec<T,A>::reserve (3 samples, 1.59%) - +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (36 samples, 20.69%) +core::iter::traits::iterator::It.. -hashbrown::raw::inner::RawTable<T,A>::find (10 samples, 5.29%) -hashbr.. +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.15%) + -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) - +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (3 samples, 1.72%) + -<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (12 samples, 6.35%) -<jsonpat.. +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::get_index_of (13 samples, 6.88%) -indexmap:.. +<hashbrown::scopeguard::ScopeGuard<T,F> as core::ops::drop::Drop>::drop (1 samples, 0.57%) + -core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.53%) - +core::iter::traits::iterator::Iterator::all (10 samples, 5.75%) +core::i.. -indexmap::map::IndexMap<K,V,S>::get_index_of (28 samples, 14.81%) -indexmap::map::IndexMa.. +alloc::raw_vec::RawVec<T,A>::reserve (3 samples, 1.72%) + -jsonpath_lib_benches::main::{{closure}} (179 samples, 94.71%) -jsonpath_lib_benches::main::{{closure}} +core::option::Option<T>::get_or_insert_with (2 samples, 1.15%) + -core::ptr::write (3 samples, 1.59%) - +jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.06%) - +<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.57%) + -alloc::alloc::Global::alloc_impl (3 samples, 1.59%) - +jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (7 samples, 4.02%) +json.. -<alloc::string::String as core::cmp::PartialEq>::eq (9 samples, 4.76%) -<allo.. +indexmap::map::IndexMap<K,V,S>::get (8 samples, 4.60%) +index.. -core::ptr::read (1 samples, 0.53%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) +cor.. -std::thread::local::LocalKey<T>::with (1 samples, 0.53%) - +alloc::alloc::exchange_malloc (2 samples, 1.15%) + -indexmap::map::core::IndexMapCore<K,V>::get_index_of (10 samples, 5.29%) -indexm.. +jsonpath_lib::selector::terms::FilterTerms::new_filter_context (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::push_term (3 samples, 1.59%) - +indexmap::map::core::equivalent::{{closure}} (2 samples, 1.15%) + -core::ptr::drop_in_place<hashbrown::scopeguard::ScopeGuard<hashbrown::raw::RawTableInner<alloc::alloc::Global>,hashbrown::raw::RawTableInner<alloc::alloc::Global>::prepare_resize::{{closure}}>> (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.72%) + -alloc::vec::Vec<T,A>::reserve (2 samples, 1.06%) - +hashbrown::raw::inner::Bucket<T>::from_base_index (2 samples, 1.15%) + -core::ptr::const_ptr::<impl *const T>::add (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::reserve (7 samples, 4.02%) +hash.. -jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.06%) - +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.45%) +cor.. -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::resize (6 samples, 3.45%) +has.. -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) + -core::ptr::write (1 samples, 0.53%) - +_rust_dealloc (1 samples, 0.57%) + -std::collections::hash::map::RandomState::new::{{closure}} (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) + -hashbrown::raw::inner::sse2::Group::match_byte (3 samples, 1.59%) - +core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (48 samples, 25.40%) -jsonpath_lib::selector::terms::FilterTer.. +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) + -jsonpath_lib::selector::terms::ExprTerm::cmp::{{closure}} (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.53%) - +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) + -_GI___libc_realloc (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.87%) +al.. -_x64_sys_execve (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.15%) + -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.53%) - +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +_GI___libc_malloc (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.53%) - +mmput (1 samples, 0.57%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.57%) + -hashbrown::raw::inner::RawIterHashInner<A>::new (3 samples, 1.59%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (2 samples, 1.06%) - +exec_binprm (1 samples, 0.57%) + -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.53%) - +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.45%) +cor.. -core::hash::sip::Hasher<S>::new_with_keys (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.06%) - +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) + -start (181 samples, 95.77%) -start +jsonpath_lib::selector::terms::ExprTerm::cmp_json (29 samples, 16.67%) +jsonpath_lib::selector::t.. -dl_start_final (1 samples, 0.53%) - +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::filter (48 samples, 25.40%) -jsonpath_lib::selector::terms::FilterTer.. +jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (7 samples, 4.02%) +json.. -jsonpath_lib::paths::tokenizer::Tokenizer::little (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.53%) - +core::iter::traits::iterator::Iterator::for_each (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::collect (16 samples, 8.47%) -core::iter::.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) + -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.53%) - +zap_pte_rang.sr. (1 samples, 0.57%) + -<core::iter::adapters::take_while::TakeWhile<I,P> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::exprs (23 samples, 13.22%) +jsonpath_lib::paths:.. -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.53%) - +core::option::Option<T>::map_or (2 samples, 1.15%) + -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (6 samples, 3.17%) -<al.. +core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) + -<alloc::string::String as core::hash::Hash>::hash (2 samples, 1.06%) - +hashbrown::map::HashMap<K,V,S,A>::get_inner (5 samples, 2.87%) +ha.. -core::str::<impl str>::parse (2 samples, 1.06%) - +indexmap::map::core::IndexMapCore<K,V>::get_index_of (9 samples, 5.17%) +indexm.. -alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.53%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) + -std::collections::hash::map::RandomState::new (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.53%) - +checked_request2size (1 samples, 0.57%) + -core::num::<impl u64>::rotate_left (2 samples, 1.06%) - +int_free (1 samples, 0.57%) + -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.53%) - +dl_runtime_resolve_xsavec (1 samples, 0.57%) + -int_realloc (1 samples, 0.53%) - +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.15%) + -<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.53%) - +core::ptr::write (1 samples, 0.57%) + -std::panic::catch_unwind (179 samples, 94.71%) -std::panic::catch_unwind +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) + -hashbrown::raw::inner::RawTableInner<A>::probe_seq (1 samples, 0.53%) - +hashbrown::map::make_hasher::{{closure}} (2 samples, 1.15%) + -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.53%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) + -jsonpath_lib::paths::path_parser::ParserImpl::array_start (31 samples, 16.40%) -jsonpath_lib::paths::path.. +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) + -std::rt::lang_start_internal (180 samples, 95.24%) -std::rt::lang_start_internal +core::str::validations::next_code_point (1 samples, 0.57%) + -<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (12 samples, 6.35%) -<jsonpat.. +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.15%) + -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.53%) - +alloc::alloc::alloc (1 samples, 0.57%) + -indexmap::map::IndexMap<K,V,S>::contains_key (13 samples, 6.88%) -indexmap:.. +jsonpath_lib::selector::terms::FilterTerms::push_json_term (42 samples, 24.14%) +jsonpath_lib::selector::terms::FilterT.. -_do_execve_fil.sr. (1 samples, 0.53%) - +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.57%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.30%) +c.. + + +indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.87%) +in.. + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (7 samples, 4.02%) +<all.. + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (9 samples, 5.17%) +<core:.. + + +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (36 samples, 20.69%) +<core::iter::adapters::enumerate.. + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (4 samples, 2.30%) +<.. + + +alloc::raw_vec::finish_grow (2 samples, 1.15%) + + + +start (165 samples, 94.83%) +start + + +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.57%) + + + +_memcmp_avx2_movbe (1 samples, 0.57%) + + + +entry_SYSCALL_64_after_hwframe (2 samples, 1.15%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.57%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.57%) + + + +alloc::alloc::box_free (1 samples, 0.57%) + + + +_rdl_dealloc (1 samples, 0.57%) + + + +hashbrown::raw::inner::sse2::Group::match_byte (2 samples, 1.15%) + + + +core::iter::traits::iterator::Iterator::fold (163 samples, 93.68%) +core::iter::traits::iterator::Iterator::fold + + +jsonpath_lib::paths::path_parser::ParserImpl::array_start (23 samples, 13.22%) +jsonpath_lib::paths:.. + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.72%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.15%) + + + +do_syscall_64 (7 samples, 4.02%) +do_s.. + + +unmap_page_range (1 samples, 0.57%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (5 samples, 2.87%) +ha.. + + +core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (2 samples, 1.15%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (23 samples, 13.22%) +indexmap::map::Index.. + + +alloc::alloc::alloc (1 samples, 0.57%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.57%) + + + +pthread_getattr_np (1 samples, 0.57%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec< (1 samples, 0.57%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (3 samples, 1.72%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) + + + +indexmap::map::IndexMap<K,V,S>::hash (3 samples, 1.72%) + -hashbrown::raw::sse2::Group::match_empty_or_deleted (2 samples, 1.06%) - +jsonpath_lib::selector::terms::ExprTerm::cmp (10 samples, 5.75%) +jsonpat.. -alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.06%) - +alloc::alloc::box_free (2 samples, 1.15%) + -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.59%) - +indexmap::map::core::equivalent::{{closure}} (4 samples, 2.30%) +i.. -hashbrown::raw::inner::RawIterHash<T,A>::new (3 samples, 1.59%) - +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (28 samples, 16.09%) +<serde_json::map::Map<al.. -jsonpath_lib::selector::terms::ExprTerm::and (12 samples, 6.35%) -jsonpath.. +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.15%) + -jsonpath_lib::paths::path_parser::ParserImpl::term (5 samples, 2.65%) -js.. +jsonpath_lib::selector::terms::FilterTerms::filter (42 samples, 24.14%) +jsonpath_lib::selector::terms::FilterT.. -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.06%) - +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.15%) + -<serde_json::value::Value as core::cmp::PartialEq>::eq (12 samples, 6.35%) -<serde_j.. +alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.15%) + -_GI___libc_realloc (4 samples, 2.12%) -_.. +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (10 samples, 5.75%) +<indexm.. -alloc::alloc::Global::grow_impl (4 samples, 2.12%) -a.. +_memcmp_avx2_movbe (2 samples, 1.15%) + -dl_start (1 samples, 0.53%) - +std::collections::hash::set::HashSet<T,S>::insert (15 samples, 8.62%) +std::collect.. -indexmap::map::core::IndexMapCore<K,V>::get_index_of (5 samples, 2.65%) -in.. +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) + -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.53%) - +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) +cor.. -jsonpath_lib::selector::terms::ExprTerm::cmp (31 samples, 16.40%) -jsonpath_lib::selector::t.. +alloc::alloc::realloc (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.06%) - +jsonpath_lib::selector::terms::ExprTerm::cmp_json (7 samples, 4.02%) +json.. -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.12%) -c.. +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.57%) + -hashbrown::raw::inner::RawTable<T,A>::find (5 samples, 2.65%) -ha.. +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.15%) + -jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (8 samples, 4.23%) -jsonp.. +dl_sysdep_start (1 samples, 0.57%) + -hashbrown::raw::is_full (1 samples, 0.53%) - +std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (1 samples, 0.57%) + -core::option::Option<T>::get_or_insert_with (1 samples, 0.53%) - +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (5 samples, 2.87%) +<c.. -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.53%) - +int_malloc (2 samples, 1.15%) + -indexmap::map::core::equivalent::{{closure}} (2 samples, 1.06%) - +indexmap::map::core::equivalent::{{closure}} (5 samples, 2.87%) +in.. -jsonpath_lib::selector::selector_impl::JsonSelector::select (133 samples, 70.37%) -jsonpath_lib::selector::selector_impl::JsonSelector::select +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.72%) + -core::option::Option<T>::get_or_insert_with (2 samples, 1.06%) - +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) + -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (45 samples, 23.81%) -jsonpath_lib::selector::terms::Filter.. +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) + -alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.53%) - +hashbrown::raw::RawTable<T,A>::find (2 samples, 1.15%) + -jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (8 samples, 4.23%) -jsonp.. +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.57%) + -int_realloc (3 samples, 1.59%) - +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::try_fold (1 samples, 0.53%) - +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.57%) + -std::rt::lang_start::{{closure}} (179 samples, 94.71%) -std::rt::lang_start::{{closure}} +core::option::Option<T>::get_or_insert_with (2 samples, 1.15%) + -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (12 samples, 6.35%) -<serde_j.. +dl_start (1 samples, 0.57%) + -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.59%) - +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) + -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.59%) - +_memmove_avx_unaligned_erms (1 samples, 0.57%) + -_GI___libc_malloc (1 samples, 0.53%) - +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) + -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.53%) - +jsonpath_lib::paths::path_parser::ParserImpl::expr (10 samples, 5.75%) +jsonpat.. -hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.59%) - +_set_task_comm (7 samples, 4.02%) +_set.. -core::num::dec2flt::algorithm::fast_path (1 samples, 0.53%) - +<serde_json::value::Value as core::cmp::PartialEq>::eq (29 samples, 16.67%) +<serde_json::value::Value.. -_GI___tunables_init (1 samples, 0.53%) - +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.15%) + -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (11 samples, 5.82%) -<indexm.. +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (3 samples, 1.72%) + -core::iter::traits::iterator::Iterator::fold (179 samples, 94.71%) -core::iter::traits::iterator::Iterator::fold +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (36 samples, 20.69%) +<core::iter::adapters::enumerate.. -alloc::alloc::realloc (4 samples, 2.12%) -a.. +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.72%) + -perf (7 samples, 3.70%) -perf +<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.72%) + -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.59%) - +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.57%) + -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.06%) - +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) + -hashbrown::map::make_hash (5 samples, 2.65%) -ha.. +alloc::raw_vec::finish_grow (2 samples, 1.15%) + -alloc::vec::Vec<T,A>::push (3 samples, 1.59%) - +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) + -core::num::<impl u64>::rotate_left (1 samples, 0.53%) - +core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) + -jsonpath_lib::selector::terms::ExprTerm::cmp (12 samples, 6.35%) -jsonpath.. +jsonpath_lib::paths::path_parser::ParserImpl::compile (32 samples, 18.39%) +jsonpath_lib::paths::path_pa.. -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.65%) -se.. +_GI__dl_addr (1 samples, 0.57%) + -std::panicking::try::do_call (179 samples, 94.71%) -std::panicking::try::do_call +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) + -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 1.59%) - +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) + -<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.12%) -<.. +<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (1 samples, 0.57%) + -core::iter::traits::iterator::Iterator::for_each (179 samples, 94.71%) -core::iter::traits::iterator::Iterator::for_each +jsonpath_lib::paths::path_parser::PathParser::parse (122 samples, 70.11%) +jsonpath_lib::paths::path_parser::PathParser::parse -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (16 samples, 8.47%) -<alloc::vec:.. +dl_main (1 samples, 0.57%) + -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.53%) - +core::core_arch::x86::sse2::mm_movemask_epi8 (1 samples, 0.57%) + diff --git a/src/lib.rs b/src/lib.rs index b9de61d4..5da46979 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -150,7 +150,7 @@ use std::rc::Rc; #[doc(hidden)] #[deprecated( since = "0.4.0", -note = "It will be move to other location like wasm. since 0.5" +note = "'ffi' is moved to another location like 'wasm' from version 0.5.x" )] mod ffi; #[doc(hidden)] @@ -199,7 +199,7 @@ impl From<&paths::TokenError> for JsonPathError { /// ``` #[deprecated( since = "0.2.5", -note = "Please use the PathCompiled::compile function instead. It will be removed since 0.4.1" +note = "Please use the PathCompiled::compile function instead. It will be removed from 0.4.1" )] pub fn compile(path: &str) -> impl FnMut(&Value) -> Result, JsonPathError> { #[allow(deprecated)] diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 9e76354a..4bc4861c 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -2,10 +2,9 @@ use std::collections::HashSet; use serde_json::{Number, Value}; -use super::value_walker::ValueWalker; -use super::utils; - use super::cmp::*; +use super::utils; +use super::value_walker::ValueWalker; #[derive(Debug, PartialEq)] pub enum ExprTerm<'a> { @@ -16,134 +15,195 @@ pub enum ExprTerm<'a> { } impl<'a> ExprTerm<'a> { - fn cmp( - &self, - other: &Self, - cmp_fn: &C1, - reverse_cmp_fn: &C2, - ) -> ExprTerm<'a> { - match &self { - ExprTerm::String(s1) => match &other { - ExprTerm::String(s2) => { - let (s1, opt1) = utils::to_path_str(s1); - let (s2, opt2) = utils::to_path_str(s2); - let k1 = if let Some(opt) = opt1.as_ref() { opt } else { s1 }; - let k2 = if let Some(opt) = opt2.as_ref() { opt } else { s2 }; - - ExprTerm::Bool(cmp_fn.cmp_string(k1, k2)) + fn cmp_string(&self, s1: &str, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + where + C1: Cmp, + C2: Cmp + { + match other { + ExprTerm::String(s2) => { + let (s1, opt1) = utils::to_path_str(s1); + let (s2, opt2) = utils::to_path_str(s2); + let k1 = if let Some(opt) = opt1.as_ref() { opt } else { s1 }; + let k2 = if let Some(opt) = opt2.as_ref() { opt } else { s2 }; + ExprTerm::Bool(cmp_fn.cmp_string(k1, k2)) + } + ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + } + } + + fn cmp_number(&self, n1: &Number, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + where + C1: Cmp, + C2: Cmp + { + match other { + ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), + ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + } + } + + fn cmp_bool(&self, b1: &bool, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + where + C1: Cmp, + C2: Cmp + { + match other { + ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), + ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + _ => ExprTerm::Bool(cmp_fn.default()), + } + } + + fn cmp_json_string(&self, s2: &str, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + where + C1: Cmp + { + let (s2, opt2) = utils::to_path_str(s2); + vec1.iter().filter(|v1| match v1 { + Value::String(s1) => { + if let Some(opt) = opt2.as_ref() { + cmp_fn.cmp_string(s1, opt) + } else { + cmp_fn.cmp_string(s1, s2) } - ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), - _ => ExprTerm::Bool(cmp_fn.default()), - }, - ExprTerm::Number(n1) => match &other { - ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), - ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), - _ => ExprTerm::Bool(cmp_fn.default()), - }, - ExprTerm::Bool(b1) => match &other { - ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), - ExprTerm::Json(_, _, _) => other.cmp(self, reverse_cmp_fn, cmp_fn), - _ => ExprTerm::Bool(cmp_fn.default()), - }, - ExprTerm::Json(rel, fk1, vec1) => { - let ret: Vec<&Value> = match &other { - ExprTerm::String(s2) => { - let (s2, opt2) = utils::to_path_str(s2); - vec1 - .iter() - .filter(|v1| match v1 { - Value::String(s1) => { - if let Some(opt) = opt2.as_ref() { - cmp_fn.cmp_string(s1, opt) - } else { - cmp_fn.cmp_string(s1, s2) - } - } - Value::Object(map1) => { - if let Some(FilterKey::String(k)) = fk1 { - if let Some(Value::String(s1)) = map1.get(*k) { - return if let Some(opt) = opt2.as_ref() { - cmp_fn.cmp_string(s1, opt) - } else { - cmp_fn.cmp_string(s1, s2) - }; - } - } - cmp_fn.default() - } - _ => cmp_fn.default(), - }) - .cloned() - .collect() - } - ExprTerm::Number(n2) => vec1 - .iter() - .filter(|v1| match v1 { - Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)), - Value::Object(map1) => { - if let Some(FilterKey::String(k)) = fk1 { - if let Some(Value::Number(n1)) = map1.get(*k) { - return cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)); - } - } - cmp_fn.default() - } - _ => cmp_fn.default(), - }) - .cloned() - .collect(), - ExprTerm::Bool(b2) => vec1 - .iter() - .filter(|v1| match v1 { - Value::Bool(b1) => cmp_fn.cmp_bool(*b1, *b2), - Value::Object(map1) => { - if let Some(FilterKey::String(k)) = fk1 { - if let Some(Value::Bool(b1)) = map1.get(*k) { - return cmp_fn.cmp_bool(*b1, *b2); - } - } - cmp_fn.default() - } - _ => cmp_fn.default(), - }) - .cloned() - .collect(), - ExprTerm::Json(parent, _, vec2) => { - if let Some(vec1) = rel { - cmp_fn.cmp_json(vec1, vec2) - } else if let Some(vec2) = parent { - cmp_fn.cmp_json(vec1, vec2) + } + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::String(s1)) = map1.get(*k) { + return if let Some(opt) = opt2.as_ref() { + cmp_fn.cmp_string(s1, opt) } else { - cmp_fn.cmp_json(vec1, vec2) - } + cmp_fn.cmp_string(s1, s2) + }; + } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }).copied().collect() + } + + fn cmp_json_number(&self, n2: &Number, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + where + C1: Cmp + { + vec1.iter().filter(|v1| match v1 { + Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)), + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::Number(n1)) = map1.get(*k) { + return cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)); } - }; - - if ret.is_empty() { - ExprTerm::Bool(cmp_fn.default()) - } else if let Some(rel) = rel { - if let ExprTerm::Json(_, _, _) = &other { - ExprTerm::Json(Some(rel.to_vec()), None, ret) - } else { - let mut tmp = Vec::new(); - for rel_value in rel { - if let Value::Object(map) = rel_value { - for map_value in map.values() { - for result_value in &ret { - if map_value.eq(*result_value) { - tmp.push(*rel_value); - } - } - } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }).copied().collect() + } + + fn cmp_json_bool(&self, b2: &bool, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + where + C1: Cmp + { + vec1.iter().filter(|v1| match v1 { + Value::Bool(b1) => cmp_fn.cmp_bool(*b1, *b2), + Value::Object(map1) => { + if let Some(FilterKey::String(k)) = fk1 { + if let Some(Value::Bool(b1)) = map1.get(*k) { + return cmp_fn.cmp_bool(*b1, *b2); + } + } + cmp_fn.default() + } + _ => cmp_fn.default(), + }).copied().collect() + } + + fn cmp_json_json(&self, rel: &Option>, parent: &Option>, vec1: &Vec<&'a Value>, vec2: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + where + C1: Cmp + { + if let Some(vec1) = rel { + cmp_fn.cmp_json(vec1, vec2) + } else if let Some(vec2) = parent { + cmp_fn.cmp_json(vec1, vec2) + } else { + cmp_fn.cmp_json(vec1, vec2) + } + } + + fn cmp_json(&self, rel: &Option>, fk1: &Option, vec1: &Vec<&'a Value>, other: &ExprTerm<'a>, cmp_fn: &C1) -> ExprTerm<'a> + where + C1: Cmp + { + let ret: Vec<&Value> = match other { + ExprTerm::String(s2) => self.cmp_json_string(s2, fk1, vec1, cmp_fn), + ExprTerm::Number(n2) => self.cmp_json_number(n2, fk1, vec1, cmp_fn), + ExprTerm::Bool(b2) => self.cmp_json_bool(b2, fk1, vec1, cmp_fn), + ExprTerm::Json(parent, _, vec2) => self.cmp_json_json(rel, parent, vec1, vec2, cmp_fn) + }; + + if ret.is_empty() { + return ExprTerm::Bool(cmp_fn.default()); + } + + if let Some(rel) = rel { + if let ExprTerm::Json(_, _, _) = &other { + return ExprTerm::Json(Some(rel.to_vec()), None, ret); + } else { + let mut object_exist = false; + for v in rel { + if v.is_object() { + object_exist = true; + break; + } + } + + if !object_exist { + return ExprTerm::Json(Some(Vec::new()), None, ret); + } + + let ret_set: HashSet<*const Value> = ret.iter() + .fold(HashSet::new(), |mut acc, v| { + let ptr = *v as *const Value; + acc.insert(ptr); + acc + }); + + let mut tmp = Vec::new(); + for rv in rel { + if let Value::Object(map) = rv { + for map_value in map.values() { + let ptr = map_value as *const Value; + if ret_set.contains(&ptr) { + tmp.push(*rv); } } - ExprTerm::Json(Some(tmp), None, ret) } - } else { - ExprTerm::Json(None, None, ret) } + + return ExprTerm::Json(Some(tmp), None, ret); } } + + ExprTerm::Json(None, None, ret) + } + + fn cmp(&self, other: &Self, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + where + C1: Cmp, + C2: Cmp + { + match &self { + ExprTerm::String(s1) => self.cmp_string(s1, other, cmp_fn, rev_cmp_fn), + ExprTerm::Number(n1) => self.cmp_number(n1, other, cmp_fn, rev_cmp_fn), + ExprTerm::Bool(b1) => self.cmp_bool(b1, other, cmp_fn, rev_cmp_fn), + ExprTerm::Json(rel, fk1, vec1) => + self.cmp_json(rel, fk1, vec1, other, cmp_fn) + } } pub fn eq(&self, other: &Self, ret: &mut Option>) { diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index 7e029270..d8872124 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -28,10 +28,7 @@ impl<'a> ValueWalker { pub fn all_with_strs(vec: Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { let mut acc = Vec::new(); - let mut new_keys = Vec::new(); - for key in keys { - new_keys.push(utils::to_path_str(key)); - } + let new_keys: Vec<(&str, Option)> = keys.iter().map(|key| utils::to_path_str(key)).collect(); for v in vec { if let Value::Object(map) = v { From bc066220f9485cadfd1ca1abae990b99fac255e7 Mon Sep 17 00:00:00 2001 From: freestrings Date: Thu, 5 Aug 2021 22:45:37 +0900 Subject: [PATCH 16/22] fix compare --- benchmark/flame.svg | 3020 ----------------- benchmark/gen_valgrind.sh | 8 +- src/paths/mod.rs | 8 +- .../{handlers.rs => parser_node_visitor.rs} | 18 +- src/paths/parser_token_handler.rs | 8 + src/paths/path_parser.rs | 103 +- src/selector/cmp.rs | 21 +- src/selector/selector_impl.rs | 31 +- src/selector/terms.rs | 388 ++- src/selector/utils.rs | 41 +- src/selector/value_walker.rs | 131 +- tests/op.rs | 96 +- 12 files changed, 522 insertions(+), 3351 deletions(-) delete mode 100644 benchmark/flame.svg rename src/paths/{handlers.rs => parser_node_visitor.rs} (84%) create mode 100644 src/paths/parser_token_handler.rs diff --git a/benchmark/flame.svg b/benchmark/flame.svg deleted file mode 100644 index 6e5719bb..00000000 --- a/benchmark/flame.svg +++ /dev/null @@ -1,3020 +0,0 @@ - - - - - - - - - - - - - - -Flame Graph - -Reset Zoom -Search -ic - - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.72%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) - - - -alloc::boxed::Box<T>::new (1 samples, 0.57%) - - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (11 samples, 6.32%) -jsonpath.. - - -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.57%) - - - -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (10 samples, 5.75%) -<serde_.. - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.15%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 2.30%) -<.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.57%) - - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (5 samples, 2.87%) -<c.. - - -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (163 samples, 93.68%) -core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once - - -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (6 samples, 3.45%) -<al.. - - -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.57%) - - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 3.45%) -ind.. - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (4 samples, 2.30%) -j.. - - -alloc::alloc::exchange_malloc (1 samples, 0.57%) - - - -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.30%) -c.. - - -unmap_single_vma (1 samples, 0.57%) - - - -jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (5 samples, 2.87%) -js.. - - -memcpy_erms (7 samples, 4.02%) -memc.. - - -core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) -cor.. - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (3 samples, 1.72%) - - - -do_exit (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::all (28 samples, 16.09%) -core::iter::traits::iter.. - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (4 samples, 2.30%) -c.. - - -_GI___libc_malloc (1 samples, 0.57%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (4 samples, 2.30%) -j.. - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.57%) - - - -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) -<c.. - - -jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (64 samples, 36.78%) -jsonpath_lib::selector::selector_impl::JsonSelector::visit_.. - - -<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) -<c.. - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) - - - -std::collections::hash::set::HashSet<T>::new (1 samples, 0.57%) - - - -<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (10 samples, 5.75%) -<jsonpa.. - - -core::iter::traits::iterator::Iterator::all::check::{{closure}} (27 samples, 15.52%) -core::iter::traits::ite.. - - -_vma_adjust (1 samples, 0.57%) - - - -core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>>> (6 samples, 3.45%) -cor.. - - -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.57%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) - - - -core::ptr::write (3 samples, 1.72%) - - - -core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) - - - -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (4 samples, 2.30%) -c.. - - -dl_fixup (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get (24 samples, 13.79%) -indexmap::map::Index.. - - -<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (6 samples, 3.45%) -<al.. - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (7 samples, 4.02%) -json.. - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.15%) - - - -hashbrown::raw::sse2::Group::static_empty (1 samples, 0.57%) - - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 2.30%) -<.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::whitespace (1 samples, 0.57%) - - - -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -_memcmp_avx2_movbe (2 samples, 1.15%) - - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (11 samples, 6.32%) -<alloc::.. - - -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::reserve (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) - - - -core::iter::adapters::map::map_fold::{{closure}} (1 samples, 0.57%) - - - -core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.15%) - - - -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) - - - -int_free (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -int_realloc (1 samples, 0.57%) - - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawIterHashInner<A>::new (2 samples, 1.15%) - - - -hashbrown::raw::RawTableInner<A>::prepare_resize::{{closure}} (1 samples, 0.57%) - - - -_x64_sys_execve (1 samples, 0.57%) - - - -hashbrown::set::HashSet<T,S,A>::contains (5 samples, 2.87%) -ha.. - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.72%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.72%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) - - - -core::option::Option<T>::map_or (3 samples, 1.72%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) - - - -hashbrown::raw::RawTableInner<A>::prepare_insert_slot (3 samples, 1.72%) - - - -hashbrown::raw::is_full (2 samples, 1.15%) - - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.72%) - - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (4 samples, 2.30%) -c.. - - -core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.57%) - - - -<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.57%) - - - -core::ptr::drop_in_place<hashbrown::scopeguard::ScopeGuard<hashbrown::raw::RawTableInner<alloc::alloc::Global>,hashbrown::raw::RawTableInner<alloc::alloc::Global>::prepare_resize::{{closure}}>> (1 samples, 0.57%) - - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (6 samples, 3.45%) -jso.. - - -indexmap::map::IndexMap<K,V,S>::hash (6 samples, 3.45%) -ind.. - - -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) - - - -alloc::raw_vec::finish_grow (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) - - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -core::ops::function::FnOnce::call_once (163 samples, 93.68%) -core::ops::function::FnOnce::call_once - - -jsonpath_lib::paths::path_parser::ParserImpl::term_num (1 samples, 0.57%) - - - -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (5 samples, 2.87%) -co.. - - -core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.15%) - - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (4 samples, 2.30%) -c.. - - -core::char::methods::<impl char>::is_whitespace (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::close_token (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::sub (2 samples, 1.15%) - - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (2 samples, 1.15%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) - - - -jsonpath_lib_benches::main (163 samples, 93.68%) -jsonpath_lib_benches::main - - -hashbrown::raw::inner::RawTable<T,A>::get (3 samples, 1.72%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) - - - -hashbrown::raw::RawTableInner<A>::set_ctrl (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -hashbrown::raw::RawIterHashInner<A>::new (2 samples, 1.15%) - - - -jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::lt (8 samples, 4.60%) -jsonp.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.72%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 1.15%) - - - -<alloc::string::String as core::cmp::PartialEq>::eq (4 samples, 2.30%) -<.. - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (7 samples, 4.02%) -<all.. - - -hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 1.15%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json (11 samples, 6.32%) -jsonpath.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (3 samples, 1.72%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::op (3 samples, 1.72%) - - - -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.57%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (4 samples, 2.30%) -<.. - - -<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.57%) - - - -hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.57%) - - - -alloc::alloc::Global::alloc_impl (1 samples, 0.57%) - - - -<alloc::string::String as core::hash::Hash>::hash (4 samples, 2.30%) -<.. - - -hashbrown::map::HashMap<K,V,S,A>::contains_key (5 samples, 2.87%) -ha.. - - -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (4 samples, 2.30%) -j.. - - -_GI___libc_malloc (1 samples, 0.57%) - - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (10 samples, 5.75%) -<indexm.. - - -core::core_arch::x86::sse2::mm_set1_epi8 (2 samples, 1.15%) - - - -core::ptr::drop_in_place<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>> (6 samples, 3.45%) -cor.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) - - - -alloc::alloc::dealloc (2 samples, 1.15%) - - - -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.57%) - - - -core::hash::impls::<impl core::hash::Hash for str>::hash (4 samples, 2.30%) -c.. - - -int_free (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 2.30%) -<.. - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (9 samples, 5.17%) -<core:.. - - -jsonpath_lib::paths::path_parser::ParserImpl::paths (5 samples, 2.87%) -js.. - - -core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.57%) - - - -int_free (1 samples, 0.57%) - - - -alloc::alloc::Global::alloc_impl (1 samples, 0.57%) - - - -core::core_arch::simd::i8x16::new (1 samples, 0.57%) - - - -hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.57%) - - - -alloc::alloc::dealloc (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 2.87%) -in.. - - -hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::term (2 samples, 1.15%) - - - -std::panicking::try::do_call (163 samples, 93.68%) -std::panicking::try::do_call - - -alloc::alloc::box_free (2 samples, 1.15%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) - - - -IO_new_fopen (1 samples, 0.57%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.72%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (3 samples, 1.72%) - - - -hashbrown::raw::RawTableInner<A>::new_in (1 samples, 0.57%) - - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (4 samples, 2.30%) -s.. - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) - - - -_GI___libc_malloc (2 samples, 1.15%) - - - -<alloc::string::String as core::cmp::PartialEq>::eq (3 samples, 1.72%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (13 samples, 7.47%) -jsonpath_l.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::current_pos (1 samples, 0.57%) - - - -core::option::Option<T>::get_or_insert_with (4 samples, 2.30%) -c.. - - -<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (1 samples, 0.57%) - - - -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.15%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.15%) - - - -alloc::vec::Vec<T,A>::push (1 samples, 0.57%) - - - -_x64_sys_execve (7 samples, 4.02%) -_x64.. - - -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -<serde_json::value::Value as core::cmp::PartialEq>::eq (2 samples, 1.15%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) - - - -alloc::alloc::dealloc (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::filter (23 samples, 13.22%) -jsonpath_lib::paths:.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.15%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (4 samples, 2.30%) -c.. - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) - - - -std::panicking::try::do_call (164 samples, 94.25%) -std::panicking::try::do_call - - -all (174 samples, 100%) - - - -hashbrown::raw::RawTable<T,A>::find (3 samples, 1.72%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::for_each (36 samples, 20.69%) -core::iter::traits::iterator::It.. - - -do_syscall_64 (2 samples, 1.15%) - - - -hashbrown::raw::RawTable<T,A>::get (3 samples, 1.72%) - - - -hashbrown::raw::inner::RawTable<T,A>::get (9 samples, 5.17%) -hashbr.. - - -std::panicking::try (163 samples, 93.68%) -std::panicking::try - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.15%) - - - -_memcmp_avx2_movbe (1 samples, 0.57%) - - - -core::hash::Hasher::write_usize (1 samples, 0.57%) - - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (5 samples, 2.87%) -in.. - - -hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.57%) - - - -ptmalloc_init (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.57%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) - - - -core::ptr::write (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.72%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp (29 samples, 16.67%) -jsonpath_lib::selector::t.. - - -core::num::<impl u64>::wrapping_add (1 samples, 0.57%) - - - -<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) - - - -exec_binprm (7 samples, 4.02%) -exec.. - - -jsonpath_lib::selector::selector_impl::JsonSelector::select (122 samples, 70.11%) -jsonpath_lib::selector::selector_impl::JsonSelector::select - - -jsonpath_lib::paths::tokenizer::Tokenizer::other::{{closure}} (1 samples, 0.57%) - - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (3 samples, 1.72%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (4 samples, 2.30%) -<.. - - -core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.57%) - - - -core::result::Result<T,E>::is_ok (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::fold (1 samples, 0.57%) - - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) - - - -core::core_arch::simd::i8x16::new (2 samples, 1.15%) - - - -core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::and (10 samples, 5.75%) -jsonpat.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) - - - -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.30%) -<.. - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (11 samples, 6.32%) -<alloc::.. - - -main (164 samples, 94.25%) -main - - -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend::{{closure}} (1 samples, 0.57%) - - - -hashbrown::set::HashSet<T,S,A>::insert (15 samples, 8.62%) -hashbrown::s.. - - -core::hash::Hasher::write_u8 (1 samples, 0.57%) - - - -std::sys_common::backtrace::_rust_begin_short_backtrace (163 samples, 93.68%) -std::sys_common::backtrace::_rust_begin_short_backtrace - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 2.87%) -se.. - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (10 samples, 5.75%) -jsonpat.. - - -<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.15%) - - - -alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.57%) - - - -<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 2.30%) -<.. - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (6 samples, 3.45%) -cor.. - - -std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (2 samples, 1.15%) - - - -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 2.87%) -<a.. - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) - - - -_memcmp_avx2_movbe (2 samples, 1.15%) - - - -load_elf_binary (7 samples, 4.02%) -load.. - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -jsonpath_lib::selector::terms::FilterTerms::push_term (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::insert (12 samples, 6.90%) -hashbrown.. - - -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) - - - -hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::hash (14 samples, 8.05%) -indexmap::m.. - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::offset (2 samples, 1.15%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) - - - -alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.57%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (6 samples, 3.45%) -<co.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 3.45%) -has.. - - -std::rt::lang_start::{{closure}} (163 samples, 93.68%) -std::rt::lang_start::{{closure}} - - -indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.57%) - - - -<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -jsonpath_lib::paths::str_reader::StrReader::current_pos (1 samples, 0.57%) - - - -core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) - - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (2 samples, 1.15%) - - - -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (1 samples, 0.57%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (29 samples, 16.67%) -core::cmp::impls::<impl c.. - - -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (42 samples, 24.14%) -jsonpath_lib::selector::terms::FilterT.. - - -jsonpath_lib::paths::path_parser::ParserImpl::path (6 samples, 3.45%) -jso.. - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (2 samples, 1.15%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::paths (32 samples, 18.39%) -jsonpath_lib::paths::path_pa.. - - -std::sys::unix::thread::guard::init (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (36 samples, 20.69%) -jsonpath_lib::selector::value_wa.. - - -core::num::<impl u64>::wrapping_add (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::or (30 samples, 17.24%) -jsonpath_lib::selector::te.. - - -int_malloc (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp (7 samples, 4.02%) -json.. - - -indexmap::map::IndexMap<K,V,S>::get_index_of (8 samples, 4.60%) -index.. - - -alloc::vec::Vec<T>::with_capacity (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::array (23 samples, 13.22%) -jsonpath_lib::paths:.. - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) - - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -core::hash::Hasher::write_u8 (1 samples, 0.57%) - - - -core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) - - - -begin_new_exec (7 samples, 4.02%) -begi.. - - -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle (121 samples, 69.54%) -<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::handlers::ParseTokenHandler>::handle - - -indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) - - - -indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) - - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) - - - -<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (10 samples, 5.75%) -<jsonpa.. - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (27 samples, 15.52%) -<indexmap::map::IndexMa.. - - -<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (29 samples, 16.67%) -<jsonpath_lib::selector::.. - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (9 samples, 5.17%) -hashbr.. - - -jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 1.72%) - - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) - - - -indexmap::map::core::equivalent::{{closure}} (2 samples, 1.15%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.15%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (4 samples, 2.30%) -j.. - - -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.72%) - - - -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) - - - -alloc::alloc::dealloc (2 samples, 1.15%) - - - -core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::new_in (1 samples, 0.57%) - - - -jsonpath_lib::select (162 samples, 93.10%) -jsonpath_lib::select - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (5 samples, 2.87%) -js.. - - -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) - - - -alloc::alloc::Global::grow_impl (1 samples, 0.57%) - - - -hashbrown::raw::sse2::Group::match_byte (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::PathParser::compile (32 samples, 18.39%) -jsonpath_lib::paths::path_pa.. - - -core::result::Result<T,E>::is_err (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) - - - -core::num::<impl u64>::rotate_left (4 samples, 2.30%) -c.. - - -core::core_arch::simd::i8x16::new (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -alloc::alloc::dealloc (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::op (5 samples, 2.87%) -js.. - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 2.30%) -<.. - - -jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (50 samples, 28.74%) -jsonpath_lib::selector::selector_impl::JsonSe.. - - -hashbrown::raw::sse2::Group::match_byte (2 samples, 1.15%) - - - -_do_execve_fil.sr. (7 samples, 4.02%) -_do_.. - - -dl_start_final (1 samples, 0.57%) - - - -core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.57%) - - - -jsonpath_lib::selector::selector_impl::JsonSelector::select (122 samples, 70.11%) -jsonpath_lib::selector::selector_impl::JsonSelector::select - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json (10 samples, 5.75%) -jsonpat.. - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.57%) - - - -<log::Level as core::cmp::PartialOrd<log::LevelFilter>>::le (1 samples, 0.57%) - - - -hashbrown::map::make_insert_hash (1 samples, 0.57%) - - - -do_group_exit (1 samples, 0.57%) - - - -hashbrown::raw::RawTableInner<A>::set_ctrl_h2 (1 samples, 0.57%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) - - - -exit_mmap (1 samples, 0.57%) - - - -std::panic::catch_unwind (164 samples, 94.25%) -std::panic::catch_unwind - - -jsonpath_lib::paths::path_parser::ParserImpl::term (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) - - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (4 samples, 2.30%) -c.. - - -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (2 samples, 1.15%) - - - -core::option::Option<T>::get_or_insert_with (1 samples, 0.57%) - - - -load_elf_binary (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (36 samples, 20.69%) -jsonpath_lib::selector::terms::F.. - - -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 1.72%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (4 samples, 2.30%) -c.. - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::for_each (163 samples, 93.68%) -core::iter::traits::iterator::Iterator::for_each - - -alloc::vec::Vec<T,A>::reserve (3 samples, 1.72%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (4 samples, 2.30%) -c.. - - -jsonpath_lib_benches::main::{{closure}} (163 samples, 93.68%) -jsonpath_lib_benches::main::{{closure}} - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (4 samples, 2.30%) -<.. - - -std::sys::unix::thread::guard::get_stack_start (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (9 samples, 5.17%) -<std::.. - - -hashbrown::raw::inner::RawTableInner<A>::bucket (2 samples, 1.15%) - - - -<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.72%) - - - -<indexmap::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::collect (7 samples, 4.02%) -core.. - - -core::option::Option<T>::unwrap (1 samples, 0.57%) - - - -hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -hashbrown::map::make_hash (2 samples, 1.15%) - - - -_memcmp_avx2_movbe (2 samples, 1.15%) - - - -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) - - - -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit (122 samples, 70.11%) -jsonpath_lib::paths::handlers::ParseNodeVisitor::visit - - -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.45%) -cor.. - - -indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.72%) - - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (2 samples, 1.15%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::term (5 samples, 2.87%) -js.. - - -core::iter::traits::iterator::Iterator::try_fold (10 samples, 5.75%) -core::i.. - - -<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::collect (3 samples, 1.72%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.15%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -core::ptr::drop_in_place<alloc::vec::Vec< (1 samples, 0.57%) - - - -jsonpath_lib::paths::str_reader::StrReader::peek::{{closure}} (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.57%) - - - -_rust_dealloc (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) - - - -<serde_json::value::Value as core::cmp::PartialEq>::eq (10 samples, 5.75%) -<serde_.. - - -core::core_arch::x86::sse2::mm_set_epi8 (2 samples, 1.15%) - - - -hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::gt (12 samples, 6.90%) -jsonpath_.. - - -setup_arg_pages (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::iter_hash (2 samples, 1.15%) - - - -jsonpath_lib::paths::str_reader::StrReader::next (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::fold (36 samples, 20.69%) -core::iter::traits::iterator::It.. - - -_GI___libc_realloc (1 samples, 0.57%) - - - -<std::collections::hash::map::RandomState as core::hash::BuildHasher>::build_hasher (1 samples, 0.57%) - - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (12 samples, 6.90%) -serde_jso.. - - -jsonpath_lib::paths::path_parser::ParserImpl::expr (5 samples, 2.87%) -js.. - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::reserve_rehash (7 samples, 4.02%) -hash.. - - -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get_index_of (4 samples, 2.30%) -i.. - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.57%) - - - -_GI___libc_free (1 samples, 0.57%) - - - -alloc::boxed::Box<T>::new (2 samples, 1.15%) - - - -std::collections::hash::set::HashSet<T,S>::contains (5 samples, 2.87%) -st.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) - - - -jsonpath_lib_be (167 samples, 95.98%) -jsonpath_lib_be - - -core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (6 samples, 3.45%) -cor.. - - -core::iter::traits::iterator::Iterator::collect (11 samples, 6.32%) -core::it.. - - -jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 1.72%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) - - - -hashbrown::raw::RawIterHash<T,A>::new (2 samples, 1.15%) - - - -hashbrown::map::make_hash (2 samples, 1.15%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.15%) - - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.45%) -cor.. - - -hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 1.15%) - - - -hashbrown::map::HashMap<K,V,S,A>::insert (15 samples, 8.62%) -hashbrown::m.. - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -perf (7 samples, 4.02%) -perf - - -shift_arg_pages (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -hashbrown::raw::RawTableInner<A>::find_insert_slot (3 samples, 1.72%) - - - -hashbrown::raw::inner::RawIterHash<T,A>::new (2 samples, 1.15%) - - - -_x64_sys_exit_group (1 samples, 0.57%) - - - -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) - - - -core::ptr::write (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::reserve (2 samples, 1.15%) - - - -hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.57%) - - - -std::rt::lang_start_internal::{{closure}} (164 samples, 94.25%) -std::rt::lang_start_internal::{{closure}} - - -entry_SYSCALL_64_after_hwframe (7 samples, 4.02%) -entr.. - - -std::panic::catch_unwind (163 samples, 93.68%) -std::panic::catch_unwind - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (28 samples, 16.09%) -<indexmap::map::IndexMap.. - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.15%) - - - -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 2.30%) -c.. - - -core::num::<impl u64>::rotate_left (2 samples, 1.15%) - - - -alloc::alloc::dealloc (1 samples, 0.57%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) - - - -<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (7 samples, 4.02%) -<all.. - - -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) -<c.. - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (6 samples, 3.45%) -cor.. - - -_do_execve_fil.sr. (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (163 samples, 93.68%) -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (41 samples, 23.56%) -jsonpath_lib::selector::terms::Filter.. - - -alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::push (3 samples, 1.72%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.15%) - - - -int_free (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::get (4 samples, 2.30%) -i.. - - -core::hash::sip::SipHasher13::new_with_keys (1 samples, 0.57%) - - - -tcache_put (1 samples, 0.57%) - - - -hashbrown::raw::sse2::Group::match_empty_or_deleted (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::get_mut (2 samples, 1.15%) - - - -core::core_arch::simd::i8x16::new (2 samples, 1.15%) - - - -<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.57%) - - - -malloc_hook_ini (1 samples, 0.57%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.15%) - - - -std::rt::lang_start_internal (164 samples, 94.25%) -std::rt::lang_start_internal - - -indexmap::map::IndexMap<K,V,S>::contains_key (12 samples, 6.90%) -indexmap:.. - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.15%) - - - -alloc::vec::Vec<T,A>::extend_desugared (6 samples, 3.45%) -all.. - - -alloc::alloc::Global::alloc_impl (2 samples, 1.15%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::json_path (32 samples, 18.39%) -jsonpath_lib::paths::path_pa.. - - -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (11 samples, 6.32%) -<alloc::.. - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.72%) - - - -core::iter::traits::iterator::Iterator::all::check::{{closure}} (10 samples, 5.75%) -core::i.. - - -alloc::vec::Vec<T,A>::push (4 samples, 2.30%) -a.. - - -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) - - - -indexmap::map::IndexMap<K,V,S>::hash (2 samples, 1.15%) - - - -core::num::<impl u64>::wrapping_add (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::path (4 samples, 2.30%) -j.. - - -core::num::<impl u64>::rotate_left (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (2 samples, 1.15%) - - - -std::sys_common::rt::init (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (4 samples, 2.30%) -j.. - - -<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (10 samples, 5.75%) -core::c.. - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp (11 samples, 6.32%) -jsonpath.. - - -indexmap::map::core::equivalent::{{closure}} (1 samples, 0.57%) - - - -core::num::<impl u64>::wrapping_add (1 samples, 0.57%) - - - -unmap_vmas (1 samples, 0.57%) - - - -serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.72%) - - - -_libc_start_main (164 samples, 94.25%) -_libc_start_main - - -indexmap::map::IndexMap<K,V,S>::get_index_of (12 samples, 6.90%) -indexmap:.. - - -_GI___libc_malloc (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (6 samples, 3.45%) -has.. - - -jsonpath_lib::paths::path_parser::ParserImpl::exprs (11 samples, 6.32%) -jsonpath.. - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.15%) - - - -_fopen_internal (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::iter_hash (2 samples, 1.15%) - - - -core::iter::traits::iterator::Iterator::try_fold (28 samples, 16.09%) -core::iter::traits::iter.. - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 2.87%) -<c.. - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (29 samples, 16.67%) -jsonpath_lib::selector::t.. - - -hashbrown::raw::inner::RawTable<T,A>::find (5 samples, 2.87%) -ha.. - - -std::panicking::try (164 samples, 94.25%) -std::panicking::try - - -tcache_put (1 samples, 0.57%) - - - -alloc::alloc::alloc (2 samples, 1.15%) - - - -core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (36 samples, 20.69%) -core::iter::traits::iterator::It.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 1.15%) - - - -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (3 samples, 1.72%) - - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.57%) - - - -<hashbrown::scopeguard::ScopeGuard<T,F> as core::ops::drop::Drop>::drop (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::all (10 samples, 5.75%) -core::i.. - - -alloc::raw_vec::RawVec<T,A>::reserve (3 samples, 1.72%) - - - -core::option::Option<T>::get_or_insert_with (2 samples, 1.15%) - - - -jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.57%) - - - -<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (7 samples, 4.02%) -json.. - - -indexmap::map::IndexMap<K,V,S>::get (8 samples, 4.60%) -index.. - - -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) -cor.. - - -alloc::alloc::exchange_malloc (2 samples, 1.15%) - - - -jsonpath_lib::selector::terms::FilterTerms::new_filter_context (1 samples, 0.57%) - - - -indexmap::map::core::equivalent::{{closure}} (2 samples, 1.15%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (3 samples, 1.72%) - - - -hashbrown::raw::inner::Bucket<T>::from_base_index (2 samples, 1.15%) - - - -hashbrown::raw::RawTable<T,A>::reserve (7 samples, 4.02%) -hash.. - - -core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParseNode> (6 samples, 3.45%) -cor.. - - -hashbrown::raw::RawTable<T,A>::resize (6 samples, 3.45%) -has.. - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) - - - -_rust_dealloc (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) - - - -core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.87%) -al.. - - -jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.15%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) - - - -_GI___libc_malloc (1 samples, 0.57%) - - - -mmput (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.57%) - - - -exec_binprm (1 samples, 0.57%) - - - -core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>>> (6 samples, 3.45%) -cor.. - - -hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json (29 samples, 16.67%) -jsonpath_lib::selector::t.. - - -<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.57%) - - - -jsonpath_lib::selector::value_walker::ValueWalker::all_with_strs (7 samples, 4.02%) -json.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.57%) - - - -core::iter::traits::iterator::Iterator::for_each (1 samples, 0.57%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -zap_pte_rang.sr. (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::exprs (23 samples, 13.22%) -jsonpath_lib::paths:.. - - -core::option::Option<T>::map_or (2 samples, 1.15%) - - - -core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) - - - -hashbrown::map::HashMap<K,V,S,A>::get_inner (5 samples, 2.87%) -ha.. - - -indexmap::map::core::IndexMapCore<K,V>::get_index_of (9 samples, 5.17%) -indexm.. - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) - - - -checked_request2size (1 samples, 0.57%) - - - -int_free (1 samples, 0.57%) - - - -dl_runtime_resolve_xsavec (1 samples, 0.57%) - - - -core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.15%) - - - -core::ptr::write (1 samples, 0.57%) - - - -<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.57%) - - - -core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) - - - -hashbrown::map::make_hasher::{{closure}} (2 samples, 1.15%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 1.72%) - - - -jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.57%) - - - -core::str::validations::next_code_point (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 1.15%) - - - -alloc::alloc::alloc (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::FilterTerms::push_json_term (42 samples, 24.14%) -jsonpath_lib::selector::terms::FilterT.. - - -<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.57%) - - - -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (4 samples, 2.30%) -c.. - - -indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.87%) -in.. - - -<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (7 samples, 4.02%) -<all.. - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.57%) - - - -<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (9 samples, 5.17%) -<core:.. - - -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (36 samples, 20.69%) -<core::iter::adapters::enumerate.. - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (4 samples, 2.30%) -<.. - - -alloc::raw_vec::finish_grow (2 samples, 1.15%) - - - -start (165 samples, 94.83%) -start - - -<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.57%) - - - -_memcmp_avx2_movbe (1 samples, 0.57%) - - - -entry_SYSCALL_64_after_hwframe (2 samples, 1.15%) - - - -alloc::vec::Vec<T,A>::push (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::push (1 samples, 0.57%) - - - -alloc::alloc::box_free (1 samples, 0.57%) - - - -_rdl_dealloc (1 samples, 0.57%) - - - -hashbrown::raw::inner::sse2::Group::match_byte (2 samples, 1.15%) - - - -core::iter::traits::iterator::Iterator::fold (163 samples, 93.68%) -core::iter::traits::iterator::Iterator::fold - - -jsonpath_lib::paths::path_parser::ParserImpl::array_start (23 samples, 13.22%) -jsonpath_lib::paths:.. - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.72%) - - - -alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.15%) - - - -do_syscall_64 (7 samples, 4.02%) -do_s.. - - -unmap_page_range (1 samples, 0.57%) - - - -hashbrown::raw::inner::RawTable<T,A>::get (5 samples, 2.87%) -ha.. - - -core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::paths (2 samples, 1.15%) - - - -indexmap::map::IndexMap<K,V,S>::get_index_of (23 samples, 13.22%) -indexmap::map::Index.. - - -alloc::alloc::alloc (1 samples, 0.57%) - - - -core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.57%) - - - -pthread_getattr_np (1 samples, 0.57%) - - - -core::ptr::drop_in_place<alloc::raw_vec::RawVec< (1 samples, 0.57%) - - - -alloc::raw_vec::RawVec<T,A>::grow_amortized (3 samples, 1.72%) - - - -core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.57%) - - - -indexmap::map::IndexMap<K,V,S>::hash (3 samples, 1.72%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp (10 samples, 5.75%) -jsonpat.. - - -alloc::alloc::box_free (2 samples, 1.15%) - - - -indexmap::map::core::equivalent::{{closure}} (4 samples, 2.30%) -i.. - - -<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (28 samples, 16.09%) -<serde_json::map::Map<al.. - - -core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.15%) - - - -jsonpath_lib::selector::terms::FilterTerms::filter (42 samples, 24.14%) -jsonpath_lib::selector::terms::FilterT.. - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 1.15%) - - - -alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.15%) - - - -<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (10 samples, 5.75%) -<indexm.. - - -_memcmp_avx2_movbe (2 samples, 1.15%) - - - -std::collections::hash::set::HashSet<T,S>::insert (15 samples, 8.62%) -std::collect.. - - -jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.57%) - - - -core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParseNode>> (6 samples, 3.45%) -cor.. - - -alloc::alloc::realloc (1 samples, 0.57%) - - - -jsonpath_lib::selector::terms::ExprTerm::cmp_json (7 samples, 4.02%) -json.. - - -hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.15%) - - - -dl_sysdep_start (1 samples, 0.57%) - - - -std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (1 samples, 0.57%) - - - -<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (5 samples, 2.87%) -<c.. - - -int_malloc (2 samples, 1.15%) - - - -indexmap::map::core::equivalent::{{closure}} (5 samples, 2.87%) -in.. - - -indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.72%) - - - -<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.57%) - - - -<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.57%) - - - -hashbrown::raw::RawTable<T,A>::find (2 samples, 1.15%) - - - -alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) - - - -alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.57%) - - - -core::option::Option<T>::get_or_insert_with (2 samples, 1.15%) - - - -dl_start (1 samples, 0.57%) - - - -core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.57%) - - - -_memmove_avx_unaligned_erms (1 samples, 0.57%) - - - -<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.15%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::expr (10 samples, 5.75%) -jsonpat.. - - -_set_task_comm (7 samples, 4.02%) -_set.. - - -<serde_json::value::Value as core::cmp::PartialEq>::eq (29 samples, 16.67%) -<serde_json::value::Value.. - - -core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.15%) - - - -<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (3 samples, 1.72%) - - - -<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (36 samples, 20.69%) -<core::iter::adapters::enumerate.. - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (3 samples, 1.72%) - - - -<serde_json::value::Value as core::cmp::PartialEq>::eq (3 samples, 1.72%) - - - -<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.57%) - - - -jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (2 samples, 1.15%) - - - -alloc::raw_vec::finish_grow (2 samples, 1.15%) - - - -<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.15%) - - - -core::option::Option<T>::get_or_insert_with (3 samples, 1.72%) - - - -jsonpath_lib::paths::path_parser::ParserImpl::compile (32 samples, 18.39%) -jsonpath_lib::paths::path_pa.. - - -_GI__dl_addr (1 samples, 0.57%) - - - -<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.57%) - - - -jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.57%) - - - -<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (1 samples, 0.57%) - - - -jsonpath_lib::paths::path_parser::PathParser::parse (122 samples, 70.11%) -jsonpath_lib::paths::path_parser::PathParser::parse - - -dl_main (1 samples, 0.57%) - - - -core::core_arch::x86::sse2::mm_movemask_epi8 (1 samples, 0.57%) - - - - diff --git a/benchmark/gen_valgrind.sh b/benchmark/gen_valgrind.sh index c262a73d..cfc8710d 100755 --- a/benchmark/gen_valgrind.sh +++ b/benchmark/gen_valgrind.sh @@ -2,8 +2,12 @@ set -e -valgrind \ +cargo clean && + cargo build --release && \ + valgrind \ --tool=callgrind \ --dump-instr=yes \ --collect-jumps=yes \ - --simulate-cache=yes $1 -- $2 \ No newline at end of file + --simulate-cache=yes ./target/release/jsonpath_lib_benches + +# --simulate-cache=yes $1 -- $2 \ No newline at end of file diff --git a/src/paths/mod.rs b/src/paths/mod.rs index 8511cd8f..59474c47 100644 --- a/src/paths/mod.rs +++ b/src/paths/mod.rs @@ -1,4 +1,5 @@ -pub use self::handlers::ParseTokenHandler; +pub use self::parser_node_visitor::ParserNodeVisitor; +pub use self::parser_token_handler::ParserTokenHandler; pub use self::path_parser::PathParser; pub use self::str_reader::StrRange; pub use self::tokenizer::TokenError; @@ -6,5 +7,6 @@ pub use self::tokenizer::TokenError; mod str_reader; mod tokenizer; pub mod tokens; -mod handlers; -mod path_parser; \ No newline at end of file +mod parser_token_handler; +mod parser_node_visitor; +mod path_parser; diff --git a/src/paths/handlers.rs b/src/paths/parser_node_visitor.rs similarity index 84% rename from src/paths/handlers.rs rename to src/paths/parser_node_visitor.rs index 20f83480..ab35c1e3 100644 --- a/src/paths/handlers.rs +++ b/src/paths/parser_node_visitor.rs @@ -1,11 +1,11 @@ -use super::path_parser::ParseNode; -use super::str_reader::StrRange; -use super::tokens::{FilterToken, ParseToken}; +use paths::{ParserTokenHandler, StrRange}; +use paths::path_parser::ParserNode; +use paths::tokens::{FilterToken, ParseToken}; -pub trait ParseNodeVisitor<'a> { - fn visit(&self, parse_node: &ParseNode, token_handler: &mut F, parse_value_reader: &F1) +pub trait ParserNodeVisitor<'a> { + fn visit(&self, parse_node: &ParserNode, token_handler: &mut F, parse_value_reader: &F1) where - F: ParseTokenHandler<'a>, + F: ParserTokenHandler<'a>, F1: Fn(&StrRange) -> &'a str { trace!("visit {:?}", parse_node); @@ -70,10 +70,4 @@ pub trait ParseNodeVisitor<'a> { _ => {} } } -} - -pub trait ParseTokenHandler<'a> { - fn handle(&mut self, token: &ParseToken, parse_value_reader: &F) - where - F: Fn(&StrRange) -> &'a str; } \ No newline at end of file diff --git a/src/paths/parser_token_handler.rs b/src/paths/parser_token_handler.rs new file mode 100644 index 00000000..ec06d410 --- /dev/null +++ b/src/paths/parser_token_handler.rs @@ -0,0 +1,8 @@ +use super::str_reader::StrRange; +use super::tokens::ParseToken; + +pub trait ParserTokenHandler<'a> { + fn handle(&mut self, token: &ParseToken, parse_value_reader: &F) + where + F: Fn(&StrRange) -> &'a str; +} \ No newline at end of file diff --git a/src/paths/path_parser.rs b/src/paths/path_parser.rs index 2df6acf2..8ee456cd 100644 --- a/src/paths/path_parser.rs +++ b/src/paths/path_parser.rs @@ -1,9 +1,10 @@ use std::str::FromStr; +use super::parser_token_handler::ParserTokenHandler; +use super::parser_node_visitor::ParserNodeVisitor; use super::str_reader::StrRange; use super::tokenizer::{TokenError, TokenReader}; use super::tokens::{FilterToken, ParseToken, Token}; -use super::handlers::{ParseNodeVisitor, ParseTokenHandler}; #[derive(Clone, Debug)] pub struct PathParser<'a> { @@ -19,7 +20,7 @@ impl<'a> PathParser<'a> { pub fn parse(&self, parse_token_handler: &mut F) -> Result<(), String> where - F: ParseTokenHandler<'a>, + F: ParserTokenHandler<'a>, { if self.parser.parse_node.is_none() { unreachable!() @@ -36,12 +37,12 @@ impl<'a> PathParser<'a> { } } -impl<'a> ParseNodeVisitor<'a> for PathParser<'a> {} +impl<'a> ParserNodeVisitor<'a> for PathParser<'a> {} #[derive(Clone, Debug)] struct ParserImpl<'a> { token_reader: TokenReader<'a>, - parse_node: Option, + parse_node: Option, } impl<'a> ParserImpl<'a> { @@ -67,7 +68,7 @@ impl<'a> ParserImpl<'a> { Ok(self) } - fn json_path(&mut self) -> Result { + fn json_path(&mut self) -> Result { debug!("#json_path"); match self.token_reader.next_token() { Ok(Token::Absolute(_)) => { @@ -78,7 +79,7 @@ impl<'a> ParserImpl<'a> { } } - fn paths(&mut self, prev: ParseNode) -> Result { + fn paths(&mut self, prev: ParserNode) -> Result { debug!("#paths"); match self.token_reader.peek_token() { Ok(Token::Dot(_)) => { @@ -95,13 +96,13 @@ impl<'a> ParserImpl<'a> { } } - fn paths_dot(&mut self, prev: ParseNode) -> Result { + fn paths_dot(&mut self, prev: ParserNode) -> Result { debug!("#paths_dot"); let node = self.path(prev)?; self.paths(node) } - fn path(&mut self, prev: ParseNode) -> Result { + fn path(&mut self, prev: ParserNode) -> Result { debug!("#path"); match self.token_reader.peek_token() { Ok(Token::Dot(_)) => self.path_leaves(prev), @@ -115,7 +116,7 @@ impl<'a> ParserImpl<'a> { } } - fn path_leaves(&mut self, prev: ParseNode) -> Result { + fn path_leaves(&mut self, prev: ParserNode) -> Result { debug!("#path_leaves"); self.eat_token(); match self.token_reader.peek_token() { @@ -130,9 +131,9 @@ impl<'a> ParserImpl<'a> { } #[allow(clippy::unnecessary_wraps)] - fn path_leaves_key(&mut self, prev: ParseNode) -> Result { + fn path_leaves_key(&mut self, prev: ParserNode) -> Result { debug!("#path_leaves_key"); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Leaves, left: Some(Box::new(prev)), right: Some(Box::new(self.key()?)), @@ -140,10 +141,10 @@ impl<'a> ParserImpl<'a> { } #[allow(clippy::unnecessary_wraps)] - fn path_leaves_all(&mut self, prev: ParseNode) -> Result { + fn path_leaves_all(&mut self, prev: ParserNode) -> Result { debug!("#path_leaves_all"); self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Leaves, left: Some(Box::new(prev)), right: Some(Box::new(self.create_node(ParseToken::All))), @@ -151,10 +152,10 @@ impl<'a> ParserImpl<'a> { } #[allow(clippy::unnecessary_wraps)] - fn path_in_all(&mut self, prev: ParseNode) -> Result { + fn path_in_all(&mut self, prev: ParserNode) -> Result { debug!("#path_in_all"); self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::In, left: Some(Box::new(prev)), right: Some(Box::new(self.create_node(ParseToken::All))), @@ -162,16 +163,16 @@ impl<'a> ParserImpl<'a> { } #[allow(clippy::unnecessary_wraps)] - fn path_in_key(&mut self, prev: ParseNode) -> Result { + fn path_in_key(&mut self, prev: ParserNode) -> Result { debug!("#path_in_key"); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::In, left: Some(Box::new(prev)), right: Some(Box::new(self.key()?)), }) } - fn key(&mut self) -> Result { + fn key(&mut self) -> Result { debug!("#key"); match self.token_reader.next_token() { Ok(Token::Key(s)) => Ok(self.create_node(ParseToken::Key(s))), @@ -179,7 +180,7 @@ impl<'a> ParserImpl<'a> { } } - fn boolean(&mut self) -> Result { + fn boolean(&mut self) -> Result { debug!("#boolean"); fn validation_bool_value(v: &str) -> bool { @@ -197,7 +198,7 @@ impl<'a> ParserImpl<'a> { Err(self.token_reader.to_error()) } - fn array_keys(&mut self, first_key: StrRange) -> Result { + fn array_keys(&mut self, first_key: StrRange) -> Result { let mut keys = vec![first_key]; while let Ok(Token::Comma(_)) = self.token_reader.peek_token() { @@ -217,7 +218,7 @@ impl<'a> ParserImpl<'a> { Ok(self.create_node(ParseToken::Keys(keys))) } - fn array_quote_value(&mut self) -> Result { + fn array_quote_value(&mut self) -> Result { debug!("#array_quote_value"); let next = self.token_reader.next_token(); match next { @@ -232,12 +233,12 @@ impl<'a> ParserImpl<'a> { } } - fn array_start(&mut self, prev: ParseNode) -> Result { + fn array_start(&mut self, prev: ParserNode) -> Result { debug!("#array_start"); match self.token_reader.peek_token() { Ok(Token::Question(_)) => { self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Array, left: Some(Box::new(prev)), right: Some(Box::new(self.filter()?)), @@ -245,13 +246,13 @@ impl<'a> ParserImpl<'a> { } Ok(Token::Asterisk(_)) => { self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Array, left: Some(Box::new(prev)), right: Some(Box::new(self.create_node(ParseToken::All))), }) } - _ => Ok(ParseNode { + _ => Ok(ParserNode { token: ParseToken::Array, left: Some(Box::new(prev)), right: Some(Box::new(self.array_value()?)), @@ -259,14 +260,14 @@ impl<'a> ParserImpl<'a> { } } - fn array(&mut self, prev: ParseNode) -> Result { + fn array(&mut self, prev: ParserNode) -> Result { debug!("#array"); let ret = self.array_start(prev)?; self.eat_whitespace(); self.close_token(ret, Token::CloseArray(StrRange::new(0, 0))) } - fn array_value_key(&mut self) -> Result { + fn array_value_key(&mut self) -> Result { debug!("#array_value_key"); if let Ok(Token::Key(s)) = self.token_reader.next_token() { @@ -284,7 +285,7 @@ impl<'a> ParserImpl<'a> { } } - fn array_value(&mut self) -> Result { + fn array_value(&mut self) -> Result { debug!("#array_value"); match self.token_reader.peek_token() { Ok(Token::Key(_)) => self.array_value_key(), @@ -303,7 +304,7 @@ impl<'a> ParserImpl<'a> { } } - fn union(&mut self, num: isize) -> Result { + fn union(&mut self, num: isize) -> Result { debug!("#union"); let mut values = vec![num]; while matches!(self.token_reader.peek_token(), Ok(Token::Comma(_))) { @@ -358,7 +359,7 @@ impl<'a> ParserImpl<'a> { } } - fn range_from(&mut self, from: isize) -> Result { + fn range_from(&mut self, from: isize) -> Result { debug!("#range_from"); self.eat_token(); self.eat_whitespace(); @@ -373,7 +374,7 @@ impl<'a> ParserImpl<'a> { } } - fn range_to(&mut self) -> Result { + fn range_to(&mut self) -> Result { debug!("#range_to"); if let Some(step) = self.range_value()? { @@ -395,7 +396,7 @@ impl<'a> ParserImpl<'a> { } } - fn range(&mut self, from: isize) -> Result { + fn range(&mut self, from: isize) -> Result { debug!("#range"); match self.token_reader.next_token() { Ok(Token::Key(s)) => { @@ -408,7 +409,7 @@ impl<'a> ParserImpl<'a> { } } - fn filter(&mut self) -> Result { + fn filter(&mut self) -> Result { debug!("#filter"); match self.token_reader.next_token() { Ok(Token::OpenParenthesis(_)) => { @@ -420,7 +421,7 @@ impl<'a> ParserImpl<'a> { } } - fn exprs(&mut self) -> Result { + fn exprs(&mut self) -> Result { self.eat_whitespace(); debug!("#exprs"); let node = match self.token_reader.peek_token() { @@ -440,12 +441,12 @@ impl<'a> ParserImpl<'a> { self.condition_expr(node) } - fn condition_expr(&mut self, prev: ParseNode) -> Result { + fn condition_expr(&mut self, prev: ParserNode) -> Result { debug!("#condition_expr"); match self.token_reader.peek_token() { Ok(Token::And(_)) => { self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Filter(FilterToken::And), left: Some(Box::new(prev)), right: Some(Box::new(self.exprs()?)), @@ -453,7 +454,7 @@ impl<'a> ParserImpl<'a> { } Ok(Token::Or(_)) => { self.eat_token(); - Ok(ParseNode { + Ok(ParserNode { token: ParseToken::Filter(FilterToken::Or), left: Some(Box::new(prev)), right: Some(Box::new(self.exprs()?)), @@ -463,7 +464,7 @@ impl<'a> ParserImpl<'a> { } } - fn expr(&mut self) -> Result { + fn expr(&mut self) -> Result { debug!("#expr"); let has_prop_candidate = matches!(self.token_reader.peek_token(), Ok(Token::At(_))); @@ -487,7 +488,7 @@ impl<'a> ParserImpl<'a> { } } - fn term_num(&mut self) -> Result { + fn term_num(&mut self) -> Result { debug!("#term_num"); match self.token_reader.next_token() { Ok(Token::Key(s)) => { @@ -504,7 +505,7 @@ impl<'a> ParserImpl<'a> { } } - fn term_num_float(&mut self, num: &'a str) -> Result { + fn term_num_float(&mut self, num: &'a str) -> Result { debug!("#term_num_float"); self.eat_token(); match self.token_reader.next_token() { @@ -517,7 +518,7 @@ impl<'a> ParserImpl<'a> { } } - fn term(&mut self) -> Result { + fn term(&mut self) -> Result { debug!("#term"); if self.token_reader.peek_token().is_err() { @@ -563,7 +564,7 @@ impl<'a> ParserImpl<'a> { } } - fn op(&mut self, prev: ParseNode) -> Result { + fn op(&mut self, prev: ParserNode) -> Result { debug!("#op"); let token = match self.token_reader.next_token() { Ok(Token::Equal(_)) => ParseToken::Filter(FilterToken::Equal), @@ -579,7 +580,7 @@ impl<'a> ParserImpl<'a> { self.eat_whitespace(); - Ok(ParseNode { + Ok(ParserNode { token, left: Some(Box::new(prev)), right: Some(Box::new(self.term()?)), @@ -596,7 +597,7 @@ impl<'a> ParserImpl<'a> { let _ = self.token_reader.next_token(); } - fn close_token(&mut self, ret: ParseNode, token: Token) -> Result { + fn close_token(&mut self, ret: ParserNode, token: Token) -> Result { debug!("#close_token"); match self.token_reader.next_token() { Ok(ref t) if t.is_match_token_type(token) => Ok(ret), @@ -604,8 +605,8 @@ impl<'a> ParserImpl<'a> { } } - fn create_node(&mut self, token: ParseToken) -> ParseNode { - ParseNode { + fn create_node(&mut self, token: ParseToken) -> ParserNode { + ParserNode { left: None, right: None, token, @@ -614,15 +615,15 @@ impl<'a> ParserImpl<'a> { } #[derive(Debug, Clone)] -pub struct ParseNode { - pub left: Option>, - pub right: Option>, +pub struct ParserNode { + pub left: Option>, + pub right: Option>, pub token: ParseToken, } #[cfg(test)] mod path_parser_tests { - use paths::ParseTokenHandler; + use paths::ParserTokenHandler; use paths::path_parser::PathParser; use paths::str_reader::StrRange; use paths::tokens::{FilterToken, ParseToken}; @@ -647,7 +648,7 @@ mod path_parser_tests { } } - impl<'a> ParseTokenHandler<'a> for NodeVisitorTestImpl<'a> { + impl<'a> ParserTokenHandler<'a> for NodeVisitorTestImpl<'a> { fn handle(&mut self, token: &ParseToken, _: &F) where F: Fn(&StrRange) -> &'a str diff --git a/src/selector/cmp.rs b/src/selector/cmp.rs index 1d2a5c17..4a37c6fa 100644 --- a/src/selector/cmp.rs +++ b/src/selector/cmp.rs @@ -60,18 +60,19 @@ impl Cmp for CmpNe { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - let mut ret = vec![]; - - for a in v1 { - for b in v2 { - if a != b { - ret.push(*a); - } + let mut ret = v1.to_vec(); + for v in v2 { + if let Some(i) = ret.iter().position(|r| r == v) { + ret.remove(i); } } - + println!("{:?}", ret); ret } + + fn default(&self) -> bool { + true + } } pub struct CmpGt; @@ -226,7 +227,7 @@ mod cmp_inner_tests { #[test] fn cmp_ne() { let cmp_fn = CmpNe; - assert!(!cmp_fn.default()); + assert!(cmp_fn.default()); assert!(cmp_fn.cmp_bool(true, false)); assert!(!cmp_fn.cmp_bool(true, true)); assert!(!cmp_fn.cmp_f64(0.1, 0.1)); @@ -328,7 +329,7 @@ mod cmp_inner_tests { let empty: Vec<&Value> = Vec::new(); assert_eq!(CmpEq.cmp_json(&left, &right), left.to_vec()); - assert_eq!(CmpNe.cmp_json(&left, &right), left.to_vec()); + assert_eq!(CmpNe.cmp_json(&left, &right), empty); assert_eq!(CmpGt.cmp_json(&left, &right), empty); assert_eq!(CmpGe.cmp_json(&left, &right), empty); assert_eq!(CmpLt.cmp_json(&left, &right), empty); diff --git a/src/selector/selector_impl.rs b/src/selector/selector_impl.rs index 81e93a29..84eb24be 100644 --- a/src/selector/selector_impl.rs +++ b/src/selector/selector_impl.rs @@ -5,7 +5,7 @@ use serde_json::{Number, Value}; use serde_json::map::Entry; use JsonPathError; -use paths::{ParseTokenHandler, PathParser, StrRange, tokens::*}; +use paths::{ParserTokenHandler, PathParser, StrRange, tokens::*}; use super::utils; use super::terms::*; @@ -229,7 +229,7 @@ impl<'a> JsonSelector<'a> { } ExprTerm::Json(rel, _, v) => { if v.is_empty() { - self.current = Some(vec![]); + self.current = Some(Vec::new()); } else if let Some(vec) = rel { self.current = Some(vec); } else { @@ -331,7 +331,7 @@ impl<'a> JsonSelector<'a> { _ => panic!("empty term right"), }; - let left = match self.selector_filter.pop_term() { + let mut left = match self.selector_filter.pop_term() { Some(Some(left)) => left, Some(None) => ExprTerm::Json( None, @@ -344,21 +344,18 @@ impl<'a> JsonSelector<'a> { _ => panic!("empty term left"), }; - let mut ret = None; - match ft { - FilterToken::Equal => left.eq(&right, &mut ret), - FilterToken::NotEqual => left.ne(&right, &mut ret), - FilterToken::Greater => left.gt(&right, &mut ret), - FilterToken::GreaterOrEqual => left.ge(&right, &mut ret), - FilterToken::Little => left.lt(&right, &mut ret), - FilterToken::LittleOrEqual => left.le(&right, &mut ret), - FilterToken::And => left.and(&right, &mut ret), - FilterToken::Or => left.or(&right, &mut ret), + let expr = match ft { + FilterToken::Equal => left.eq_(right), + FilterToken::NotEqual => left.ne_(right), + FilterToken::Greater => left.gt(right), + FilterToken::GreaterOrEqual => left.ge(right), + FilterToken::Little => left.lt(right), + FilterToken::LittleOrEqual => left.le(right), + FilterToken::And => left.and(right), + FilterToken::Or => left.or(right), }; - if let Some(e) = ret { - self.selector_filter.push_term(Some(e)); - } + self.selector_filter.push_term(Some(expr)); } fn visit_range(&mut self, from: &Option, to: &Option, step: &Option) { @@ -426,7 +423,7 @@ impl<'a> JsonSelector<'a> { } } -impl<'a> ParseTokenHandler<'a> for JsonSelector<'a> { +impl<'a> ParserTokenHandler<'a> for JsonSelector<'a> { fn handle(&mut self, token: &ParseToken, parse_value_reader: &F) where F: Fn(&StrRange) -> &'a str diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 4bc4861c..0b29a6b5 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -15,69 +15,59 @@ pub enum ExprTerm<'a> { } impl<'a> ExprTerm<'a> { - fn cmp_string(&self, s1: &str, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + fn cmp_string(s1: &str, other: &mut ExprTerm<'a>, cmp_fn: &C) -> ExprTerm<'a> where - C1: Cmp, - C2: Cmp + C: Cmp, { match other { ExprTerm::String(s2) => { - let (s1, opt1) = utils::to_path_str(s1); - let (s2, opt2) = utils::to_path_str(s2); - let k1 = if let Some(opt) = opt1.as_ref() { opt } else { s1 }; - let k2 = if let Some(opt) = opt2.as_ref() { opt } else { s2 }; - ExprTerm::Bool(cmp_fn.cmp_string(k1, k2)) + let p1 = utils::to_path_str(s1); + let p2 = utils::to_path_str(s2); + ExprTerm::Bool(cmp_fn.cmp_string(p1.get_key(), p2.get_key())) } - ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => unreachable!(), _ => ExprTerm::Bool(cmp_fn.default()), } } - fn cmp_number(&self, n1: &Number, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + fn cmp_number(n1: &Number, other: &mut ExprTerm<'a>, cmp_fn: &C) -> ExprTerm<'a> where - C1: Cmp, - C2: Cmp + C: Cmp, { match other { - ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), - ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(&n2))), + ExprTerm::Json(_, _, _) => unreachable!(), _ => ExprTerm::Bool(cmp_fn.default()), } } - fn cmp_bool(&self, b1: &bool, other: &ExprTerm<'a>, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + fn cmp_bool(b1: &bool, other: &mut ExprTerm<'a>, cmp_fn: &C) -> ExprTerm<'a> where - C1: Cmp, - C2: Cmp + C: Cmp, { match other { ExprTerm::Bool(b2) => ExprTerm::Bool(cmp_fn.cmp_bool(*b1, *b2)), - ExprTerm::Json(_, _, _) => other.cmp(self, rev_cmp_fn, cmp_fn), + ExprTerm::Json(_, _, _) => unreachable!(), _ => ExprTerm::Bool(cmp_fn.default()), } } - fn cmp_json_string(&self, s2: &str, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + fn cmp_json_string(s2: &str, + fk1: &Option, + vec1: &Vec<&'a Value>, + cmp_fn: &C) -> Vec<&'a Value> where - C1: Cmp + C: Cmp { - let (s2, opt2) = utils::to_path_str(s2); + let path_str = utils::to_path_str(s2); vec1.iter().filter(|v1| match v1 { Value::String(s1) => { - if let Some(opt) = opt2.as_ref() { - cmp_fn.cmp_string(s1, opt) - } else { - cmp_fn.cmp_string(s1, s2) - } + cmp_fn.cmp_string(s1, path_str.get_key()) } Value::Object(map1) => { if let Some(FilterKey::String(k)) = fk1 { if let Some(Value::String(s1)) = map1.get(*k) { - return if let Some(opt) = opt2.as_ref() { - cmp_fn.cmp_string(s1, opt) - } else { - cmp_fn.cmp_string(s1, s2) - }; + return cmp_fn.cmp_string(s1, path_str.get_key()); } } cmp_fn.default() @@ -86,9 +76,12 @@ impl<'a> ExprTerm<'a> { }).copied().collect() } - fn cmp_json_number(&self, n2: &Number, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + fn cmp_json_number(n2: &Number, + fk1: &Option, + vec1: &Vec<&'a Value>, + cmp_fn: &C) -> Vec<&'a Value> where - C1: Cmp + C: Cmp { vec1.iter().filter(|v1| match v1 { Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)), @@ -104,7 +97,10 @@ impl<'a> ExprTerm<'a> { }).copied().collect() } - fn cmp_json_bool(&self, b2: &bool, fk1: &Option, vec1: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + fn cmp_json_bool(b2: &bool, + fk1: &Option, + vec1: &Vec<&'a Value>, + cmp_fn: &C1) -> Vec<&'a Value> where C1: Cmp { @@ -122,12 +118,20 @@ impl<'a> ExprTerm<'a> { }).copied().collect() } - fn cmp_json_json(&self, rel: &Option>, parent: &Option>, vec1: &Vec<&'a Value>, vec2: &Vec<&'a Value>, cmp_fn: &C1) -> Vec<&'a Value> + fn cmp_json_json(rel: &Option>, + parent: &Option>, + vec1: &Vec<&'a Value>, + vec2: &Vec<&'a Value>, + cmp_fn: &C1) -> Vec<&'a Value> where C1: Cmp { if let Some(vec1) = rel { - cmp_fn.cmp_json(vec1, vec2) + if let Some(vec2) = parent { + cmp_fn.cmp_json(vec1, vec2) + } else { + cmp_fn.cmp_json(vec1, vec2) + } } else if let Some(vec2) = parent { cmp_fn.cmp_json(vec1, vec2) } else { @@ -135,139 +139,148 @@ impl<'a> ExprTerm<'a> { } } - fn cmp_json(&self, rel: &Option>, fk1: &Option, vec1: &Vec<&'a Value>, other: &ExprTerm<'a>, cmp_fn: &C1) -> ExprTerm<'a> + fn cmp_json(rel: Option>, + fk1: Option>, + vec1: &mut Vec<&'a Value>, + other: &mut ExprTerm<'a>, + cmp_fn: &C1) -> ExprTerm<'a> where C1: Cmp { let ret: Vec<&Value> = match other { - ExprTerm::String(s2) => self.cmp_json_string(s2, fk1, vec1, cmp_fn), - ExprTerm::Number(n2) => self.cmp_json_number(n2, fk1, vec1, cmp_fn), - ExprTerm::Bool(b2) => self.cmp_json_bool(b2, fk1, vec1, cmp_fn), - ExprTerm::Json(parent, _, vec2) => self.cmp_json_json(rel, parent, vec1, vec2, cmp_fn) + ExprTerm::String(s2) => Self::cmp_json_string(s2, &fk1, vec1, cmp_fn), + ExprTerm::Number(n2) => Self::cmp_json_number(&n2, &fk1, vec1, cmp_fn), + ExprTerm::Bool(b2) => Self::cmp_json_bool(&b2, &fk1, vec1, cmp_fn), + ExprTerm::Json(parent, _, vec2) => { + Self::cmp_json_json(&rel, &parent, vec1, &vec2, cmp_fn) + } }; if ret.is_empty() { return ExprTerm::Bool(cmp_fn.default()); } - if let Some(rel) = rel { + if rel.is_none() { + return ExprTerm::Json(None, None, ret); + } + + if rel.is_some() { if let ExprTerm::Json(_, _, _) = &other { - return ExprTerm::Json(Some(rel.to_vec()), None, ret); - } else { - let mut object_exist = false; - for v in rel { - if v.is_object() { - object_exist = true; - break; - } - } + return ExprTerm::Json(Some(rel.unwrap()), None, ret); + } + } - if !object_exist { - return ExprTerm::Json(Some(Vec::new()), None, ret); - } + let rel = rel.unwrap(); + let mut object_exist = false; + for v in &rel { + if v.is_object() { + object_exist = true; + break; + } + } + + if !object_exist { + return ExprTerm::Json(Some(Vec::new()), None, ret); + } - let ret_set: HashSet<*const Value> = ret.iter() - .fold(HashSet::new(), |mut acc, v| { - let ptr = *v as *const Value; - acc.insert(ptr); - acc - }); - - let mut tmp = Vec::new(); - for rv in rel { - if let Value::Object(map) = rv { - for map_value in map.values() { - let ptr = map_value as *const Value; - if ret_set.contains(&ptr) { - tmp.push(*rv); - } - } + let ret_set: HashSet<*const Value> = ret.iter() + .fold(HashSet::new(), |mut acc, v| { + let ptr = *v as *const Value; + acc.insert(ptr); + acc + }); + + let mut tmp = Vec::new(); + for rv in rel { + if let Value::Object(map) = rv { + for map_value in map.values() { + let ptr = map_value as *const Value; + if ret_set.contains(&ptr) { + tmp.push(rv); } } - - return ExprTerm::Json(Some(tmp), None, ret); } } - ExprTerm::Json(None, None, ret) + ExprTerm::Json(Some(tmp), None, ret) } - fn cmp(&self, other: &Self, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> + fn cmp(&mut self, other: &mut Self, cmp_fn: &C1, rev_cmp_fn: &C2) -> ExprTerm<'a> where C1: Cmp, C2: Cmp { - match &self { - ExprTerm::String(s1) => self.cmp_string(s1, other, cmp_fn, rev_cmp_fn), - ExprTerm::Number(n1) => self.cmp_number(n1, other, cmp_fn, rev_cmp_fn), - ExprTerm::Bool(b1) => self.cmp_bool(b1, other, cmp_fn, rev_cmp_fn), + if let ExprTerm::Json(_, _, _) = other { + if let ExprTerm::Json(_, _, _) = &self { + // + } else { + return other.cmp(self, rev_cmp_fn, cmp_fn); + } + } + + match self { + ExprTerm::String(s1) => Self::cmp_string(s1, other, cmp_fn), + ExprTerm::Number(n1) => Self::cmp_number(n1, other, cmp_fn), + ExprTerm::Bool(b1) => Self::cmp_bool(b1, other, cmp_fn), ExprTerm::Json(rel, fk1, vec1) => - self.cmp_json(rel, fk1, vec1, other, cmp_fn) + Self::cmp_json(rel.take(), fk1.take(), vec1, other, cmp_fn) } } - pub fn eq(&self, other: &Self, ret: &mut Option>) { + pub fn eq_(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("eq - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpEq, &CmpEq); - debug!("eq = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpEq, &CmpEq); + debug!("eq = {:?}", expr); + expr } - pub fn ne(&self, other: &Self, ret: &mut Option>) { + pub fn ne_(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("ne - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpNe, &CmpNe); - debug!("ne = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpNe, &CmpNe); + debug!("ne = {:?}", expr); + expr } - pub fn gt(&self, other: &Self, ret: &mut Option>) { + pub fn gt(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("gt - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpGt, &CmpLt); - debug!("gt = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpGt, &CmpLt); + debug!("gt = {:?}", expr); + expr } - pub fn ge(&self, other: &Self, ret: &mut Option>) { + pub fn ge(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("ge - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpGe, &CmpLe); - debug!("ge = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpGe, &CmpLe); + debug!("ge = {:?}", expr); + expr } - pub fn lt(&self, other: &Self, ret: &mut Option>) { + pub fn lt(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("lt - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpLt, &CmpGt); - debug!("lt = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpLt, &CmpGt); + debug!("lt = {:?}", expr); + expr } - pub fn le(&self, other: &Self, ret: &mut Option>) { + pub fn le(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("le - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpLe, &CmpGe); - debug!("le = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpLe, &CmpGe); + debug!("le = {:?}", expr); + expr } - pub fn and(&self, other: &Self, ret: &mut Option>) { + pub fn and(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("and - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpAnd, &CmpAnd); - debug!("and = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpAnd, &CmpAnd); + debug!("and = {:?}", expr); + expr } - pub fn or(&self, other: &Self, ret: &mut Option>) { + pub fn or(&mut self, mut other: Self) -> ExprTerm<'a> { debug!("or - {:?} : {:?}", &self, &other); - let _ = ret.take(); - let tmp = self.cmp(other, &CmpOr, &CmpOr); - debug!("or = {:?}", tmp); - *ret = Some(tmp); + let expr = self.cmp(&mut other, &CmpOr, &CmpOr); + debug!("or = {:?}", expr); + expr } } @@ -292,6 +305,11 @@ pub enum FilterKey<'a> { All, } +struct FilterResult<'a> { + key: FilterKey<'a>, + collected: Vec<&'a Value> +} + #[derive(Debug, Default)] pub struct FilterTerms<'a>(pub Vec>>); @@ -314,55 +332,60 @@ impl<'a> FilterTerms<'a> { self.0.pop() } - pub fn filter_json_term(&mut self, e: ExprTerm<'a>, fun: F) + fn filter_json_term(&mut self, e: ExprTerm<'a>, fun: F) where - F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + F: Fn(&Vec<&'a Value>, &mut Option>) -> FilterResult<'a>, { debug!("filter_json_term: {:?}", e); if let ExprTerm::Json(rel, fk, vec) = e { let mut not_matched = Some(HashSet::new()); - let (filter_key, collected) = if let Some(FilterKey::String(key)) = fk { - let tmp = vec.iter().map(|v| match v { - Value::Object(map) if map.contains_key(key) => map.get(key).unwrap(), - _ => v - }).collect(); - fun(tmp, &mut not_matched) + let filter_result = if let Some(FilterKey::String(key)) = fk { + fun(&ValueWalker::next_with_str(&vec, key), &mut not_matched) } else { - fun(vec.to_vec(), &mut not_matched) + fun(&vec, &mut not_matched) }; if rel.is_some() { - self.push_term(Some(ExprTerm::Json(rel, Some(filter_key), collected))); + self.push_term(Some(ExprTerm::Json( + rel, + Some(filter_result.key), + filter_result.collected))); } else { let not_matched = not_matched.unwrap(); let filtered = vec.iter().enumerate() .filter(|(idx, _)| !not_matched.contains(idx)) .map(|(_, v)| *v).collect(); - self.push_term(Some(ExprTerm::Json(Some(filtered), Some(filter_key), collected))); + self.push_term(Some(ExprTerm::Json( + Some(filtered), + Some(filter_result.key), + filter_result.collected))); } } else { unreachable!("unexpected: ExprTerm: {:?}", e); } } - pub fn push_json_term(&mut self, current: Option>, fun: F) -> Option> + fn push_json_term(&mut self, current: Option>, fun: F) -> Option> where - F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + F: Fn(&Vec<&'a Value>, &mut Option>) -> FilterResult<'a>, { debug!("push_json_term: {:?}", ¤t); if let Some(current) = ¤t { - let (filter_key, collected) = fun(current.to_vec(), &mut None); - self.push_term(Some(ExprTerm::Json(None, Some(filter_key), collected))); + let filter_result = fun(current, &mut None); + self.push_term(Some(ExprTerm::Json( + None, + Some(filter_result.key), + filter_result.collected))); } current } - pub fn filter(&mut self, current: Option>, fun: F) -> Option> + fn filter(&mut self, current: Option>, fun: F) -> Option> where - F: Fn(Vec<&'a Value>, &mut Option>) -> (FilterKey<'a>, Vec<&'a Value>), + F: Fn(&Vec<&'a Value>, &mut Option>) -> FilterResult<'a>, { let peek = self.pop_term(); @@ -379,7 +402,10 @@ impl<'a> FilterTerms<'a> { pub fn filter_all_with_str(&mut self, current: Option>, key: &'a str) -> Option> { let current = self.filter(current, |vec, _| { - (FilterKey::All, ValueWalker::all_with_str(vec, key)) + FilterResult { + key: FilterKey::All, + collected: ValueWalker::all_with_str(vec, key) + } }); debug!("filter_all_with_str : {}, {:?}", key, self.0); @@ -390,34 +416,27 @@ impl<'a> FilterTerms<'a> { let current = self.filter(current, |vec, not_matched| { let mut visited = HashSet::new(); let mut acc = Vec::new(); - let (key, opt) = utils::to_path_str(key); - let k = if let Some(opt) = opt.as_ref() { opt } else { key }; - vec.iter().enumerate().for_each(|(idx, v)| { - match v { - Value::Object(map) => { - if map.contains_key(k) { - let ptr = *v as *const Value; - if !visited.contains(&ptr) { - visited.insert(ptr); - acc.push(*v) - } - } else if let Some(set) = not_matched { - set.insert(idx); - } - } - Value::Array(ay) => { - if let Some(set) = not_matched { set.insert(idx); } - for v in ay { - ValueWalker::walk_dedup(v, &mut acc, k, &mut visited); - } - } - _ => { - if let Some(set) = not_matched { set.insert(idx); } - } - } - }); - (FilterKey::String(key), acc) + let ref path_key = utils::to_path_str(key); + + ValueWalker::walk_dedup_all(vec, + path_key.get_key(), + &mut visited, + &mut |v| { + acc.push(v); + }, + &mut |idx| { + if let Some(set) = not_matched { + set.insert(idx); + } + }, + 0 + ); + + FilterResult { + key: FilterKey::String(path_key.get_origin_key()), + collected: acc + } }); debug!("filter_next_with_str : {}, {:?}", key, self.0); @@ -430,26 +449,7 @@ impl<'a> FilterTerms<'a> { return current; } - let mut acc = Vec::new(); - current.unwrap().iter().for_each(|v| { - match v { - Value::Object(map) => { - for k in map.keys() { - if let Some(Value::Array(vec)) = map.get(k) { - if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { - acc.push(v); - } - } - } - } - Value::Array(vec) => { - if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { - acc.push(v); - } - } - _ => {} - } - }); + let acc = ValueWalker::next_with_num(¤t.unwrap(), index); if acc.is_empty() { self.pop_term(); @@ -464,16 +464,7 @@ impl<'a> FilterTerms<'a> { return current; } - let mut acc = Vec::new(); - current.unwrap().iter().for_each(|v| { - match v { - Value::Object(map) => acc.extend(map.values()), - Value::Array(vec) => acc.extend(vec), - _ => {} - } - }); - - Some(acc) + Some(ValueWalker::next_all(¤t.unwrap())) } pub fn collect_next_with_str(&mut self, current: Option>, keys: &[&'a str]) -> Option> { @@ -485,8 +476,7 @@ impl<'a> FilterTerms<'a> { return current; } - trace!("#1. {:?}", keys); - let acc = ValueWalker::all_with_strs(current.unwrap(), keys); + let acc = ValueWalker::all_with_strs(current.as_ref().unwrap(), keys); if acc.is_empty() { self.pop_term(); @@ -501,7 +491,7 @@ impl<'a> FilterTerms<'a> { return current; } - Some(ValueWalker::all(current.unwrap())) + Some(ValueWalker::all(current.as_ref().unwrap())) } pub fn collect_all_with_str(&mut self, current: Option>, key: &'a str) -> Option> { @@ -510,13 +500,13 @@ impl<'a> FilterTerms<'a> { return current; } - let ret = ValueWalker::all_with_str(current.unwrap(), key); + let ret = ValueWalker::all_with_str(current.as_ref().unwrap(), key); Some(ret) } pub fn collect_all_with_num(&mut self, mut current: Option>, index: f64) -> Option> { if let Some(current) = current.take() { - let ret = ValueWalker::all_with_num(current, index); + let ret = ValueWalker::all_with_num(¤t, index); if !ret.is_empty() { return Some(ret); } diff --git a/src/selector/utils.rs b/src/selector/utils.rs index c68f1ad2..7c4647d0 100644 --- a/src/selector/utils.rs +++ b/src/selector/utils.rs @@ -18,16 +18,37 @@ pub fn abs_index(n: isize, len: usize) -> usize { } } -pub fn to_path_str(key: &str) -> (&str, Option) { - let key = if key.starts_with('\'') || key.starts_with('"') { - let s = &key[1..key.len() - 1]; - if key.contains('\\') { - (s, Some(s.chars().filter(|ch| ch != &'\\').collect())) +pub struct PathKey<'a> { + key: &'a str, + special_key: Option +} + +impl<'a: 'b, 'b> PathKey<'a> { + pub fn get_key(&'a self) -> &'b str { + if let Some(skey) = self.special_key.as_ref() { + skey } else { - (s, None) + self.key } - } else { - (key, None) - }; - key + } + + pub fn get_origin_key(&self) -> &'a str { + self.key + } } + +pub fn to_path_str<'a>(key: &'a str) -> PathKey<'a> { + let mut path_key = PathKey { + key, + special_key: None + }; + + if key.starts_with('\'') || key.starts_with('"') { + let s = &key[1..key.len() - 1]; + path_key.key = s; + if key.contains('\\') { + path_key.special_key = Some(s.chars().filter(|ch| ch != &'\\').collect()); + } + } + path_key +} \ No newline at end of file diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index d8872124..8c866bc9 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -2,39 +2,82 @@ use std::collections::HashSet; use serde_json::Value; use super::utils; +use selector::utils::PathKey; pub(super) struct ValueWalker; impl<'a> ValueWalker { - pub fn all_with_num(vec: Vec<&'a Value>, index: f64) -> Vec<&'a Value> { + pub fn next_all(vec: &Vec<&'a Value>) -> Vec<&'a Value> { + vec.iter().fold(Vec::new(), |mut acc, v| { + match v { + Value::Object(map) => acc.extend(map.values()), + Value::Array(vec) => acc.extend(vec), + _ => {} + } + acc + }) + } + + pub fn next_with_str(vec: &Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { + vec.iter().fold(Vec::new(), |mut acc, v| { + if let Value::Object(map) = v { + if let Some(v) = map.get(key) { + acc.push(v); + } + } + acc + }) + } + + pub fn next_with_num(vec: &Vec<&'a Value>, index: f64) -> Vec<&'a Value> { + vec.iter().fold(Vec::new(), |mut acc, v| { + match v { + Value::Object(map) => { + for k in map.keys() { + if let Some(Value::Array(vec)) = map.get(k) { + if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { + acc.push(v); + } + } + } + } + Value::Array(vec) => { + if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { + acc.push(v); + } + } + _ => {} + } + acc + }) + } + + pub fn all_with_num(vec: &Vec<&'a Value>, index: f64) -> Vec<&'a Value> { Self::walk(vec, &|v, acc| { if v.is_array() { - if let Some(vv) = v.get(index as usize) { - acc.push(vv); + if let Some(v) = v.get(index as usize) { + acc.push(v); } } }) } - pub fn all_with_str(vec: Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { - let (key, opt) = utils::to_path_str(key); - let k = if let Some(opt) = opt.as_ref() { opt } else { key }; + pub fn all_with_str(vec: &Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { + let path_key = utils::to_path_str(key); Self::walk(vec, &|v, acc| if let Value::Object(map) = v { - if let Some(v) = map.get(k) { + if let Some(v) = map.get(path_key.get_key()) { acc.push(v); } }) } - pub fn all_with_strs(vec: Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { + pub fn all_with_strs(vec: &Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { let mut acc = Vec::new(); - let new_keys: Vec<(&str, Option)> = keys.iter().map(|key| utils::to_path_str(key)).collect(); - + let ref path_keys: Vec = keys.iter().map(|key| { utils::to_path_str(key) }).collect(); for v in vec { if let Value::Object(map) = v { - for (key, opt) in &new_keys { - let k = if let Some(opt) = opt.as_ref() { opt } else { *key }; - if let Some(v) = map.get(k) { + for pk in path_keys { + if let Some(v) = map.get(pk.get_key()) { acc.push(v) } } @@ -43,7 +86,7 @@ impl<'a> ValueWalker { acc } - pub fn all(vec: Vec<&'a Value>) -> Vec<&'a Value> { + pub fn all(vec: &Vec<&'a Value>) -> Vec<&'a Value> { Self::walk(vec, &|v, acc| { match v { Value::Array(ay) => acc.extend(ay), @@ -55,7 +98,7 @@ impl<'a> ValueWalker { }) } - fn walk(vec: Vec<&'a Value>, fun: &F) -> Vec<&'a Value> + fn walk(vec: &Vec<&'a Value>, fun: &F) -> Vec<&'a Value> where F: Fn(&'a Value, &mut Vec<&'a Value>), { @@ -83,26 +126,68 @@ impl<'a> ValueWalker { } } - pub fn walk_dedup(v: &'a Value, - acc: &mut Vec<&'a Value>, - key: &str, - visited: &mut HashSet<*const Value>, ) { + pub fn walk_dedup_all(vec: &Vec<&'a Value>, + key: &str, + visited: &mut HashSet<*const Value>, + is_contain: &mut F1, + is_not_contain: &mut F2, + depth: usize) + where + F1: FnMut(&'a Value), + F2: FnMut(usize), + { + vec.iter().enumerate().for_each(|(index, v)| Self::walk_dedup(v, + key, + visited, + index, + is_contain, + is_not_contain, + depth)); + } + + fn walk_dedup(v: &'a Value, + key: &str, + visited: &mut HashSet<*const Value>, + index: usize, + is_contain: &mut F1, + is_not_contain: &mut F2, + depth: usize) + where + F1: FnMut(&'a Value), + F2: FnMut(usize), + { + let ptr = v as *const Value; + if visited.contains(&ptr) { + return; + } + match v { Value::Object(map) => { if map.contains_key(key) { let ptr = v as *const Value; if !visited.contains(&ptr) { visited.insert(ptr); - acc.push(v) + is_contain(v); + } + } else { + if depth == 0 { + is_not_contain(index); } } } Value::Array(vec) => { - for v in vec { - Self::walk_dedup(v, acc, key, visited); + if depth == 0 { + is_not_contain(index); + } + vec.iter().for_each(|v| { + Self::walk_dedup(&v, key, visited, index, is_contain, is_not_contain, depth + 1); + }) + } + _ => { + if depth == 0 { + is_not_contain(index); } } - _ => {} } } } diff --git a/tests/op.rs b/tests/op.rs index 1ade0dd0..35089d8d 100644 --- a/tests/op.rs +++ b/tests/op.rs @@ -242,17 +242,96 @@ fn op_eq_for_object_value() { ); } +/// +/// It seems to Jayway's bug. +/// +/// 빈 배열이 아니라 current context가 리턴되야 하는데 빈배열이 리턴됨. +/// 참고: `op_ne_for_object_value2` 결과와 다름 +/// #[test] fn op_ne_for_object_value() { setup(); select_and_then_compare( r#"$.[?(@.a != @.c)]"#, - json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), - json!([]), + json!({ + "a": { + "1": 1 + }, + "c": { + "1": 1 + } + }), + json!([{ + "a": { + "1": 1 + }, + "c": { + "1": 1 + } + }]), ); } +#[test] +fn op_ne_for_object_value2() { + setup(); + + select_and_then_compare( + "$.[?(@.store1 != @.store2)]", + json!({ + "store1": { + "a" : 1 + }, + "store2": { + "b" : 1 + } + }), + json!([{ + "store1" : { + "a" : 1 + }, + "store2" : { + "b" : 1 + } + } + ]), + ); +} + +#[test] +fn cmp_json_rel() { + setup(); + + select_and_then_compare( + "$.[?(@.a.a == @.b.a)]", + json!({ + "a": { + "a": [true, "1"] + }, + "b": { + "a": [true, "1"] + } + }), + json!([ + { + "a" : { + "a" : [ + true, + "1" + ] + }, + "b" : { + "a" : [ + true, + "1" + ] + } + } + ]) + ) +} + #[test] fn op_lt_for_object_value() { setup(); @@ -314,8 +393,17 @@ fn op_ne_for_complex_value() { select_and_then_compare( r#"$.[?("1" != @.a)]"#, - json!({ "a": { "b": 1 } }), - json!([]), + json!({ + "a": { + "b": 1 + } + }), + json!([{ + "a" : { + "b" : 1 + } + } + ]) ); } From d7d22a7d22f1f69a6fa9c2da600b1ed134bf6376 Mon Sep 17 00:00:00 2001 From: freestrings Date: Fri, 6 Aug 2021 13:45:12 +0900 Subject: [PATCH 17/22] "Cmp" improvement --- benchmark/flame.svg | 2376 ++++++++++++++++++++++++++++++++++ src/paths/path_parser.rs | 2 +- src/selector/cmp.rs | 44 +- src/selector/terms.rs | 5 +- src/selector/value_walker.rs | 24 +- 5 files changed, 2414 insertions(+), 37 deletions(-) create mode 100644 benchmark/flame.svg diff --git a/benchmark/flame.svg b/benchmark/flame.svg new file mode 100644 index 00000000..63fd4d80 --- /dev/null +++ b/benchmark/flame.svg @@ -0,0 +1,2376 @@ + + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search +ic + + + +jsonpath_lib::paths::parser_node_visitor::ParserNodeVisitor::visit (69 samples, 57.02%) +jsonpath_lib::paths::parser_node_visitor::ParserNodeVisitor::visit + + +indexmap::map::core::equivalent::{{closure}} (3 samples, 2.48%) +in.. + + +core::ptr::drop_in_place<jsonpath_lib::selector::selector_impl::JsonSelector> (5 samples, 4.13%) +core.. + + +setup_arg_pages (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::extend_desugared (4 samples, 3.31%) +all.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +core::mem::take (1 samples, 0.83%) + + + +core::option::Option<T>::take (1 samples, 0.83%) + + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +hashbrown::map::make_insert_hash (2 samples, 1.65%) + + + +core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (1 samples, 0.83%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.83%) + + + +_GI___libc_malloc (1 samples, 0.83%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 2.48%) +co.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.83%) + + + +dl_map_object (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::fold (113 samples, 93.39%) +core::iter::traits::iterator::Iterator::fold + + +core::ptr::read (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term (4 samples, 3.31%) +jso.. + + +indexmap::map::IndexMap<K,V,S>::get (5 samples, 4.13%) +inde.. + + +int_malloc (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::filter (30 samples, 24.79%) +jsonpath_lib::paths::path_parser::Parse.. + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (13 samples, 10.74%) +serde_json::map.. + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>>> (5 samples, 4.13%) +core.. + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term_num (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term_num (3 samples, 2.48%) +js.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::parser_token_handler::ParserTokenHandler>::handle (68 samples, 56.20%) +<jsonpath_lib::selector::selector_impl::JsonSelector as jsonpath_lib::paths::parser_token_h.. + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup_all::{{closure}} (31 samples, 25.62%) +jsonpath_lib::selector::value_walker::Va.. + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_filter (24 samples, 19.83%) +jsonpath_lib::selector::selecto.. + + +<hashbrown::raw::RawIterRange<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (5 samples, 4.13%) +<all.. + + +hashbrown::map::HashMap<K,V,S,A>::contains_key (2 samples, 1.65%) + + + +alloc::alloc::Global::alloc_impl (1 samples, 0.83%) + + + +int_realloc (2 samples, 1.65%) + + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (3 samples, 2.48%) +co.. + + +core::mem::swap (1 samples, 0.83%) + + + +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (3 samples, 2.48%) +js.. + + +alloc::alloc::Global::alloc_impl (1 samples, 0.83%) + + + +alloc::alloc::Global::grow_impl (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::array (31 samples, 25.62%) +jsonpath_lib::paths::path_parser::Parser.. + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (2 samples, 1.65%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>> (5 samples, 4.13%) +core.. + + +std::rt::lang_start::{{closure}} (113 samples, 93.39%) +std::rt::lang_start::{{closure}} + + +hashbrown::raw::RawTable<T,A>::reserve (5 samples, 4.13%) +hash.. + + +_rdl_dealloc (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::fold (1 samples, 0.83%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (5 samples, 4.13%) +<cor.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.83%) + + + +main (113 samples, 93.39%) +main + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1 samples, 0.83%) + + + +_rust_alloc (1 samples, 0.83%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (3 samples, 2.48%) +co.. + + +alloc::boxed::Box<T>::new (1 samples, 0.83%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.83%) + + + +core::num::dec2flt::common::AsciiStr::parse_digits (1 samples, 0.83%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.83%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>> (1 samples, 0.83%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 1.65%) + + + +alloc::alloc::Global::alloc_impl (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json (9 samples, 7.44%) +jsonpath_l.. + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (5 samples, 4.13%) +core.. + + +dl_start_final (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::array_start (31 samples, 25.62%) +jsonpath_lib::paths::path_parser::Parser.. + + +alloc::boxed::Box<T>::new (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +hashbrown::set::HashSet<T,S,A>::insert (8 samples, 6.61%) +hashbrown.. + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 1.65%) + + + +core::num::dec2flt::parse::parse_number (1 samples, 0.83%) + + + +<jsonpath_lib::selector::cmp::CmpAnd as jsonpath_lib::selector::cmp::Cmp>::cmp_json (2 samples, 1.65%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 2.48%) +<[.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp (2 samples, 1.65%) + + + +_rdl_alloc (1 samples, 0.83%) + + + +std::panicking::try::do_call (113 samples, 93.39%) +std::panicking::try::do_call + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (5 samples, 4.13%) +<cor.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (5 samples, 4.13%) +json.. + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 3.31%) +<al.. + + +hashbrown::raw::RawTableInner<A>::fallible_with_capacity (1 samples, 0.83%) + + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.83%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::op (4 samples, 3.31%) +jso.. + + +core::num::dec2flt::parse::parse_partial_number (1 samples, 0.83%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.83%) + + + +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.65%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (36 samples, 29.75%) +jsonpath_lib::paths::path_parser::ParserImpl::p.. + + +hashbrown::set::HashSet<T,S,A>::contains (6 samples, 4.96%) +hashbr.. + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}}::{{closure}} (2 samples, 1.65%) + + + +indexmap::map::IndexMap<K,V,S>::get (13 samples, 10.74%) +indexmap::map::.. + + +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::paths::path_parser::ParserNode>> (5 samples, 4.13%) +core.. + + +std::sys_common::backtrace::_rust_begin_short_backtrace (113 samples, 93.39%) +std::sys_common::backtrace::_rust_begin_short_backtrace + + +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 1.65%) + + + +hashbrown::raw::Bucket<T>::next_n (1 samples, 0.83%) + + + +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json::{{closure}} (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::reserve (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (9 samples, 7.44%) +<alloc::ve.. + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str::{{closure}} (34 samples, 28.10%) +jsonpath_lib::selector::terms::FilterTerms::.. + + +<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.83%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::string_to_num (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (2 samples, 1.65%) + + + +exec_binprm (7 samples, 5.79%) +exec_bi.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.83%) + + + +core::ptr::swap_nonoverlapping_bytes (1 samples, 0.83%) + + + +std::panic::catch_unwind (113 samples, 93.39%) +std::panic::catch_unwind + + +jsonpath_lib::paths::path_parser::ParserImpl::json_path (36 samples, 29.75%) +jsonpath_lib::paths::path_parser::ParserImpl::j.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::little (1 samples, 0.83%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 1.65%) + + + +dl_catch_exception (1 samples, 0.83%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (5 samples, 4.13%) +inde.. + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +<hashbrown::raw::RawIter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +indexmap::map::core::equivalent::{{closure}} (5 samples, 4.13%) +inde.. + + +hashbrown::raw::alloc::inner::do_alloc (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +core::mem::replace (1 samples, 0.83%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::select (69 samples, 57.02%) +jsonpath_lib::selector::selector_impl::JsonSelector::select + + +core::ptr::write (1 samples, 0.83%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::vec::Vec<&serde_json::value::Value>>> (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::collect (5 samples, 4.13%) +core.. + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserNode> (5 samples, 4.13%) +core.. + + +alloc::alloc::alloc (1 samples, 0.83%) + + + +int_free (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::expr (11 samples, 9.09%) +jsonpath_lib:.. + + +load_elf_binary (7 samples, 5.79%) +load_el.. + + +core::hash::Hasher::write_u8 (1 samples, 0.83%) + + + +hashbrown::map::HashMap<K,V,S,A>::contains_key (6 samples, 4.96%) +hashbr.. + + +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.83%) + + + +hashbrown::map::HashMap<K,V,S,A>::get_inner (6 samples, 4.96%) +hashbr.. + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_relative (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp (5 samples, 4.13%) +json.. + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>> (3 samples, 2.48%) +co.. + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.83%) + + + +_GI___libc_free (1 samples, 0.83%) + + + +std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserNode> (5 samples, 4.13%) +core.. + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.65%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserImpl> (5 samples, 4.13%) +core.. + + +alloc::vec::Vec<T,A>::reserve (1 samples, 0.83%) + + + +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::push (2 samples, 1.65%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 1.65%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.83%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (5 samples, 4.13%) +<all.. + + +jsonpath_lib::paths::path_parser::ParserImpl::close_token (1 samples, 0.83%) + + + +perf_iterate_sb (6 samples, 4.96%) +perf_i.. + + +perf_event_comm (6 samples, 4.96%) +perf_e.. + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserNode> (2 samples, 1.65%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (4 samples, 3.31%) +ind.. + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>>> (5 samples, 4.13%) +core.. + + +jsonpath_lib_benches::main (113 samples, 93.39%) +jsonpath_lib_benches::main + + +hashbrown::map::HashMap<K,V,S,A>::get_inner (1 samples, 0.83%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.83%) + + + +jsonpath_lib::paths::str_reader::StrReader::next_char (1 samples, 0.83%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::for_each (29 samples, 23.97%) +<core::slice::iter::Iter<T> as core::.. + + +int_malloc (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.83%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::for_each (113 samples, 93.39%) +core::iter::traits::iterator::Iterator::for_each + + +_x64_sys_execve (7 samples, 5.79%) +_x64_sy.. + + +alloc::alloc::exchange_malloc (1 samples, 0.83%) + + + +core::core_arch::simd::i8x16::new (1 samples, 0.83%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (3 samples, 2.48%) +js.. + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 1.65%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (5 samples, 4.13%) +<all.. + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +hashbrown::raw::RawTable<T,A>::find (1 samples, 0.83%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (5 samples, 4.13%) +<cor.. + + +alloc::vec::Vec<T,A>::push (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::FilterTerms::push_term (4 samples, 3.31%) +jso.. + + +int_free (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::path (1 samples, 0.83%) + + + +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 1.65%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.83%) + + + +<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (2 samples, 1.65%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (113 samples, 93.39%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} + + +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.83%) + + + +core::hash::sip::u8to64_le (1 samples, 0.83%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_absolute (1 samples, 0.83%) + + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (29 samples, 23.97%) +jsonpath_lib::selector::value_walker:.. + + +core::result::Result<T,E>::map_err (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.83%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>>> (5 samples, 4.13%) +core.. + + +alloc::alloc::alloc (1 samples, 0.83%) + + + +jsonpath_lib_benches::main::{{closure}} (113 samples, 93.39%) +jsonpath_lib_benches::main::{{closure}} + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 4.13%) +<cor.. + + +hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 3.31%) +has.. + + +hashbrown::raw::RawTable<T,A>::free_buckets (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::or (2 samples, 1.65%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>>> (3 samples, 2.48%) +co.. + + +dl_load_cache_lookup (1 samples, 0.83%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 2.48%) +co.. + + +hashbrown::raw::RawTableInner<A>::new_in (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::path (2 samples, 1.65%) + + + +core::iter::traits::iterator::Iterator::for_each (31 samples, 25.62%) +core::iter::traits::iterator::Iterator::.. + + +alloc::alloc::alloc (1 samples, 0.83%) + + + +<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (2 samples, 1.65%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<&serde_json::value::Value>> (1 samples, 0.83%) + + + +std::rt::lang_start_internal::{{closure}} (113 samples, 93.39%) +std::rt::lang_start_internal::{{closure}} + + +jsonpath_lib::paths::path_parser::ParserImpl::term (3 samples, 2.48%) +js.. + + +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>> (5 samples, 4.13%) +core.. + + +alloc::alloc::box_free (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.83%) + + + +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json::{{closure}}::{{closure}} (1 samples, 0.83%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +alloc::vec::Vec<T>::with_capacity (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 1.65%) + + + +_libc_start_main (113 samples, 93.39%) +_libc_start_main + + +do_syscall_64 (7 samples, 5.79%) +do_sysc.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 2.48%) +<c.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (18 samples, 14.88%) +jsonpath_lib::paths::p.. + + +jsonpath_lib::paths::path_parser::PathParser::compile (36 samples, 29.75%) +jsonpath_lib::paths::path_parser::PathParser::c.. + + +jsonpath_lib::select (113 samples, 93.39%) +jsonpath_lib::select + + +alloc::alloc::box_free (1 samples, 0.83%) + + + +<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.83%) + + + +jsonpath_lib::paths::str_reader::StrReader::next (1 samples, 0.83%) + + + +jsonpath_lib::paths::str_reader::StrReader::peek_char (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::path (3 samples, 2.48%) +js.. + + +hashbrown::raw::RawTableInner<A>::prepare_resize (1 samples, 0.83%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::FilterTerms::collect_next_with_str (1 samples, 0.83%) + + + +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (31 samples, 25.62%) +<core::iter::adapters::enumerate::Enumer.. + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (1 samples, 0.83%) + + + +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.83%) + + + +core::mem::replace (1 samples, 0.83%) + + + +bprm_execve (7 samples, 5.79%) +bprm_ex.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +core::ptr::swap_nonoverlapping_one (1 samples, 0.83%) + + + +hashbrown::raw::RawTable<T,A>::insert (5 samples, 4.13%) +hash.. + + +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (31 samples, 25.62%) +core::iter::traits::iterator::Iterator::.. + + +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +alloc::alloc::exchange_malloc (2 samples, 1.65%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (9 samples, 7.44%) +<alloc::ve.. + + +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (1 samples, 0.83%) + + + +<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +std::rt::lang_start_internal (113 samples, 93.39%) +std::rt::lang_start_internal + + +core::ptr::swap_nonoverlapping (1 samples, 0.83%) + + + +<jsonpath_lib::selector::cmp::CmpOr as jsonpath_lib::selector::cmp::Cmp>::cmp_json (1 samples, 0.83%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.83%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 2.48%) +<c.. + + +jsonpath_lib::paths::path_parser::ParserImpl::exprs (29 samples, 23.97%) +jsonpath_lib::paths::path_parser::Par.. + + +core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (1 samples, 0.83%) + + + +std::collections::hash::set::HashSet<T,S>::contains (2 samples, 1.65%) + + + +core::hash::sip::u8to64_le (1 samples, 0.83%) + + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +hashbrown::raw::RawTable<T,A>::get_mut (1 samples, 0.83%) + + + +_set_task_comm (6 samples, 4.96%) +_set_t.. + + +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (113 samples, 93.39%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 1.65%) + + + +core::mem::take (1 samples, 0.83%) + + + +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.83%) + + + +core::ptr::write (2 samples, 1.65%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.83%) + + + +std::panicking::try (113 samples, 93.39%) +std::panicking::try + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::op (6 samples, 4.96%) +jsonpa.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::push (2 samples, 1.65%) + + + +dl_map_object_deps (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::condition_expr (1 samples, 0.83%) + + + +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.83%) + + + +alloc::alloc::Global::alloc_impl (1 samples, 0.83%) + + + +core::num::<impl u64>::wrapping_add (2 samples, 1.65%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserNode> (4 samples, 3.31%) +cor.. + + +alloc::alloc::box_free (1 samples, 0.83%) + + + +<jsonpath_lib::paths::tokens::ParseToken as core::clone::Clone>::clone (1 samples, 0.83%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (5 samples, 4.13%) +serd.. + + +core::num::<impl u64>::rotate_left (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (2 samples, 1.65%) + + + +hashbrown::raw::RawTable<T,A>::new_in (1 samples, 0.83%) + + + +hashbrown::raw::RawTable<T,A>::resize (5 samples, 4.13%) +hash.. + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (5 samples, 4.13%) +<cor.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (1 samples, 0.83%) + + + +hashbrown::map::make_hash (6 samples, 4.96%) +hashbr.. + + +std::panicking::try::do_call (113 samples, 93.39%) +std::panicking::try::do_call + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokens::Token::reset_span (1 samples, 0.83%) + + + +dl_main (1 samples, 0.83%) + + + +vm_stat_account (1 samples, 0.83%) + + + +std::panic::catch_unwind (113 samples, 93.39%) +std::panic::catch_unwind + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +hashbrown::raw::RawTableInner<A>::new_uninitialized (1 samples, 0.83%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (6 samples, 4.96%) +indexm.. + + +jsonpath_lib::paths::path_parser::ParserImpl::term (2 samples, 1.65%) + + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (2 samples, 1.65%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>> (4 samples, 3.31%) +cor.. + + +core::option::Option<T>::get_or_insert_with (2 samples, 1.65%) + + + +perf_event_comm_output (6 samples, 4.96%) +perf_e.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +alloc::alloc::exchange_malloc (1 samples, 0.83%) + + + +openaux (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.83%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>>> (2 samples, 1.65%) + + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup::{{closure}} (29 samples, 23.97%) +jsonpath_lib::selector::value_walker:.. + + +_GI___libc_malloc (2 samples, 1.65%) + + + +std::collections::hash::set::HashSet<T>::new (2 samples, 1.65%) + + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +core::hash::Hasher::write_usize (1 samples, 0.83%) + + + +hashbrown::raw::RawTable<T,A>::reserve_rehash (5 samples, 4.13%) +hash.. + + +start (114 samples, 94.21%) +start + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 1.65%) + + + +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::fold (1 samples, 0.83%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (2 samples, 1.65%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 1.65%) + + + +core::str::<impl str>::parse (1 samples, 0.83%) + + + +_memcmp_avx2_movbe (2 samples, 1.65%) + + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup_all (31 samples, 25.62%) +jsonpath_lib::selector::value_walker::Va.. + + +dl_start (1 samples, 0.83%) + + + +core::hash::Hasher::write_u8 (1 samples, 0.83%) + + + +hashbrown::set::HashSet<T,S,A>::contains (2 samples, 1.65%) + + + +jsonpath_lib::paths::str_reader::StrReader::take_while (1 samples, 0.83%) + + + +dl_sysdep_start (1 samples, 0.83%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.83%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (12 samples, 9.92%) +indexmap::map:.. + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +<jsonpath_lib::selector::cmp::CmpEq as jsonpath_lib::selector::cmp::Cmp>::cmp_json (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::gt (9 samples, 7.44%) +jsonpath_l.. + + +std::panicking::try (113 samples, 93.39%) +std::panicking::try + + +core::iter::traits::iterator::Iterator::collect (9 samples, 7.44%) +core::iter.. + + +std::collections::hash::set::HashSet<T,S>::insert (8 samples, 6.61%) +std::coll.. + + +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (1 samples, 0.83%) + + + +core::intrinsics::copy_nonoverlapping (1 samples, 0.83%) + + + +jsonpath_lib::selector::value_walker::ValueWalker::walk_dedup (31 samples, 25.62%) +jsonpath_lib::selector::value_walker::Va.. + + +alloc::alloc::alloc (2 samples, 1.65%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (9 samples, 7.44%) +<alloc::ve.. + + +begin_new_exec (6 samples, 4.96%) +begin_.. + + +hashbrown::map::HashMap<K,V,S,A>::insert (8 samples, 6.61%) +hashbrown.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 1.65%) + + + +hashbrown::map::make_hash (1 samples, 0.83%) + + + +int_free (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number::{{closure}} (5 samples, 4.13%) +json.. + + +jsonpath_lib::selector::terms::FilterTerms::filter_next_with_str (34 samples, 28.10%) +jsonpath_lib::selector::terms::FilterTerms::.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths_dot (3 samples, 2.48%) +js.. + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +core::hash::Hasher::write_usize (3 samples, 2.48%) +co.. + + +alloc::alloc::realloc (2 samples, 1.65%) + + + +int_free (1 samples, 0.83%) + + + +_memmove_avx_unaligned_erms (2 samples, 1.65%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.83%) + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8 samples, 6.61%) +<alloc::v.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (1 samples, 0.83%) + + + +int_malloc (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.83%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::PathParser> (5 samples, 4.13%) +core.. + + +<alloc::rc::Rc<T> as core::ops::drop::Drop>::drop (5 samples, 4.13%) +<all.. + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.83%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 1.65%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.83%) + + + +core::ptr::drop_in_place<jsonpath_lib::paths::path_parser::ParserNode> (3 samples, 2.48%) +co.. + + +indexmap::map::IndexMap<K,V,S>::get (2 samples, 1.65%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 1.65%) + + + +alloc::alloc::dealloc (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +core::ptr::drop_in_place<hashbrown::raw::RawTable< (1 samples, 0.83%) + + + +indexmap::map::IndexMap<K,V,S>::hash (6 samples, 4.96%) +indexm.. + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +do_execveat_commo.sr. (7 samples, 5.79%) +do_exec.. + + +jsonpath_lib::paths::path_parser::ParserImpl::expr (9 samples, 7.44%) +jsonpath_l.. + + +core::ops::function::FnOnce::call_once (113 samples, 93.39%) +core::ops::function::FnOnce::call_once + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_number (9 samples, 7.44%) +jsonpath_l.. + + +core::option::Option<T>::get_or_insert_with (2 samples, 1.65%) + + + +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.83%) + + + +perf_output_begin (6 samples, 4.96%) +perf_o.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::other (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::FilterTerms::push_json_term (34 samples, 28.10%) +jsonpath_lib::selector::terms::FilterTerms::.. + + +std::collections::hash::set::HashSet<T,S>::contains (6 samples, 4.96%) +std::c.. + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json (5 samples, 4.13%) +json.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::term (1 samples, 0.83%) + + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.83%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 1.65%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::Tokenizer::or (1 samples, 0.83%) + + + +core::num::dec2flt::dec2flt (1 samples, 0.83%) + + + +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.83%) + + + +alloc::alloc::alloc (1 samples, 0.83%) + + + +core::hash::Hasher::write_u8 (1 samples, 0.83%) + + + +alloc::vec::Vec<T,A>::extend_desugared (7 samples, 5.79%) +alloc::.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (1 samples, 0.83%) + + + +alloc::raw_vec::finish_grow (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::PathParser::parse (69 samples, 57.02%) +jsonpath_lib::paths::path_parser::PathParser::parse + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (5 samples, 4.13%) +<std.. + + +perf_iterate_ctx (6 samples, 4.96%) +perf_i.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (3 samples, 2.48%) +<s.. + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (2 samples, 1.65%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp (2 samples, 1.65%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (2 samples, 1.65%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<&serde_json::value::Value>> (1 samples, 0.83%) + + + +alloc::alloc::Global::alloc_impl (2 samples, 1.65%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::paths (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::FilterTerms::filter (34 samples, 28.10%) +jsonpath_lib::selector::terms::FilterTerms::.. + + +all (121 samples, 100%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::compile (36 samples, 29.75%) +jsonpath_lib::paths::path_parser::ParserImpl::c.. + + +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.83%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (6 samples, 4.96%) +hashbr.. + + +jsonpath_lib::selector::terms::ExprTerm::lt (5 samples, 4.13%) +json.. + + +core::num::<impl u64>::wrapping_add (1 samples, 0.83%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.83%) + + + +core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (1 samples, 0.83%) + + + +core::option::Option<T>::take (1 samples, 0.83%) + + + +core::iter::traits::iterator::Iterator::fold (31 samples, 25.62%) +core::iter::traits::iterator::Iterator::.. + + +_memcmp_avx2_movbe (2 samples, 1.65%) + + + +core::ptr::drop_in_place<alloc::rc::Rc<jsonpath_lib::paths::path_parser::PathParser>> (5 samples, 4.13%) +core.. + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.83%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (4 samples, 3.31%) +<co.. + + +core::ptr::write (1 samples, 0.83%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::eat_whitespace (1 samples, 0.83%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (3 samples, 2.48%) +<Q.. + + +<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (31 samples, 25.62%) +<core::iter::adapters::enumerate::Enumer.. + + +core::num::dec2flt::parse::try_parse_digits (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::and (2 samples, 1.65%) + + + +jsonpath_lib_be (121 samples, 100.00%) +jsonpath_lib_be + + +jsonpath_lib::paths::str_reader::StrReader::peek (1 samples, 0.83%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 1.65%) + + + +hashbrown::raw::RawTableInner<A>::find_insert_slot (1 samples, 0.83%) + + + +entry_SYSCALL_64_after_hwframe (7 samples, 5.79%) +entry_S.. + + +alloc::alloc::box_free (1 samples, 0.83%) + + + +alloc::boxed::Box<T>::new (2 samples, 1.65%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp_json_json (2 samples, 1.65%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.83%) + + + +jsonpath_lib::paths::path_parser::ParserImpl::exprs (15 samples, 12.40%) +jsonpath_lib::path.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::next_token (1 samples, 0.83%) + + + +jsonpath_lib::selector::terms::ExprTerm::cmp (9 samples, 7.44%) +jsonpath_l.. + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::paths::path_parser::ParserNode>>> (4 samples, 3.31%) +cor.. + + +core::iter::traits::iterator::Iterator::fold (2 samples, 1.65%) + + + +core::hash::sip::u8to64_le (1 samples, 0.83%) + + + +_GI___libc_malloc (1 samples, 0.83%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (6 samples, 4.96%) +hashbr.. + + +hashbrown::raw::inner::RawTable<T,A>::get (4 samples, 3.31%) +has.. + + +jsonpath_lib::paths::tokenizer::Tokenizer::read_token (1 samples, 0.83%) + + + +core::option::Option<T>::get_or_insert_with (1 samples, 0.83%) + + + +_GI___libc_realloc (2 samples, 1.65%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +jsonpath_lib::paths::tokenizer::TokenReader::peek_token::{{closure}} (1 samples, 0.83%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 1.65%) + + + +tcache_get (1 samples, 0.83%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 2.48%) +co.. + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.83%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::visit_key (35 samples, 28.93%) +jsonpath_lib::selector::selector_impl::JsonSel.. + + +core::ptr::write (1 samples, 0.83%) + + + +jsonpath_lib::selector::selector_impl::JsonSelector::select (69 samples, 57.02%) +jsonpath_lib::selector::selector_impl::JsonSelector::select + + + diff --git a/src/paths/path_parser.rs b/src/paths/path_parser.rs index 8ee456cd..178e105d 100644 --- a/src/paths/path_parser.rs +++ b/src/paths/path_parser.rs @@ -18,7 +18,7 @@ impl<'a> PathParser<'a> { Ok(PathParser { parser }) } - pub fn parse(&self, parse_token_handler: &mut F) -> Result<(), String> + pub(crate) fn parse(&self, parse_token_handler: &mut F) -> Result<(), String> where F: ParserTokenHandler<'a>, { diff --git a/src/selector/cmp.rs b/src/selector/cmp.rs index 4a37c6fa..66d5a864 100644 --- a/src/selector/cmp.rs +++ b/src/selector/cmp.rs @@ -30,17 +30,14 @@ impl Cmp for CmpEq { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - let mut ret = vec![]; - - for a in v1 { - for b in v2 { - if a == b { - ret.push(*a); + v1.iter().fold(Vec::new(), |acc, a| { + v2.iter().fold(acc, |mut acc, b| { + if *a as *const Value == *b as *const Value { + acc.push(*a); } - } - } - - ret + acc + }) + }) } } @@ -62,11 +59,13 @@ impl Cmp for CmpNe { fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { let mut ret = v1.to_vec(); for v in v2 { - if let Some(i) = ret.iter().position(|r| r == v) { - ret.remove(i); + for i in 0..ret.len() { + if *v as *const Value == &*ret[i] as *const Value { + ret.remove(i); + break; + } } } - println!("{:?}", ret); ret } @@ -191,17 +190,22 @@ impl Cmp for CmpOr { } fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { - let mut ret = [v1, v2].concat(); + v2.iter().fold(v1.to_vec(), |mut acc, v| { + let mut contains = false; - for x in (0..ret.len()).rev() { - for y in (x + 1..ret.len()).rev() { - if ret[x] == ret[y] { - ret.remove(y); + for ptr in v1.iter().map(|v| *v as *const Value) { + if ptr == *v as *const Value { + contains = true; + break; } } - } - ret + if !contains { + acc.push(v); + } + + acc + }) } } diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 0b29a6b5..b3f5166e 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -83,12 +83,13 @@ impl<'a> ExprTerm<'a> { where C: Cmp { + let n2 = utils::to_f64(n2); vec1.iter().filter(|v1| match v1 { - Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)), + Value::Number(n1) => cmp_fn.cmp_f64(utils::to_f64(n1), n2), Value::Object(map1) => { if let Some(FilterKey::String(k)) = fk1 { if let Some(Value::Number(n1)) = map1.get(*k) { - return cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2)); + return cmp_fn.cmp_f64(utils::to_f64(n1), n2); } } cmp_fn.default() diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index 8c866bc9..a0dc73e4 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -72,18 +72,15 @@ impl<'a> ValueWalker { } pub fn all_with_strs(vec: &Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { - let mut acc = Vec::new(); let ref path_keys: Vec = keys.iter().map(|key| { utils::to_path_str(key) }).collect(); - for v in vec { + vec.iter().fold(Vec::new(), |mut acc, v| { if let Value::Object(map) = v { - for pk in path_keys { - if let Some(v) = map.get(pk.get_key()) { - acc.push(v) - } - } + path_keys.iter().for_each(|pk| if let Some(v) = map.get(pk.get_key()) { + acc.push(v) + }); } - } - acc + acc + }) } pub fn all(vec: &Vec<&'a Value>) -> Vec<&'a Value> { @@ -102,11 +99,10 @@ impl<'a> ValueWalker { where F: Fn(&'a Value, &mut Vec<&'a Value>), { - let mut acc = Vec::new(); - vec.iter().for_each(|v| { + vec.iter().fold(Vec::new(), |mut acc, v| { Self::_walk(v, &mut acc, fun); - }); - acc + acc + }) } fn _walk(v: &'a Value, acc: &mut Vec<&'a Value>, fun: &F) @@ -163,7 +159,7 @@ impl<'a> ValueWalker { match v { Value::Object(map) => { - if map.contains_key(key) { + if let Some(_) = map.get(key) { let ptr = v as *const Value; if !visited.contains(&ptr) { visited.insert(ptr); From aea57223e23054876d397a9503482c1881a2f3f8 Mon Sep 17 00:00:00 2001 From: freestrings Date: Sat, 7 Aug 2021 12:00:22 +0900 Subject: [PATCH 18/22] add massif script. Related #72 --- .gitignore | 3 ++- benchmark/README.md | 14 ++++++++++++-- benchmark/gen_valgrind.sh | 11 ++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 7884fa01..bd0bd2af 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ Cargo.lock callgrind.out.* perf.data -perf.data.* \ No newline at end of file +perf.data.* +massif.out.* \ No newline at end of file diff --git a/benchmark/README.md b/benchmark/README.md index b8c70f44..ac504792 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -31,12 +31,22 @@ sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict' 1. valgrind 설치 > sudo apt-get install valgrind +2. massif-visualizer +> sudo apt-get install massif-visualizer + +## 실행 + +> ./gen_valgrind.sh +> massif-visualizer 실행 #massif.out.xxx 읽기 + + +## call 그래프 보려면 + 2. kcachegrind 설치 > sudo apt-get install kcachegrind ## 실행 -> ./gen_valgrind.sh +> ./gen_valgrind.sh # --tool=callgrind --dump-instr=yes --collect-jumps=yes --simulate-cache=yes > kcachegrind #callgrind.out.xxx 읽기 -> > \ No newline at end of file diff --git a/benchmark/gen_valgrind.sh b/benchmark/gen_valgrind.sh index cfc8710d..a067a2e5 100755 --- a/benchmark/gen_valgrind.sh +++ b/benchmark/gen_valgrind.sh @@ -4,10 +4,11 @@ set -e cargo clean && cargo build --release && \ - valgrind \ - --tool=callgrind \ - --dump-instr=yes \ - --collect-jumps=yes \ - --simulate-cache=yes ./target/release/jsonpath_lib_benches + valgrind --tool=massif ./target/release/jsonpath_lib_benches +# valgrind \ +# --tool=callgrind \ +# --dump-instr=yes \ +# --collect-jumps=yes \ +# --simulate-cache=yes ./target/release/jsonpath_lib_benches # --simulate-cache=yes $1 -- $2 \ No newline at end of file From 33a9f9944fae2617a119b999a71f0f47fd46817c Mon Sep 17 00:00:00 2001 From: freestrings Date: Sun, 8 Aug 2021 14:56:08 +0900 Subject: [PATCH 19/22] attach old flame.svg --- benchmark/flame.old.svg | 3196 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 3196 insertions(+) create mode 100644 benchmark/flame.old.svg diff --git a/benchmark/flame.old.svg b/benchmark/flame.old.svg new file mode 100644 index 00000000..98322596 --- /dev/null +++ b/benchmark/flame.old.svg @@ -0,0 +1,3196 @@ + + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search +ic + + + +alloc::vec::Vec<T,A>::pop (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::peek_token (2 samples, 0.80%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.40%) + + + +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +strlen (7 samples, 2.81%) +st.. + + +jsonpath_lib::select::expr_term::ExprTerm::cmp (37 samples, 14.86%) +jsonpath_lib::select::.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.80%) + + + +<alloc::string::String as core::hash::Hash>::hash (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::fallible_with_capacity (3 samples, 1.20%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +core::core_arch::simd::i8x16::new (5 samples, 2.01%) +c.. + + +std::panicking::try (240 samples, 96.39%) +std::panicking::try + + +alloc::alloc::dealloc (2 samples, 0.80%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::new (36 samples, 14.46%) +jsonpath_lib::parser::.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (6 samples, 2.41%) +<c.. + + +alloc::string::String::push (2 samples, 0.80%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (2 samples, 0.80%) + + + +core::iter::traits::iterator::Iterator::try_fold (5 samples, 2.01%) +c.. + + +core::str::validations::next_code_point (1 samples, 0.40%) + + + +alloc::alloc::dealloc (2 samples, 0.80%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (36 samples, 14.46%) +<serde_json::value::Va.. + + +jsonpath_lib::parser::Parser::filter (25 samples, 10.04%) +jsonpath_lib::.. + + +hashbrown::raw::h2 (1 samples, 0.40%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.40%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +hashbrown::raw::RawTableInner<A>::new_in (1 samples, 0.40%) + + + +jsonpath_lib::select::expr_term::ExprTerm::cmp (6 samples, 2.41%) +js.. + + +jsonpath_lib::parser::Parser::paths_dot (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.80%) + + + +core::hash::Hasher::write_usize (2 samples, 0.80%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (5 samples, 2.01%) +c.. + + +indexmap::map::IndexMap<K,V,S>::get_index_of (31 samples, 12.45%) +indexmap::map::Ind.. + + +jsonpath_lib::select::expr_term::ExprTerm::cmp (10 samples, 4.02%) +json.. + + +int_free (1 samples, 0.40%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::reserve (2 samples, 0.80%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (3 samples, 1.20%) + + + +core::core_arch::simd::i8x16::new (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.80%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (4 samples, 1.61%) + + + +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 1.61%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (5 samples, 2.01%) +i.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (4 samples, 1.61%) + + + +core::mem::replace (1 samples, 0.40%) + + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.20%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +determine_info (1 samples, 0.40%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (2 samples, 0.80%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (4 samples, 1.61%) + + + +core::mem::take (1 samples, 0.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +alloc::alloc::Global::alloc_impl (1 samples, 0.40%) + + + +<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next_back (1 samples, 0.40%) + + + +jsonpath_lib::select::expr_term::ExprTerm::lt (12 samples, 4.82%) +jsonpa.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (6 samples, 2.41%) +<c.. + + +hashbrown::raw::inner::RawTable<T,A>::get (2 samples, 0.80%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +_memcmp_avx2_movbe (2 samples, 0.80%) + + + +jsonpath_lib::parser::Parser::close_token (1 samples, 0.40%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (13 samples, 5.22%) +<alloc.. + + +jsonpath_lib::parser::Parser::condition_expr (12 samples, 4.82%) +jsonpa.. + + +alloc::string::String::insert (1 samples, 0.40%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (5 samples, 2.01%) +<.. + + +hashbrown::raw::alloc::inner::do_alloc (2 samples, 0.80%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +core::iter::traits::iterator::Iterator::all (33 samples, 13.25%) +core::iter::traits::.. + + +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +indexmap::map::core::equivalent::{{closure}} (7 samples, 2.81%) +in.. + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (5 samples, 2.01%) +<.. + + +core::option::Option<T>::map_or (1 samples, 0.40%) + + + +hashbrown::map::HashMap<K,V,S,A>::insert (6 samples, 2.41%) +ha.. + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +_fopen_internal (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +core::str::<impl str>::parse (1 samples, 0.40%) + + + +core::str::validations::next_code_point (1 samples, 0.40%) + + + +core::num::dec2flt::<impl core::str::traits::FromStr for f64>::from_str (1 samples, 0.40%) + + + +jsonpath_lib::select::Selector::visit_array_eof (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::Tokenizer::other (6 samples, 2.41%) +js.. + + +jsonpath_lib::parser::Parser::term (4 samples, 1.61%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (13 samples, 5.22%) +<alloc.. + + +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.40%) + + + +_rdl_alloc (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.80%) + + + +std::sys::unix::thread::guard::get_stack_start (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (2 samples, 0.80%) + + + +core::hash::sip::u8to64_le (1 samples, 0.40%) + + + +hashbrown::raw::RawTable<T,A>::free_buckets (2 samples, 0.80%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (21 samples, 8.43%) +hashbrown::r.. + + +hashbrown::raw::sse2::Group::match_byte (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (21 samples, 8.43%) +indexmap::ma.. + + +_memcmp_avx2_movbe (2 samples, 0.80%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (6 samples, 2.41%) +in.. + + +core::iter::traits::iterator::Iterator::try_fold (33 samples, 13.25%) +core::iter::traits::.. + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.40%) + + + +load_elf_binary (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::iter_hash (9 samples, 3.61%) +hash.. + + +core::ptr::write (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (1 samples, 0.40%) + + + +init_cpu_features (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::reserve (2 samples, 0.80%) + + + +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.80%) + + + +jsonpath_lib::select::expr_term::ExprTerm::gt (15 samples, 6.02%) +jsonpath.. + + +alloc::vec::Vec<T,A>::insert (18 samples, 7.23%) +alloc::vec.. + + +jsonpath_lib::select::Selector::visit_key (65 samples, 26.10%) +jsonpath_lib::select::Selector::visit_key + + +<jsonpath_lib::select::cmp::CmpEq as jsonpath_lib::select::cmp::Cmp>::cmp_json (5 samples, 2.01%) +<.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 0.80%) + + + +hashbrown::map::make_insert_hash (5 samples, 2.01%) +h.. + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (6 samples, 2.41%) +<c.. + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (2 samples, 0.80%) + + + +alloc::alloc::Global::grow_impl (4 samples, 1.61%) + + + +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (239 samples, 95.98%) +core::iter::traits::iterator::Iterator::for_each::call::{{closure}} + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +alloc::vec::Vec<T,A>::as_mut_ptr (1 samples, 0.40%) + + + +dl_start_final (1 samples, 0.40%) + + + +_GI__dl_addr (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.40%) + + + +core::hash::Hasher::write_u8 (1 samples, 0.40%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.40%) + + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (4 samples, 1.61%) + + + +main (240 samples, 96.39%) +main + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::parser::Node>> (15 samples, 6.02%) +core::pt.. + + +core::ptr::drop_in_place<hashbrown::raw::RawTable< (2 samples, 0.80%) + + + +core::ptr::drop_in_place<core::result::Result<jsonpath_lib::parser::tokenizer::Token,jsonpath_lib::parser::tokenizer::TokenError>> (1 samples, 0.40%) + + + +core::ptr::write (1 samples, 0.40%) + + + +jsonpath_lib::parser::path_reader::PathReader::next_char (3 samples, 1.20%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (4 samples, 1.61%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.80%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.20%) + + + +<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.40%) + + + +<hashbrown::set::HashSet<T,S,A> as core::default::Default>::default (1 samples, 0.40%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (4 samples, 1.61%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (10 samples, 4.02%) +<all.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.40%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (6 samples, 2.41%) +<c.. + + +jsonpath_lib::parser::Parser::eat_whitespace (1 samples, 0.40%) + + + +int_malloc (4 samples, 1.61%) + + + +core::ptr::drop_in_place<core::option::Option<jsonpath_lib::parser::Node>> (15 samples, 6.02%) +core::pt.. + + +hashbrown::raw::RawTable<T,A>::insert (15 samples, 6.02%) +hashbrow.. + + +_GI___libc_malloc (1 samples, 0.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (15 samples, 6.02%) +core::pt.. + + +hashbrown::map::make_insert_hash (7 samples, 2.81%) +ha.. + + +<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (1 samples, 0.40%) + + + +core::ptr::drop_in_place<hashbrown::scopeguard::ScopeGuard<hashbrown::raw::RawTableInner<alloc::alloc::Global>,hashbrown::raw::RawTableInner<alloc::alloc::Global>::prepare_resize::{{closure}}>> (1 samples, 0.40%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}}::{{closure}} (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (2 samples, 0.80%) + + + +core::ptr::mut_ptr::<impl *mut T>::offset (1 samples, 0.40%) + + + +begin_new_exec (7 samples, 2.81%) +be.. + + +core::ptr::drop_in_place<jsonpath_lib::select::Selector> (16 samples, 6.43%) +core::pt.. + + +core::ptr::drop_in_place<jsonpath_lib::parser::tokenizer::Token> (1 samples, 0.40%) + + + +tcache_put (1 samples, 0.40%) + + + +jsonpath_lib::select::expr_term::ExprTerm::cmp::{{closure}} (3 samples, 1.20%) + + + +setup_arg_pages (1 samples, 0.40%) + + + +core::result::Result<T,E>::map_err (1 samples, 0.40%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (5 samples, 2.01%) +<.. + + +jsonpath_lib::parser::Parser::op (6 samples, 2.41%) +js.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +jsonpath_lib::select::FilterTerms::push_json_term (62 samples, 24.90%) +jsonpath_lib::select::FilterTerms::push.. + + +std::panic::catch_unwind (239 samples, 95.98%) +std::panic::catch_unwind + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::prepare_insert_slot (2 samples, 0.80%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::tokenizer::TokenReader> (2 samples, 0.80%) + + + +alloc::raw_vec::finish_grow (4 samples, 1.61%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.40%) + + + +hashbrown::map::HashMap<K,V,S,A>::get_inner (7 samples, 2.81%) +ha.. + + +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.40%) + + + +jsonpath_lib::select::FilterTerms::pop_term (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.40%) + + + +int_realloc (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::parser::Node>> (14 samples, 5.62%) +core::p.. + + +jsonpath_lib::parser::Parser::close_token (1 samples, 0.40%) + + + +_x64_sys_execve (7 samples, 2.81%) +_x.. + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.40%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 0.80%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +core::option::Option<T>::unwrap (1 samples, 0.40%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::eat_whitespace (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (6 samples, 2.41%) +in.. + + +jsonpath_lib::parser::Parser::paths_dot (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::Tokenizer::and (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (11 samples, 4.42%) +core:.. + + +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.80%) + + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.20%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (2 samples, 0.80%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<u8>> (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +_memset_avx2_unaligned_erms (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 1.20%) + + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.20%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::parser::Node>> (6 samples, 2.41%) +co.. + + +hashbrown::raw::inner::sse2::Group::match_byte (5 samples, 2.01%) +h.. + + +jsonpath_lib::parser::Parser::key (1 samples, 0.40%) + + + +hashbrown::map::make_hash (4 samples, 1.61%) + + + +_memmove_avx_unaligned_erms (1 samples, 0.40%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.40%) + + + +std::rt::lang_start::{{closure}} (239 samples, 95.98%) +std::rt::lang_start::{{closure}} + + +hashbrown::set::HashSet<T,S,A>::insert (6 samples, 2.41%) +ha.. + + +jsonpath_lib::select::expr_term::ExprTerm::and (6 samples, 2.41%) +js.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +jsonpath_lib::parser::Parser::eat_token (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (1 samples, 0.40%) + + + +core::ptr::mut_ptr::<impl *mut T>::sub (1 samples, 0.40%) + + + +jsonpath_lib::select::expr_term::ExprTerm::cmp::{{closure}} (4 samples, 1.61%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (3 samples, 1.20%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.80%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +jsonpath_lib_benches::main::{{closure}} (239 samples, 95.98%) +jsonpath_lib_benches::main::{{closure}} + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::reserve (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +jsonpath_lib::select::Selector::select (149 samples, 59.84%) +jsonpath_lib::select::Selector::select + + +jsonpath_lib::select::Selector::visit_filter (72 samples, 28.92%) +jsonpath_lib::select::Selector::visit_filter + + +alloc::alloc::realloc (4 samples, 1.61%) + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (6 samples, 2.41%) +<a.. + + +alloc::slice::<impl [T]>::to_vec (1 samples, 0.40%) + + + +jsonpath_lib::select::Selector::visit_relative (1 samples, 0.40%) + + + +perf_iterate_sb (1 samples, 0.40%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.20%) + + + +alloc::vec::Vec<T,A>::push (2 samples, 0.80%) + + + +core::ops::function::FnOnce::call_once (239 samples, 95.98%) +core::ops::function::FnOnce::call_once + + +jsonpath_lib::select::Selector::select (150 samples, 60.24%) +jsonpath_lib::select::Selector::select + + +int_realloc (1 samples, 0.40%) + + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (2 samples, 0.80%) + + + +hashbrown::raw::RawTable<T,A>::reserve (12 samples, 4.82%) +hashbr.. + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 0.80%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (3 samples, 1.20%) + + + +core::ptr::write (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +_rdl_alloc (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (6 samples, 2.41%) +<s.. + + +core::option::Option<T>::take (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +core::ptr::read (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.20%) + + + +malloc_hook_ini (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::collect (13 samples, 5.22%) +core::.. + + +alloc::vec::Vec<T,A>::push (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.20%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (4 samples, 1.61%) + + + +hashbrown::raw::inner::RawIterHash<T,A>::new (9 samples, 3.61%) +hash.. + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +<hashbrown::map::HashMap<K,V,S,A> as core::default::Default>::default (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::peek_token (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::fold (239 samples, 95.98%) +core::iter::traits::iterator::Iterator::fold + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (3 samples, 1.20%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq::{{closure}} (32 samples, 12.85%) +<indexmap::map::Ind.. + + +jsonpath_lib::select::expr_term::ExprTerm::cmp::{{closure}} (3 samples, 1.20%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::collect (10 samples, 4.02%) +core.. + + +tcache_put (1 samples, 0.40%) + + + +alloc::slice::hack::to_vec (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (6 samples, 2.41%) +<c.. + + +core::ptr::swap_nonoverlapping_bytes (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::string::String> (1 samples, 0.40%) + + + +core::core_arch::x86::sse2::mm_set1_epi8 (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawIterHashInner<A>::new (9 samples, 3.61%) +hash.. + + +jsonpath_lib_benches::main (239 samples, 95.98%) +jsonpath_lib_benches::main + + +<std::collections::hash::set::HashSet<T,S> as core::default::Default>::default (1 samples, 0.40%) + + + +indexmap::map::core::equivalent::{{closure}} (4 samples, 1.61%) + + + +<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.61%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::ParseToken> (1 samples, 0.40%) + + + +indexmap::map::core::equivalent::{{closure}} (2 samples, 0.80%) + + + +jsonpath_lib_be (242 samples, 97.19%) +jsonpath_lib_be + + +alloc::vec::Vec<T,A>::reserve (4 samples, 1.61%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (5 samples, 2.01%) +c.. + + +hashbrown::raw::inner::sse2::Group::match_byte (1 samples, 0.40%) + + + +hashbrown::map::HashMap<K,V,S,A>::insert (27 samples, 10.84%) +hashbrown::map::.. + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (2 samples, 0.80%) + + + +hashbrown::map::HashMap<K,V,S,A>::with_hasher_in (1 samples, 0.40%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::all (5 samples, 2.01%) +c.. + + +jsonpath_lib::select (239 samples, 95.98%) +jsonpath_lib::select + + +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 0.80%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (5 samples, 2.01%) +<.. + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (3 samples, 1.20%) + + + +_libc_start_main (240 samples, 96.39%) +_libc_start_main + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.40%) + + + +hashbrown::raw::RawTable<T,A>::reserve_rehash (1 samples, 0.40%) + + + +<indexmap::map::core::IndexMapCore<K,V> as indexmap::Entries>::as_entries (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<jsonpath_lib::parser::ParseToken>> (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (5 samples, 2.01%) +h.. + + +jsonpath_lib::select::value_walker::ValueWalker::walk_dedup (51 samples, 20.48%) +jsonpath_lib::select::value_walk.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.40%) + + + +int_realloc (4 samples, 1.61%) + + + +<jsonpath_lib::select::cmp::CmpAnd as jsonpath_lib::select::cmp::Cmp>::cmp_json (5 samples, 2.01%) +<.. + + +core::ptr::drop_in_place<hashbrown::set::HashSet<*const serde_json::value::Value,std::collections::hash::map::RandomState>> (2 samples, 0.80%) + + + +jsonpath_lib::select::FilterTerms::filter_next_with_str (62 samples, 24.90%) +jsonpath_lib::select::FilterTerms::filt.. + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (6 samples, 2.41%) +co.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (2 samples, 0.80%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 0.80%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::contains_key (14 samples, 5.62%) +serde_j.. + + +core::ptr::drop_in_place<std::collections::hash::set::HashSet<*const serde_json::value::Value>> (2 samples, 0.80%) + + + +alloc::vec::Vec<T,A>::reserve (3 samples, 1.20%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +<&mut I as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::term (1 samples, 0.40%) + + + +<serde_json::value::Value as core::cmp::PartialEq>::eq (5 samples, 2.01%) +<.. + + +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +hashbrown::raw::RawTableInner<A>::new_uninitialized (2 samples, 0.80%) + + + +hashbrown::raw::RawTable<T,A>::resize (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::ParseToken> (1 samples, 0.40%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.80%) + + + +core::num::<impl u64>::wrapping_add (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::term_num (1 samples, 0.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.40%) + + + +jsonpath_lib::select::expr_term::ExprTerm::cmp::{{closure}} (6 samples, 2.41%) +js.. + + +indexmap::map::IndexMap<K,V,S>::hash (10 samples, 4.02%) +inde.. + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (1 samples, 0.40%) + + + +_GI___libc_realloc (1 samples, 0.40%) + + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.40%) + + + +hashbrown::raw::inner::Bucket<T>::from_base_index (1 samples, 0.40%) + + + +jsonpath_lib::select::FilterTerms::filter (62 samples, 24.90%) +jsonpath_lib::select::FilterTerms::filter + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (4 samples, 1.61%) + + + +std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.40%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.40%) + + + +core::iter::range::<impl core::iter::traits::double_ended::DoubleEndedIterator for core::ops::range::Range<A>>::next_back (1 samples, 0.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.40%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.20%) + + + +hashbrown::map::make_hash (6 samples, 2.41%) +ha.. + + +indexmap::map::IndexMap<K,V,S>::hash (8 samples, 3.21%) +ind.. + + +jsonpath_lib::parser::Parser::json_path (35 samples, 14.06%) +jsonpath_lib::parser:.. + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::parser::Node>> (4 samples, 1.61%) + + + +jsonpath_lib::select::expr_term::ExprTerm::cmp (13 samples, 5.22%) +jsonpa.. + + +mprotect_fixup (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawIterHash<T,A>::new (1 samples, 0.40%) + + + +<indexmap::map::IndexMap<K,V,S> as indexmap::Entries>::as_entries (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (5 samples, 2.01%) +h.. + + +core::ptr::write (4 samples, 1.61%) + + + +core::ptr::drop_in_place<core::result::Result<jsonpath_lib::parser::tokenizer::Token,jsonpath_lib::parser::tokenizer::TokenError>> (1 samples, 0.40%) + + + +hashbrown::raw::RawTable<T,A>::reserve (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec< (2 samples, 0.80%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (4 samples, 1.61%) + + + +core::ptr::read (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::Tokenizer::whitespace (7 samples, 2.81%) +js.. + + +jsonpath_lib::parser::Parser::eat_whitespace (2 samples, 0.80%) + + + +hashbrown::raw::RawTable<T,A>::find (4 samples, 1.61%) + + + +int_free (1 samples, 0.40%) + + + +dl_start (1 samples, 0.40%) + + + +<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.80%) + + + +jsonpath_lib::parser::Parser::paths (3 samples, 1.20%) + + + +alloc::alloc::alloc (1 samples, 0.40%) + + + +std::panicking::try::do_call (240 samples, 96.39%) +std::panicking::try::do_call + + +hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.40%) + + + +alloc::alloc::dealloc (1 samples, 0.40%) + + + +_GI___libc_free (1 samples, 0.40%) + + + +<hashbrown::scopeguard::ScopeGuard<T,F> as core::ops::drop::Drop>::drop (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +core::ptr::swap_nonoverlapping_one (1 samples, 0.40%) + + + +<core::str::iter::Chars as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +core::num::dec2flt::dec2flt (1 samples, 0.40%) + + + +<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4 samples, 1.61%) + + + +hashbrown::raw::RawTable<T,A>::get_mut (4 samples, 1.61%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.40%) + + + +std::rt::lang_start_internal (240 samples, 96.39%) +std::rt::lang_start_internal + + +<alloc::string::String as core::cmp::PartialEq>::eq (2 samples, 0.80%) + + + +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (239 samples, 95.98%) +core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once + + +indexmap::map::IndexMap<K,V,S>::get_index_of (3 samples, 1.20%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.40%) + + + +hashbrown::raw::inner::bitmask::BitMask::lowest_set_bit (1 samples, 0.40%) + + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.20%) + + + +std::panicking::try (239 samples, 95.98%) +std::panicking::try + + +alloc::alloc::Global::grow_impl (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::path_in_key (1 samples, 0.40%) + + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (13 samples, 5.22%) +<alloc.. + + +core::ptr::drop_in_place<jsonpath_lib::parser::tokenizer::Token> (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::ParseToken> (2 samples, 0.80%) + + + +std::collections::hash::set::HashSet<T,S>::insert (27 samples, 10.84%) +std::collections.. + + +hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.40%) + + + +jsonpath_lib::select::Selector::str_path (73 samples, 29.32%) +jsonpath_lib::select::Selector::str_path + + +hashbrown::raw::RawTable<T,A>::reserve_rehash (12 samples, 4.82%) +hashbr.. + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::term_num (3 samples, 1.20%) + + + +indexmap::map::IndexMap<K,V,S>::get (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::paths (33 samples, 13.25%) +jsonpath_lib::parser.. + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (3 samples, 1.20%) + + + +_GI___libc_realloc (4 samples, 1.61%) + + + +core::core_arch::x86::sse2::mm_set1_epi8 (5 samples, 2.01%) +c.. + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2 samples, 0.80%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +hashbrown::raw::RawTable<T,A>::get (1 samples, 0.40%) + + + +core::ptr::mut_ptr::<impl *mut T>::write_bytes (1 samples, 0.40%) + + + +alloc::alloc::realloc (1 samples, 0.40%) + + + +jsonpath_lib::parser::path_reader::PathReader::peek_char (1 samples, 0.40%) + + + +alloc::alloc::dealloc (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::eat_token (2 samples, 0.80%) + + + +alloc::vec::Vec<T,A>::push (1 samples, 0.40%) + + + +do_syscall_64 (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::peek_token (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::push (5 samples, 2.01%) +a.. + + +core::intrinsics::copy (13 samples, 5.22%) +core::.. + + +hashbrown::raw::is_full (1 samples, 0.40%) + + + +std::rt::lang_start_internal::{{closure}} (240 samples, 96.39%) +std::rt::lang_start_internal::{{closure}} + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.20%) + + + +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::eat_token (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (31 samples, 12.45%) +indexmap::map::Ind.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.20%) + + + +jsonpath_lib::parser::Parser::exprs (24 samples, 9.64%) +jsonpath_lib::.. + + +<alloc::string::String as core::hash::Hash>::hash (1 samples, 0.40%) + + + +std::collections::hash::set::HashSet<T>::new (1 samples, 0.40%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::expr (11 samples, 4.42%) +jsonp.. + + +_GI___libc_malloc (2 samples, 0.80%) + + + +hashbrown::raw::RawTable<T,A>::new_in (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::ParseToken> (1 samples, 0.40%) + + + +<Q as indexmap::equivalent::Equivalent<K>>::equivalent (2 samples, 0.80%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (7 samples, 2.81%) +co.. + + +jsonpath_lib::select::expr_term::ExprTerm::or (38 samples, 15.26%) +jsonpath_lib::select::e.. + + +indexmap::map::IndexMap<K,V,S>::get_index_of (14 samples, 5.62%) +indexma.. + + +indexmap::map::IndexMap<K,V,S>::hash (1 samples, 0.40%) + + + +int_free (1 samples, 0.40%) + + + +<alloc::string::String as core::cmp::PartialEq>::eq (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (19 samples, 7.63%) +hashbrown:.. + + +hashbrown::raw::RawTable<T,A>::find (1 samples, 0.40%) + + + +alloc::alloc::box_free (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (2 samples, 0.80%) + + + +alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.40%) + + + +jsonpath_lib::parser::NodeVisitor::visit (146 samples, 58.63%) +jsonpath_lib::parser::NodeVisitor::visit + + +hashbrown::map::make_hasher::{{closure}} (4 samples, 1.61%) + + + +jsonpath_lib::parser::path_reader::PathReader::peek_char (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (2 samples, 0.80%) + + + +std::panicking::try::do_call (239 samples, 95.98%) +std::panicking::try::do_call + + +int_free (1 samples, 0.40%) + + + +core::core_arch::simd::i8x16::new (1 samples, 0.40%) + + + +entry_SYSCALL_64_after_hwframe (7 samples, 2.81%) +en.. + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (4 samples, 1.61%) + + + +jsonpath_lib::parser::Parser::eat_whitespace (4 samples, 1.61%) + + + +core::ptr::drop_in_place<alloc::vec::Vec< (2 samples, 0.80%) + + + +alloc::vec::Vec<T,A>::extend_desugared (5 samples, 2.01%) +a.. + + +<core::iter::adapters::rev::Rev<I> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +int_free (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (1 samples, 0.40%) + + + +core::intrinsics::copy_nonoverlapping (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::free_buckets (2 samples, 0.80%) + + + +std::collections::hash::set::HashSet<T,S>::insert (6 samples, 2.41%) +st.. + + +indexmap::map::IndexMap<K,V,S>::get_index_of (4 samples, 1.61%) + + + +hashbrown::raw::RawTable<T,A>::resize (12 samples, 4.82%) +hashbr.. + + +alloc::alloc::realloc (1 samples, 0.40%) + + + +alloc::alloc::box_free (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.40%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.80%) + + + +core::hash::sip::u8to64_le (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::for_each (239 samples, 95.98%) +core::iter::traits::iterator::Iterator::for_each + + +<f64 as core::num::dec2flt::float::RawFloat>::from_u64 (1 samples, 0.40%) + + + +hashbrown::raw::sse2::Group::static_empty (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (4 samples, 1.61%) + + + +<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +<hashbrown::raw::inner::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +alloc::string::String::insert_bytes (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawIterHashInner<A>::new (1 samples, 0.40%) + + + +pthread_getattr_np (1 samples, 0.40%) + + + +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.40%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (2 samples, 0.80%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (5 samples, 2.01%) +c.. + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.20%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::deallocate (1 samples, 0.40%) + + + +<hashbrown::raw::inner::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +load_elf_binary (7 samples, 2.81%) +lo.. + + +alloc::alloc::Global::grow_impl (1 samples, 0.40%) + + + +<jsonpath_lib::select::cmp::CmpOr as jsonpath_lib::select::cmp::Cmp>::cmp_json (37 samples, 14.86%) +<jsonpath_lib::select:.. + + +_set_task_comm (7 samples, 2.81%) +_s.. + + +jsonpath_lib::parser::Parser::term (3 samples, 1.20%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.80%) + + + +std::sys_common::rt::init (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (1 samples, 0.40%) + + + +core::intrinsics::write_bytes (1 samples, 0.40%) + + + +jsonpath_lib::parser::utils::string_to_num (1 samples, 0.40%) + + + +perf_event_mmap (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (2 samples, 0.80%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.40%) + + + +hashbrown::raw::RawTable<T,A>::iter_hash (1 samples, 0.40%) + + + +core::hash::Hasher::write_usize (2 samples, 0.80%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (36 samples, 14.46%) +core::cmp::impls::<imp.. + + +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::term (4 samples, 1.61%) + + + +hashbrown::raw::RawTableInner<A>::prepare_resize (3 samples, 1.20%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (5 samples, 2.01%) +c.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (2 samples, 0.80%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.80%) + + + +core::ptr::drop_in_place<alloc::boxed::Box<jsonpath_lib::parser::Node>> (9 samples, 3.61%) +core.. + + +get_common_indices (1 samples, 0.40%) + + + +core::ptr::swap_nonoverlapping (1 samples, 0.40%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.40%) + + + +hashbrown::set::HashSet<T,S,A>::insert (27 samples, 10.84%) +hashbrown::set::.. + + +jsonpath_lib::parser::path_reader::PathReader::take_while (4 samples, 1.61%) + + + +hashbrown::raw::inner::RawTable<T,A>::get (1 samples, 0.40%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (3 samples, 1.20%) + + + +<hashbrown::raw::RawIterHash<T,A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +malloc_consolidate (2 samples, 0.80%) + + + +_do_execve_fil.sr. (1 samples, 0.40%) + + + +hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.40%) + + + +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (33 samples, 13.25%) +<serde_json::map::Ma.. + + +do_syscall_64 (7 samples, 2.81%) +do.. + + +jsonpath_lib::parser::path_reader::PathReader::take_while (7 samples, 2.81%) +js.. + + +alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::set_ptr (1 samples, 0.40%) + + + +core::str::validations::next_code_point (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (14 samples, 5.62%) +core::p.. + + +int_free (2 samples, 0.80%) + + + +dl_platform_init (1 samples, 0.40%) + + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (1 samples, 0.40%) + + + +dl_sysdep_start (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.40%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (2 samples, 0.80%) + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (10 samples, 4.02%) +<all.. + + +alloc::raw_vec::finish_grow (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (2 samples, 0.80%) + + + +jsonpath_lib::parser::Parser::expr (10 samples, 4.02%) +json.. + + +hashbrown::raw::inner::RawTable<T,A>::iter_hash (1 samples, 0.40%) + + + +alloc::alloc::Global::alloc_impl (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::push (3 samples, 1.20%) + + + +jsonpath_lib::parser::Parser::paths (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (5 samples, 2.01%) +i.. + + +jsonpath_lib::select::FilterTerms::filter_next_with_str::{{closure}} (60 samples, 24.10%) +jsonpath_lib::select::FilterTerms::fil.. + + +core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 1.20%) + + + +<hashbrown::raw::RawIterHashInner<A> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.80%) + + + +hashbrown::raw::RawTable<T,A>::insert (1 samples, 0.40%) + + + +indexmap::map::core::equivalent::{{closure}} (1 samples, 0.40%) + + + +exec_binprm (1 samples, 0.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (2 samples, 0.80%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (1 samples, 0.40%) + + + +alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.40%) + + + +int_malloc (1 samples, 0.40%) + + + +<hashbrown::raw::inner::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +alloc::alloc::dealloc (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::vec::Vec<u8>> (1 samples, 0.40%) + + + +core::num::<impl u64>::rotate_left (2 samples, 0.80%) + + + +std::sys::unix::thread::guard::init (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::find_insert_slot (2 samples, 0.80%) + + + +jsonpath_lib::parser::Parser::compile (73 samples, 29.32%) +jsonpath_lib::parser::Parser::compile + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (5 samples, 2.01%) +<.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +perf (7 samples, 2.81%) +perf + + +core::ptr::drop_in_place<jsonpath_lib::parser::tokenizer::Token> (1 samples, 0.40%) + + + +alloc::slice::<impl alloc::borrow::ToOwned for [T]>::to_owned (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 0.80%) + + + +core::mem::swap (1 samples, 0.40%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.20%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.40%) + + + +std::sys_common::backtrace::_rust_begin_short_backtrace (239 samples, 95.98%) +std::sys_common::backtrace::_rust_begin_short_backtrace + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (8 samples, 3.21%) +cor.. + + +<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 1.20%) + + + +_x64_sys_execve (1 samples, 0.40%) + + + +alloc::raw_vec::finish_grow (2 samples, 0.80%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.80%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (2 samples, 0.80%) + + + +core::ptr::drop_in_place<core::result::Result<jsonpath_lib::parser::tokenizer::Token,jsonpath_lib::parser::tokenizer::TokenError>> (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::condition_expr (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::prepare_resize::{{closure}} (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTable<T,A>::find (1 samples, 0.40%) + + + +hashbrown::raw::RawTableInner<A>::free_buckets (1 samples, 0.40%) + + + +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.40%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (1 samples, 0.40%) + + + +alloc::slice::<impl [T]>::to_vec (1 samples, 0.40%) + + + +exec_binprm (7 samples, 2.81%) +ex.. + + +int_free (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +core::str::validations::next_code_point (1 samples, 0.40%) + + + +tcache_get (1 samples, 0.40%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::all::check::{{closure}} (5 samples, 2.01%) +c.. + + +_do_execve_fil.sr. (7 samples, 2.81%) +_d.. + + +hashbrown::raw::RawIterHash<T,A>::new (1 samples, 0.40%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (6 samples, 2.41%) +se.. + + +IO_new_fopen (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.80%) + + + +core::ptr::drop_in_place<alloc::string::String> (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.40%) + + + +jsonpath_lib::select::FilterTerms::collect_next_with_str (2 samples, 0.80%) + + + +core::ptr::drop_in_place<hashbrown::map::HashMap<*const serde_json::value::Value, (2 samples, 0.80%) + + + +std::panic::catch_unwind (240 samples, 96.39%) +std::panic::catch_unwind + + +jsonpath_lib::parser::Parser::array_start (28 samples, 11.24%) +jsonpath_lib::pa.. + + +tcache_put (1 samples, 0.40%) + + + +hashbrown::raw::inner::RawTableInner<A>::bucket (1 samples, 0.40%) + + + +core::hash::impls::<impl core::hash::Hash for *const T>::hash (2 samples, 0.80%) + + + +indexmap::map::core::IndexMapCore<K,V>::get_index_of (1 samples, 0.40%) + + + +<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (3 samples, 1.20%) + + + +int_free (1 samples, 0.40%) + + + +core::hash::impls::<impl core::hash::Hash for str>::hash (2 samples, 0.80%) + + + +alloc::vec::Vec<T,A>::extend_desugared (10 samples, 4.02%) +allo.. + + +core::core_arch::x86::sse2::mm_set_epi8 (1 samples, 0.40%) + + + +all (249 samples, 100%) + + + +alloc::alloc::alloc (2 samples, 0.80%) + + + +alloc::raw_vec::RawVec<T,A>::reserve (3 samples, 1.20%) + + + +core::slice::cmp::<impl core::cmp::PartialEq<[B]> for [A]>::eq (1 samples, 0.40%) + + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.40%) + + + +<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.40%) + + + +core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (1 samples, 0.40%) + + + +<jsonpath_lib::select::Selector as jsonpath_lib::parser::NodeVisitor>::visit_token (3 samples, 1.20%) + + + +indexmap::map::IndexMap<K,V,S>::hash (2 samples, 0.80%) + + + +<indexmap::map::IndexMap<K,V1,S1> as core::cmp::PartialEq<indexmap::map::IndexMap<K,V2,S2>>>::eq (33 samples, 13.25%) +<indexmap::map::Inde.. + + +<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (10 samples, 4.02%) +<all.. + + +start (241 samples, 96.79%) +start + + +alloc::alloc::Global::alloc_impl (2 samples, 0.80%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.40%) + + + +alloc::str::<impl alloc::borrow::ToOwned for str>::to_owned (1 samples, 0.40%) + + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +indexmap::map::IndexMap<K,V,S>::get (3 samples, 1.20%) + + + +hashbrown::map::HashMap<K,V,S,A>::contains_key (7 samples, 2.81%) +ha.. + + +alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.40%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +indexmap::map::core::equivalent::{{closure}} (2 samples, 0.80%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (11 samples, 4.42%) +core:.. + + +jsonpath_lib::parser::Parser::array (29 samples, 11.65%) +jsonpath_lib::par.. + + +alloc::alloc::alloc (1 samples, 0.40%) + + + +alloc::vec::Vec<T,A>::reserve (1 samples, 0.40%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (1 samples, 0.40%) + + + +<serde_json::map::Map<alloc::string::String,serde_json::value::Value> as core::cmp::PartialEq>::eq (5 samples, 2.01%) +<.. + + +jsonpath_lib::parser::tokenizer::TokenReader::next_token (1 samples, 0.40%) + + + +core::num::dec2flt::number::Number::try_fast_path (1 samples, 0.40%) + + + +core::ptr::drop_in_place<[alloc::string::String: 1]> (1 samples, 0.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (4 samples, 1.61%) + + + +<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (5 samples, 2.01%) +<.. + + +jsonpath_lib::parser::Parser::eat_token (3 samples, 1.20%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (4 samples, 1.61%) + + + +core::core_arch::x86::sse2::mm_set_epi8 (5 samples, 2.01%) +c.. + + +core::hash::impls::<impl core::hash::Hash for str>::hash (1 samples, 0.40%) + + + +std::collections::hash::set::HashSet<T,S>::contains (7 samples, 2.81%) +st.. + + +jsonpath_lib::parser::Parser::op (7 samples, 2.81%) +js.. + + +jsonpath_lib::parser::Parser::path (1 samples, 0.40%) + + + +<alloc::string::String as core::hash::Hash>::hash (4 samples, 1.61%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (2 samples, 0.80%) + + + +<&mut I as core::iter::traits::iterator::Iterator>::next (1 samples, 0.40%) + + + +alloc::raw_vec::finish_grow (1 samples, 0.40%) + + + +jsonpath_lib::parser::tokenizer::Tokenizer::next_token (17 samples, 6.83%) +jsonpath_.. + + +_GI___libc_realloc (1 samples, 0.40%) + + + +hashbrown::raw::bitmask::BitMask::lowest_set_bit (1 samples, 0.40%) + + + +hashbrown::set::HashSet<T,S,A>::contains (7 samples, 2.81%) +ha.. + + +indexmap::map::IndexMap<K,V,S>::contains_key (14 samples, 5.62%) +indexma.. + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +core::ptr::drop_in_place<jsonpath_lib::parser::Node> (15 samples, 6.02%) +core::pt.. + + +alloc::raw_vec::RawVec<T,A>::current_memory (1 samples, 0.40%) + + + +core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<jsonpath_lib::parser::Node>>> (14 samples, 5.62%) +core::p.. + + +ptmalloc_init (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::path (1 samples, 0.40%) + + + +jsonpath_lib::parser::Parser::exprs (12 samples, 4.82%) +jsonpa.. + + +alloc::raw_vec::RawVec<T,A>::grow_amortized (4 samples, 1.61%) + + + +<alloc::alloc::Global as core::alloc::Allocator>::grow (4 samples, 1.61%) + + + +alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.40%) + + + +alloc::alloc::dealloc (1 samples, 0.40%) + + + +_memmove_avx_unaligned_erms (13 samples, 5.22%) +_memmo.. + + +hashbrown::raw::RawIterHashInner<A>::new (1 samples, 0.40%) + + + +<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (1 samples, 0.40%) + + + +<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (2 samples, 0.80%) + + + +serde_json::map::Map<alloc::string::String,serde_json::value::Value>::get (3 samples, 1.20%) + + + +<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (1 samples, 0.40%) + + + +core::str::traits::<impl core::cmp::PartialEq for str>::eq (1 samples, 0.40%) + + + +<jsonpath_lib::select::Selector as jsonpath_lib::parser::NodeVisitor>::visit_token (145 samples, 58.23%) +<jsonpath_lib::select::Selector as jsonpath_lib::parser::NodeVisitor>::visit_token + + +core::ptr::drop_in_place<alloc::raw_vec::RawVec<jsonpath_lib::parser::ParseToken>> (1 samples, 0.40%) + + + +std::sys::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (1 samples, 0.40%) + + + +core::iter::traits::iterator::Iterator::all::check::{{closure}} (32 samples, 12.85%) +core::iter::traits:.. + + +hashbrown::raw::inner::RawTableInner<A>::probe_seq (2 samples, 0.80%) + + + +alloc::slice::hack::to_vec (1 samples, 0.40%) + + + +int_free (2 samples, 0.80%) + + + +<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (10 samples, 4.02%) +<all.. + + + From a1b323a40b56f140826a966275c64196fa3595d5 Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 9 Aug 2021 23:35:21 +0900 Subject: [PATCH 20/22] fix #50. unconsumed filter token --- src/selector/terms.rs | 39 +++++++++++++++++++++++++++--------- src/selector/value_walker.rs | 9 --------- tests/array_filter.rs | 11 ++++++++++ 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/selector/terms.rs b/src/selector/terms.rs index b3f5166e..0821c462 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -450,6 +450,27 @@ impl<'a> FilterTerms<'a> { return current; } + if let Some(Some(e)) = self.pop_term() { + match e { + ExprTerm::Json(rel, _, vec) => { + return if vec.is_empty() { + Some(Vec::new()) + } else if let Some(vec) = rel { + let index = utils::abs_index(index as isize, vec.len()); + let ret = vec.get(index).map_or(Vec::new(), |v| vec![*v]); + Some(ret) + } else { + let index = utils::abs_index(index as isize, vec.len()); + let ret = vec.get(index).map_or(Vec::new(), |v| vec![*v]); + Some(ret) + }; + } + _ => { + self.push_term(Some(e)); + } + } + } + let acc = ValueWalker::next_with_num(¤t.unwrap(), index); if acc.is_empty() { @@ -459,15 +480,6 @@ impl<'a> FilterTerms<'a> { Some(acc) } - pub fn collect_next_all(&mut self, current: Option>) -> Option> { - if current.is_none() { - debug!("collect_next_all : {:?}", ¤t); - return current; - } - - Some(ValueWalker::next_all(¤t.unwrap())) - } - pub fn collect_next_with_str(&mut self, current: Option>, keys: &[&'a str]) -> Option> { if current.is_none() { debug!( @@ -486,6 +498,15 @@ impl<'a> FilterTerms<'a> { Some(acc) } + pub fn collect_next_all(&mut self, current: Option>) -> Option> { + if current.is_none() { + debug!("collect_next_all : {:?}", ¤t); + return current; + } + + Some(ValueWalker::next_all(¤t.unwrap())) + } + pub fn collect_all(&mut self, current: Option>) -> Option> { if current.is_none() { debug!("collect_all: {:?}", ¤t); diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index a0dc73e4..bfa82bc2 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -32,15 +32,6 @@ impl<'a> ValueWalker { pub fn next_with_num(vec: &Vec<&'a Value>, index: f64) -> Vec<&'a Value> { vec.iter().fold(Vec::new(), |mut acc, v| { match v { - Value::Object(map) => { - for k in map.keys() { - if let Some(Value::Array(vec)) = map.get(k) { - if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { - acc.push(v); - } - } - } - } Value::Array(vec) => { if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { acc.push(v); diff --git a/tests/array_filter.rs b/tests/array_filter.rs index 9ffa79ed..7f1cf332 100644 --- a/tests/array_filter.rs +++ b/tests/array_filter.rs @@ -250,4 +250,15 @@ fn bugs40_bracket_notation_after_recursive_descent() { "more" ]), ); +} + +#[test] +fn bugs50() { + setup(); + + select_and_then_compare( + "$[0]", + json!({"f": [1,2,3]}), + json!([]) + ); } \ No newline at end of file From 1a84c5af9445e617a6deed14dadfaee13af0d95f Mon Sep 17 00:00:00 2001 From: freestrings Date: Tue, 7 Sep 2021 21:49:18 +0900 Subject: [PATCH 21/22] fix clippy --- src/selector/cmp.rs | 4 ++-- src/selector/terms.rs | 24 ++++++++++++---------- src/selector/utils.rs | 2 +- src/selector/value_walker.rs | 39 ++++++++++++++++-------------------- 4 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/selector/cmp.rs b/src/selector/cmp.rs index 66d5a864..951cfae2 100644 --- a/src/selector/cmp.rs +++ b/src/selector/cmp.rs @@ -32,7 +32,7 @@ impl Cmp for CmpEq { fn cmp_json<'a>(&self, v1: &[&'a Value], v2: &[&'a Value]) -> Vec<&'a Value> { v1.iter().fold(Vec::new(), |acc, a| { v2.iter().fold(acc, |mut acc, b| { - if *a as *const Value == *b as *const Value { + if std::ptr::eq(*a, *b) { acc.push(*a); } acc @@ -60,7 +60,7 @@ impl Cmp for CmpNe { let mut ret = v1.to_vec(); for v in v2 { for i in 0..ret.len() { - if *v as *const Value == &*ret[i] as *const Value { + if std::ptr::eq(*v, &*ret[i]) { ret.remove(i); break; } diff --git a/src/selector/terms.rs b/src/selector/terms.rs index 0821c462..3077e7a0 100644 --- a/src/selector/terms.rs +++ b/src/selector/terms.rs @@ -35,7 +35,7 @@ impl<'a> ExprTerm<'a> { C: Cmp, { match other { - ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(&n2))), + ExprTerm::Number(n2) => ExprTerm::Bool(cmp_fn.cmp_f64(utils::to_f64(n1), utils::to_f64(n2))), ExprTerm::Json(_, _, _) => unreachable!(), _ => ExprTerm::Bool(cmp_fn.default()), } @@ -54,7 +54,7 @@ impl<'a> ExprTerm<'a> { fn cmp_json_string(s2: &str, fk1: &Option, - vec1: &Vec<&'a Value>, + vec1: &[&'a Value], cmp_fn: &C) -> Vec<&'a Value> where C: Cmp @@ -78,7 +78,7 @@ impl<'a> ExprTerm<'a> { fn cmp_json_number(n2: &Number, fk1: &Option, - vec1: &Vec<&'a Value>, + vec1: &[&'a Value], cmp_fn: &C) -> Vec<&'a Value> where C: Cmp @@ -100,7 +100,7 @@ impl<'a> ExprTerm<'a> { fn cmp_json_bool(b2: &bool, fk1: &Option, - vec1: &Vec<&'a Value>, + vec1: &[&'a Value], cmp_fn: &C1) -> Vec<&'a Value> where C1: Cmp @@ -121,8 +121,8 @@ impl<'a> ExprTerm<'a> { fn cmp_json_json(rel: &Option>, parent: &Option>, - vec1: &Vec<&'a Value>, - vec2: &Vec<&'a Value>, + vec1: &[&'a Value], + vec2: &[&'a Value], cmp_fn: &C1) -> Vec<&'a Value> where C1: Cmp @@ -150,10 +150,10 @@ impl<'a> ExprTerm<'a> { { let ret: Vec<&Value> = match other { ExprTerm::String(s2) => Self::cmp_json_string(s2, &fk1, vec1, cmp_fn), - ExprTerm::Number(n2) => Self::cmp_json_number(&n2, &fk1, vec1, cmp_fn), - ExprTerm::Bool(b2) => Self::cmp_json_bool(&b2, &fk1, vec1, cmp_fn), + ExprTerm::Number(n2) => Self::cmp_json_number(n2, &fk1, vec1, cmp_fn), + ExprTerm::Bool(b2) => Self::cmp_json_bool(b2, &fk1, vec1, cmp_fn), ExprTerm::Json(parent, _, vec2) => { - Self::cmp_json_json(&rel, &parent, vec1, &vec2, cmp_fn) + Self::cmp_json_json(&rel, parent, vec1, vec2, cmp_fn) } }; @@ -167,7 +167,9 @@ impl<'a> ExprTerm<'a> { if rel.is_some() { if let ExprTerm::Json(_, _, _) = &other { - return ExprTerm::Json(Some(rel.unwrap()), None, ret); + if let Some(rel) = rel { + return ExprTerm::Json(Some(rel), None, ret); + } } } @@ -418,7 +420,7 @@ impl<'a> FilterTerms<'a> { let mut visited = HashSet::new(); let mut acc = Vec::new(); - let ref path_key = utils::to_path_str(key); + let path_key = &utils::to_path_str(key); ValueWalker::walk_dedup_all(vec, path_key.get_key(), diff --git a/src/selector/utils.rs b/src/selector/utils.rs index 7c4647d0..ec250625 100644 --- a/src/selector/utils.rs +++ b/src/selector/utils.rs @@ -37,7 +37,7 @@ impl<'a: 'b, 'b> PathKey<'a> { } } -pub fn to_path_str<'a>(key: &'a str) -> PathKey<'a> { +pub fn to_path_str(key: &str) -> PathKey { let mut path_key = PathKey { key, special_key: None diff --git a/src/selector/value_walker.rs b/src/selector/value_walker.rs index bfa82bc2..2c7c1039 100644 --- a/src/selector/value_walker.rs +++ b/src/selector/value_walker.rs @@ -7,7 +7,7 @@ use selector::utils::PathKey; pub(super) struct ValueWalker; impl<'a> ValueWalker { - pub fn next_all(vec: &Vec<&'a Value>) -> Vec<&'a Value> { + pub fn next_all(vec: &[&'a Value]) -> Vec<&'a Value> { vec.iter().fold(Vec::new(), |mut acc, v| { match v { Value::Object(map) => acc.extend(map.values()), @@ -18,7 +18,7 @@ impl<'a> ValueWalker { }) } - pub fn next_with_str(vec: &Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { + pub fn next_with_str(vec: &[&'a Value], key: &'a str) -> Vec<&'a Value> { vec.iter().fold(Vec::new(), |mut acc, v| { if let Value::Object(map) = v { if let Some(v) = map.get(key) { @@ -29,21 +29,18 @@ impl<'a> ValueWalker { }) } - pub fn next_with_num(vec: &Vec<&'a Value>, index: f64) -> Vec<&'a Value> { + pub fn next_with_num(vec: &[&'a Value], index: f64) -> Vec<&'a Value> { vec.iter().fold(Vec::new(), |mut acc, v| { - match v { - Value::Array(vec) => { - if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { - acc.push(v); - } + if let Value::Array(vec) = v { + if let Some(v) = vec.get(utils::abs_index(index as isize, vec.len())) { + acc.push(v); } - _ => {} } acc }) } - pub fn all_with_num(vec: &Vec<&'a Value>, index: f64) -> Vec<&'a Value> { + pub fn all_with_num(vec: &[&'a Value], index: f64) -> Vec<&'a Value> { Self::walk(vec, &|v, acc| { if v.is_array() { if let Some(v) = v.get(index as usize) { @@ -53,7 +50,7 @@ impl<'a> ValueWalker { }) } - pub fn all_with_str(vec: &Vec<&'a Value>, key: &'a str) -> Vec<&'a Value> { + pub fn all_with_str(vec: &[&'a Value], key: &'a str) -> Vec<&'a Value> { let path_key = utils::to_path_str(key); Self::walk(vec, &|v, acc| if let Value::Object(map) = v { if let Some(v) = map.get(path_key.get_key()) { @@ -62,8 +59,8 @@ impl<'a> ValueWalker { }) } - pub fn all_with_strs(vec: &Vec<&'a Value>, keys: &[&'a str]) -> Vec<&'a Value> { - let ref path_keys: Vec = keys.iter().map(|key| { utils::to_path_str(key) }).collect(); + pub fn all_with_strs(vec: &[&'a Value], keys: &[&'a str]) -> Vec<&'a Value> { + let path_keys: &Vec = &keys.iter().map(|key| { utils::to_path_str(key) }).collect(); vec.iter().fold(Vec::new(), |mut acc, v| { if let Value::Object(map) = v { path_keys.iter().for_each(|pk| if let Some(v) = map.get(pk.get_key()) { @@ -74,7 +71,7 @@ impl<'a> ValueWalker { }) } - pub fn all(vec: &Vec<&'a Value>) -> Vec<&'a Value> { + pub fn all(vec: &[&'a Value]) -> Vec<&'a Value> { Self::walk(vec, &|v, acc| { match v { Value::Array(ay) => acc.extend(ay), @@ -86,7 +83,7 @@ impl<'a> ValueWalker { }) } - fn walk(vec: &Vec<&'a Value>, fun: &F) -> Vec<&'a Value> + fn walk(vec: &[&'a Value], fun: &F) -> Vec<&'a Value> where F: Fn(&'a Value, &mut Vec<&'a Value>), { @@ -113,7 +110,7 @@ impl<'a> ValueWalker { } } - pub fn walk_dedup_all(vec: &Vec<&'a Value>, + pub fn walk_dedup_all(vec: &[&'a Value], key: &str, visited: &mut HashSet<*const Value>, is_contain: &mut F1, @@ -150,16 +147,14 @@ impl<'a> ValueWalker { match v { Value::Object(map) => { - if let Some(_) = map.get(key) { + if map.get(key).is_some() { let ptr = v as *const Value; if !visited.contains(&ptr) { visited.insert(ptr); is_contain(v); } - } else { - if depth == 0 { - is_not_contain(index); - } + } else if depth == 0 { + is_not_contain(index); } } Value::Array(vec) => { @@ -167,7 +162,7 @@ impl<'a> ValueWalker { is_not_contain(index); } vec.iter().for_each(|v| { - Self::walk_dedup(&v, key, visited, index, is_contain, is_not_contain, depth + 1); + Self::walk_dedup(v, key, visited, index, is_contain, is_not_contain, depth + 1); }) } _ => { From 2a583218ebd745c85c3d5ed9bc1268fc46a76786 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 4 May 2022 19:30:24 +0100 Subject: [PATCH 22/22] add tests for error in replace with handler for jsonpath selectors --- tests/selector.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/selector.rs b/tests/selector.rs index 648f0942..770501be 100644 --- a/tests/selector.rs +++ b/tests/selector.rs @@ -70,6 +70,24 @@ fn selector_mut_err() { ); } +#[test] +fn jsonselector_mut_err() { + setup(); + + let parser = PathParser::compile("$.store..price[?(@>13)]").unwrap(); + let mut selector_mut = JsonSelectorMut::new(parser); + let result = selector_mut + .value(read_json("./benchmark/example.json")) + .replace_with(&mut |_| { + Err(JsonPathError::EmptyValue) + }); + + assert_eq!( + result.is_err(), + true + ); +} + #[test] fn selector_node_ref() { let node = Parser::compile("$.*").unwrap();