From 68e4bd3f443869b130213d27f9cff8c59c099fe4 Mon Sep 17 00:00:00 2001 From: joshvera Date: Wed, 14 Feb 2018 09:40:15 -0500 Subject: [PATCH 01/11] Allow nested identifiers in JSX elements and optional JXAttribute assignments --- src/Language/TypeScript/Assignment.hs | 8 +++--- test/fixtures/typescript/jsx-elements.A.ts | 4 ++- .../typescript/jsx-elements.diffA-B.txt | 14 +++++++++- .../typescript/jsx-elements.diffB-A.txt | 12 +++++++- .../typescript/jsx-elements.parseA.txt | 28 ++++++++++++++++++- 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/Language/TypeScript/Assignment.hs b/src/Language/TypeScript/Assignment.hs index 66ca5485d..89d0c7465 100644 --- a/src/Language/TypeScript/Assignment.hs +++ b/src/Language/TypeScript/Assignment.hs @@ -356,10 +356,10 @@ jsxElement :: Assignment jsxElement = makeTerm <$> symbol Grammar.JsxElement <*> children (TypeScript.Syntax.JsxElement <$> term jsxOpeningElement' <*> manyTerm (jsxElement <|> jsxSelfClosingElement <|> jsxExpression' <|> jsxText) <*> term jsxClosingElement') jsxSelfClosingElement :: Assignment -jsxSelfClosingElement = makeTerm <$> symbol Grammar.JsxSelfClosingElement <*> children (TypeScript.Syntax.JsxSelfClosingElement <$> term identifier <*> manyTerm (jsxAttribute <|> jsxExpression')) +jsxSelfClosingElement = makeTerm <$> symbol Grammar.JsxSelfClosingElement <*> children (TypeScript.Syntax.JsxSelfClosingElement <$> term (identifier <|> nestedIdentifier) <*> manyTerm (jsxAttribute <|> jsxExpression')) jsxOpeningElement' :: Assignment -jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TypeScript.Syntax.JsxOpeningElement <$> term identifier <*> manyTerm (jsxAttribute <|> jsxExpression')) +jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TypeScript.Syntax.JsxOpeningElement <$> term (identifier <|> nestedIdentifier) <*> manyTerm (jsxAttribute <|> jsxExpression')) jsxExpression' :: Assignment jsxExpression' = makeTerm <$> symbol Grammar.JsxExpression <*> children (TypeScript.Syntax.JsxExpression <$> term (expressions <|> spreadElement)) @@ -368,10 +368,10 @@ jsxText :: Assignment jsxText = makeTerm <$> symbol Grammar.JsxText <*> (TypeScript.Syntax.JsxText <$> source) jsxClosingElement' :: Assignment -jsxClosingElement' = makeTerm <$> symbol Grammar.JsxClosingElement <*> children (TypeScript.Syntax.JsxClosingElement <$> term identifier) +jsxClosingElement' = makeTerm <$> symbol Grammar.JsxClosingElement <*> children (TypeScript.Syntax.JsxClosingElement <$> term (identifier <|> nestedIdentifier)) jsxAttribute :: Assignment -jsxAttribute = makeTerm <$> symbol Grammar.JsxAttribute <*> children (TypeScript.Syntax.JsxAttribute <$> term propertyIdentifier <*> term (number <|> string <|> jsxExpression')) +jsxAttribute = makeTerm <$> symbol Grammar.JsxAttribute <*> children (TypeScript.Syntax.JsxAttribute <$> term propertyIdentifier <*> (term (number <|> string <|> jsxExpression') <|> emptyTerm)) propertyIdentifier :: Assignment propertyIdentifier = makeTerm <$> symbol PropertyIdentifier <*> (Syntax.Identifier <$> source) diff --git a/test/fixtures/typescript/jsx-elements.A.ts b/test/fixtures/typescript/jsx-elements.A.ts index ad867ed78..6ed522a83 100644 --- a/test/fixtures/typescript/jsx-elements.A.ts +++ b/test/fixtures/typescript/jsx-elements.A.ts @@ -1 +1,3 @@ -var a = {children} \ No newline at end of file +var a = {children} +var b = +var c = diff --git a/test/fixtures/typescript/jsx-elements.diffA-B.txt b/test/fixtures/typescript/jsx-elements.diffA-B.txt index cd1f6951a..cdee6e494 100644 --- a/test/fixtures/typescript/jsx-elements.diffA-B.txt +++ b/test/fixtures/typescript/jsx-elements.diffA-B.txt @@ -22,4 +22,16 @@ (JsxExpression (Identifier)) (JsxClosingElement - (Identifier)))))) + (Identifier))))) + {-(VariableDeclaration + {-(Assignment + {-(Empty)-} + {-(Identifier)-} + {-(JsxElement{-(JsxOpeningElement{-(NestedIdentifier{-(Identifier)-}{-(Identifier)-})-})-}{-(JsxClosingElement{-(NestedIdentifier{-(Identifier)-}{-(Identifier)-})-})-})-}) + -})-} + {-(VariableDeclaration + {-(Assignment + {-(Empty)-} + {-(Identifier)-} + {-(JsxSelfClosingElement{-(NestedIdentifier{-(Identifier)-}{-(Identifier)-})-}{-(JsxAttribute{-(Identifier)-}{-(Empty)-})-}{-(JsxAttribute{-(Identifier)-}{-(TextElement)-})-})-} + )-})-}) diff --git a/test/fixtures/typescript/jsx-elements.diffB-A.txt b/test/fixtures/typescript/jsx-elements.diffB-A.txt index 4cef88579..b41facd71 100644 --- a/test/fixtures/typescript/jsx-elements.diffB-A.txt +++ b/test/fixtures/typescript/jsx-elements.diffB-A.txt @@ -22,4 +22,14 @@ (JsxExpression (Identifier)) (JsxClosingElement - (Identifier)))))) + (Identifier))))) + {+(VariableDeclaration + {+(Assignment + {+(Empty)+} + {+(Identifier)+} + {+(JsxElement{+(JsxOpeningElement{+(NestedIdentifier{+(Identifier)+}{+(Identifier)+})+})+}{+(JsxClosingElement{+(NestedIdentifier{+(Identifier)+}{+(Identifier)+})+})+})+})+})+} + {+(VariableDeclaration + {+(Assignment + {+(Empty)+} + {+(Identifier)+} + {+(JsxSelfClosingElement{+(NestedIdentifier{+(Identifier)+}{+(Identifier)+})+}{+(JsxAttribute{+(Identifier)+}{+(Empty)+})+}{+(JsxAttribute{+(Identifier)+}{+(TextElement)+})+})+})+})+}) diff --git a/test/fixtures/typescript/jsx-elements.parseA.txt b/test/fixtures/typescript/jsx-elements.parseA.txt index 72387143d..42d46254f 100644 --- a/test/fixtures/typescript/jsx-elements.parseA.txt +++ b/test/fixtures/typescript/jsx-elements.parseA.txt @@ -16,4 +16,30 @@ (JsxExpression (Identifier)) (JsxClosingElement - (Identifier)))))) + (Identifier))))) + (VariableDeclaration + (Assignment + (Empty) + (Identifier) + (JsxElement + (JsxOpeningElement + (NestedIdentifier + (Identifier) (Identifier))) + (JsxClosingElement + (NestedIdentifier + (Identifier) + (Identifier)))))) + (VariableDeclaration + (Assignment + (Empty) + (Identifier) + (JsxSelfClosingElement + (NestedIdentifier + (Identifier) + (Identifier)) + (JsxAttribute + (Identifier) + (Empty)) + (JsxAttribute + (Identifier) + (TextElement)))))) From 03814d25e8c16f03820f17f5b1824836ede2bd34 Mon Sep 17 00:00:00 2001 From: joshvera Date: Wed, 14 Feb 2018 11:20:22 -0500 Subject: [PATCH 02/11] ++haskell-tree-sitter --- vendor/haskell-tree-sitter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/haskell-tree-sitter b/vendor/haskell-tree-sitter index 179099a20..c5726e50e 160000 --- a/vendor/haskell-tree-sitter +++ b/vendor/haskell-tree-sitter @@ -1 +1 @@ -Subproject commit 179099a20135bfcee635e469022c77f04df20b07 +Subproject commit c5726e50e36a2a2ed65e802073acdadc53c5ddc9 From 31f4e87ac0670c3e4c5a1daa2734332e9577609a Mon Sep 17 00:00:00 2001 From: joshvera Date: Wed, 14 Feb 2018 14:47:15 -0500 Subject: [PATCH 03/11] ++haskell-tree-sitter --- vendor/haskell-tree-sitter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/haskell-tree-sitter b/vendor/haskell-tree-sitter index c5726e50e..8a7f4e02a 160000 --- a/vendor/haskell-tree-sitter +++ b/vendor/haskell-tree-sitter @@ -1 +1 @@ -Subproject commit c5726e50e36a2a2ed65e802073acdadc53c5ddc9 +Subproject commit 8a7f4e02ace8bf073943254ef8b9205d1bac7a9a From 9fa6d429456651dc1ed70b0f816434f6bfd5f26b Mon Sep 17 00:00:00 2001 From: joshvera Date: Wed, 14 Feb 2018 15:33:38 -0500 Subject: [PATCH 04/11] ++tree-sitter-haskell --- vendor/haskell-tree-sitter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/haskell-tree-sitter b/vendor/haskell-tree-sitter index 8a7f4e02a..8aeb596fc 160000 --- a/vendor/haskell-tree-sitter +++ b/vendor/haskell-tree-sitter @@ -1 +1 @@ -Subproject commit 8a7f4e02ace8bf073943254ef8b9205d1bac7a9a +Subproject commit 8aeb596fca41edd3bfec6b3340df89a181e55ba5 From bbee1d839ccec806020bb9b12d0c0a9e1c5a7787 Mon Sep 17 00:00:00 2001 From: joshvera Date: Wed, 14 Feb 2018 15:48:00 -0500 Subject: [PATCH 05/11] Update JSX terms --- src/Language/TypeScript/Assignment.hs | 40 +++++++++++++++++++++------ src/Language/TypeScript/Syntax.hs | 21 ++++++++++++++ 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/Language/TypeScript/Assignment.hs b/src/Language/TypeScript/Assignment.hs index 89d0c7465..eab7404cd 100644 --- a/src/Language/TypeScript/Assignment.hs +++ b/src/Language/TypeScript/Assignment.hs @@ -144,6 +144,9 @@ type Syntax = '[ , TypeScript.Syntax.JsxClosingElement , TypeScript.Syntax.JsxExpression , TypeScript.Syntax.JsxAttribute + , TypeScript.Syntax.JsxMemberExpression + , TypeScript.Syntax.JsxFragment + , TypeScript.Syntax.JsxNamespaceName , TypeScript.Syntax.OptionalParameter , TypeScript.Syntax.RequiredParameter , TypeScript.Syntax.RestParameter @@ -196,8 +199,8 @@ expression = handleError everything super, object, array, - jsxElement, - jsxSelfClosingElement, + jsxElement', + jsxFragment, class', anonymousClass, function, @@ -352,26 +355,47 @@ object = makeTerm <$> (symbol Object <|> symbol ObjectPattern) <*> children (Lit array :: Assignment array = makeTerm <$> (symbol Array <|> symbol ArrayPattern) <*> children (Literal.Array <$> manyTerm (expression <|> spreadElement)) +jsxElement' :: Assignment +jsxElement' = choice [ jsxElement, jsxSelfClosingElement ] + jsxElement :: Assignment -jsxElement = makeTerm <$> symbol Grammar.JsxElement <*> children (TypeScript.Syntax.JsxElement <$> term jsxOpeningElement' <*> manyTerm (jsxElement <|> jsxSelfClosingElement <|> jsxExpression' <|> jsxText) <*> term jsxClosingElement') +jsxElement = makeTerm <$> symbol Grammar.JsxElement <*> children (TypeScript.Syntax.JsxElement <$> term jsxOpeningElement' <*> manyTerm jsxChild <*> term jsxClosingElement') + +jsxFragment :: Assignment +jsxFragment = makeTerm <$> symbol Grammar.JsxFragment <*> children (TypeScript.Syntax.JsxFragment <$> manyTerm jsxChild) + +jsxChild :: Assignment +jsxChild = choice [ jsxElement', jsxExpression', jsxText ] jsxSelfClosingElement :: Assignment -jsxSelfClosingElement = makeTerm <$> symbol Grammar.JsxSelfClosingElement <*> children (TypeScript.Syntax.JsxSelfClosingElement <$> term (identifier <|> nestedIdentifier) <*> manyTerm (jsxAttribute <|> jsxExpression')) +jsxSelfClosingElement = makeTerm <$> symbol Grammar.JsxSelfClosingElement <*> children (TypeScript.Syntax.JsxSelfClosingElement <$> term jsxElementName <*> manyTerm jsxAttribute') + +jsxAttribute' = jsxAttribute <|> jsxExpression' jsxOpeningElement' :: Assignment -jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TypeScript.Syntax.JsxOpeningElement <$> term (identifier <|> nestedIdentifier) <*> manyTerm (jsxAttribute <|> jsxExpression')) +jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TypeScript.Syntax.JsxOpeningElement <$> term jsxElementName <*> manyTerm jsxAttribute') + +jsxElementName :: Assignment +jsxElementName = choice [ identifier, jsxMemberExpression, jsxNamespaceName ] + +jsxNamespaceName :: Assignment +jsxNamespaceName = makeTerm <$> symbol Grammar.JsxNamespaceName <*> children (TypeScript.Syntax.JsxNamespaceName <$> identifier <*> identifier) + +jsxMemberExpression :: Assignment +jsxMemberExpression = makeTerm <$> symbol Grammar.JsxMemberExpression <*> children (TypeScript.Syntax.JsxMemberExpression <$> manyTerm identifier) jsxExpression' :: Assignment -jsxExpression' = makeTerm <$> symbol Grammar.JsxExpression <*> children (TypeScript.Syntax.JsxExpression <$> term (expressions <|> spreadElement)) +jsxExpression' = makeTerm <$> symbol Grammar.JsxExpression <*> children (TypeScript.Syntax.JsxExpression <$> term (expressions <|> spreadElement <|> emptyTerm)) jsxText :: Assignment jsxText = makeTerm <$> symbol Grammar.JsxText <*> (TypeScript.Syntax.JsxText <$> source) jsxClosingElement' :: Assignment -jsxClosingElement' = makeTerm <$> symbol Grammar.JsxClosingElement <*> children (TypeScript.Syntax.JsxClosingElement <$> term (identifier <|> nestedIdentifier)) +jsxClosingElement' = makeTerm <$> symbol Grammar.JsxClosingElement <*> children (TypeScript.Syntax.JsxClosingElement <$> term jsxElementName) jsxAttribute :: Assignment -jsxAttribute = makeTerm <$> symbol Grammar.JsxAttribute <*> children (TypeScript.Syntax.JsxAttribute <$> term propertyIdentifier <*> (term (number <|> string <|> jsxExpression') <|> emptyTerm)) +jsxAttribute = makeTerm <$> symbol Grammar.JsxAttribute <*> children (TypeScript.Syntax.JsxAttribute <$> term (propertyIdentifier <|> jsxNamespaceName) <*> (term jsxAttributeValue <|> emptyTerm)) + where jsxAttributeValue = choice [ string, jsxExpression', jsxElement', jsxFragment ] propertyIdentifier :: Assignment propertyIdentifier = makeTerm <$> symbol PropertyIdentifier <*> (Syntax.Identifier <$> source) diff --git a/src/Language/TypeScript/Syntax.hs b/src/Language/TypeScript/Syntax.hs index aa4103a8e..dc16a9fe3 100644 --- a/src/Language/TypeScript/Syntax.hs +++ b/src/Language/TypeScript/Syntax.hs @@ -493,3 +493,24 @@ data RestParameter a = RestParameter { _restParameterContext :: ![a], _restParam instance Eq1 RestParameter where liftEq = genericLiftEq instance Ord1 RestParameter where liftCompare = genericLiftCompare instance Show1 RestParameter where liftShowsPrec = genericLiftShowsPrec + +data JsxFragment a = JsxFragment [a] + deriving (Diffable, Eq, Foldable, Functor, GAlign, Generic1, Mergeable, Ord, Show, Traversable) + +instance Eq1 JsxFragment where liftEq = genericLiftEq +instance Ord1 JsxFragment where liftCompare = genericLiftCompare +instance Show1 JsxFragment where liftShowsPrec = genericLiftShowsPrec + +data JsxNamespaceName a = JsxNamespaceName a a + deriving (Diffable, Eq, Foldable, Functor, GAlign, Generic1, Mergeable, Ord, Show, Traversable) + +instance Eq1 JsxNamespaceName where liftEq = genericLiftEq +instance Ord1 JsxNamespaceName where liftCompare = genericLiftCompare +instance Show1 JsxNamespaceName where liftShowsPrec = genericLiftShowsPrec + +data JsxMemberExpression a = JsxMemberExpression [a] + deriving (Diffable, Eq, Foldable, Functor, GAlign, Generic1, Mergeable, Ord, Show, Traversable) + +instance Eq1 JsxMemberExpression where liftEq = genericLiftEq +instance Ord1 JsxMemberExpression where liftCompare = genericLiftCompare +instance Show1 JsxMemberExpression where liftShowsPrec = genericLiftShowsPrec From 188a83dcd26288d2ce7e17c4c6d0b9faf3afae99 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 13:18:51 -0500 Subject: [PATCH 06/11] ++effects --- vendor/effects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/effects b/vendor/effects index 7b905b290..e1c28f532 160000 --- a/vendor/effects +++ b/vendor/effects @@ -1 +1 @@ -Subproject commit 7b905b290f746c07f6a5486afd9fd881cfd30caf +Subproject commit e1c28f5321f94f5610fd25a640ffdd9b1e67b85f From 37356a167541061d6fa816ee723e50be95e56908 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 15:47:24 -0500 Subject: [PATCH 07/11] ++haskell-tree-sitter --- vendor/haskell-tree-sitter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/haskell-tree-sitter b/vendor/haskell-tree-sitter index 8aeb596fc..70b500982 160000 --- a/vendor/haskell-tree-sitter +++ b/vendor/haskell-tree-sitter @@ -1 +1 @@ -Subproject commit 8aeb596fca41edd3bfec6b3340df89a181e55ba5 +Subproject commit 70b500982973f88709403f4dd4f6c976883a2b88 From cb6df90b07189085a3e4d242be2f7128b4551438 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 16:26:49 -0500 Subject: [PATCH 08/11] ++haskell-tree-sitter --- vendor/haskell-tree-sitter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/haskell-tree-sitter b/vendor/haskell-tree-sitter index 70b500982..a7c77ef54 160000 --- a/vendor/haskell-tree-sitter +++ b/vendor/haskell-tree-sitter @@ -1 +1 @@ -Subproject commit 70b500982973f88709403f4dd4f6c976883a2b88 +Subproject commit a7c77ef5459e4f610bd82ce203984f408bc106c2 From 0991bcdadcf6c9e07382ea619edc8af56cbc58e1 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 16:32:32 -0500 Subject: [PATCH 09/11] Replace member expression with nested identifier --- src/Language/TypeScript/Assignment.hs | 6 +----- src/Language/TypeScript/Syntax.hs | 7 ------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/Language/TypeScript/Assignment.hs b/src/Language/TypeScript/Assignment.hs index eab7404cd..8ed6c81a9 100644 --- a/src/Language/TypeScript/Assignment.hs +++ b/src/Language/TypeScript/Assignment.hs @@ -144,7 +144,6 @@ type Syntax = '[ , TypeScript.Syntax.JsxClosingElement , TypeScript.Syntax.JsxExpression , TypeScript.Syntax.JsxAttribute - , TypeScript.Syntax.JsxMemberExpression , TypeScript.Syntax.JsxFragment , TypeScript.Syntax.JsxNamespaceName , TypeScript.Syntax.OptionalParameter @@ -376,14 +375,11 @@ jsxOpeningElement' :: Assignment jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TypeScript.Syntax.JsxOpeningElement <$> term jsxElementName <*> manyTerm jsxAttribute') jsxElementName :: Assignment -jsxElementName = choice [ identifier, jsxMemberExpression, jsxNamespaceName ] +jsxElementName = choice [ identifier, nestedIdentifier, jsxNamespaceName ] jsxNamespaceName :: Assignment jsxNamespaceName = makeTerm <$> symbol Grammar.JsxNamespaceName <*> children (TypeScript.Syntax.JsxNamespaceName <$> identifier <*> identifier) -jsxMemberExpression :: Assignment -jsxMemberExpression = makeTerm <$> symbol Grammar.JsxMemberExpression <*> children (TypeScript.Syntax.JsxMemberExpression <$> manyTerm identifier) - jsxExpression' :: Assignment jsxExpression' = makeTerm <$> symbol Grammar.JsxExpression <*> children (TypeScript.Syntax.JsxExpression <$> term (expressions <|> spreadElement <|> emptyTerm)) diff --git a/src/Language/TypeScript/Syntax.hs b/src/Language/TypeScript/Syntax.hs index dc16a9fe3..347f2e597 100644 --- a/src/Language/TypeScript/Syntax.hs +++ b/src/Language/TypeScript/Syntax.hs @@ -507,10 +507,3 @@ data JsxNamespaceName a = JsxNamespaceName a a instance Eq1 JsxNamespaceName where liftEq = genericLiftEq instance Ord1 JsxNamespaceName where liftCompare = genericLiftCompare instance Show1 JsxNamespaceName where liftShowsPrec = genericLiftShowsPrec - -data JsxMemberExpression a = JsxMemberExpression [a] - deriving (Diffable, Eq, Foldable, Functor, GAlign, Generic1, Mergeable, Ord, Show, Traversable) - -instance Eq1 JsxMemberExpression where liftEq = genericLiftEq -instance Ord1 JsxMemberExpression where liftCompare = genericLiftCompare -instance Show1 JsxMemberExpression where liftShowsPrec = genericLiftShowsPrec From d296e97a490021675b70e1824f65252fedb6d826 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 17:12:12 -0500 Subject: [PATCH 10/11] ++effects --- vendor/effects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/effects b/vendor/effects index e1c28f532..beb8b4ebf 160000 --- a/vendor/effects +++ b/vendor/effects @@ -1 +1 @@ -Subproject commit e1c28f5321f94f5610fd25a640ffdd9b1e67b85f +Subproject commit beb8b4ebf36d9bd52c0960b9d5b2971154bfeddb From e1f955939ed1b5918041b7a76638b4a280daede0 Mon Sep 17 00:00:00 2001 From: joshvera Date: Fri, 16 Feb 2018 17:12:43 -0500 Subject: [PATCH 11/11] ++effects --- vendor/effects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/effects b/vendor/effects index beb8b4ebf..665d14c75 160000 --- a/vendor/effects +++ b/vendor/effects @@ -1 +1 @@ -Subproject commit beb8b4ebf36d9bd52c0960b9d5b2971154bfeddb +Subproject commit 665d14c75881ddedb3aa6fa9ee0c46bfb898b3df