{-# LANGUAGE Safe #-}
{-# LANGUAGE GADTs, NamedFieldPuns, BinaryLiterals, NumericUnderscores, DataKinds, BangPatterns #-}
{-# OPTIONS_HADDOCK hide #-}
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
module Text.Gigaparsec.Internal.Errors.DefuncError (
DefuncError(presentationOffset),
specialisedError, expectedError, unexpectedError, emptyError,
merge, withHints, withReason, withReasonAndOffset, label,
amend, entrench, dislodge, markAsLexical,
isVanilla, isExpectedEmpty, isLexical
) where
import Data.Word (Word32)
import Data.Bits ((.&.), (.|.), testBit, clearBit, setBit, complement, bit)
import Data.Set (Set)
import Data.Set qualified as Set (null)
import Text.Gigaparsec.Internal.Errors.CaretControl (CaretWidth, Span, isFlexible)
import Text.Gigaparsec.Internal.Errors.DefuncTypes (
DefuncError(..), DefuncError_(..), ErrKindSingleton(..),
ErrorOp(..), BaseError(..),
DefuncHints(..)
)
import Text.Gigaparsec.Internal.Errors.ErrorItem (ExpectItem)
{-# INLINABLE isVanilla #-}
isVanilla :: DefuncError -> Bool
isVanilla :: DefuncError -> Bool
isVanilla DefuncError{Word32
flags :: Word32
flags :: DefuncError -> Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
vanillaBit
{-# INLINABLE isExpectedEmpty #-}
isExpectedEmpty :: DefuncError -> Bool
isExpectedEmpty :: DefuncError -> Bool
isExpectedEmpty DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
expectedEmptyBit
{-# INLINABLE entrenchedBy #-}
entrenchedBy :: DefuncError -> Word32
entrenchedBy :: DefuncError -> Word32
entrenchedBy DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32
flags Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask
{-# INLINABLE entrenched #-}
entrenched :: DefuncError -> Bool
entrenched :: DefuncError -> Bool
entrenched DefuncError
err = DefuncError -> Word32
entrenchedBy DefuncError
err Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
0
{-# INLINABLE isFlexibleCaret #-}
isFlexibleCaret :: DefuncError -> Bool
isFlexibleCaret :: DefuncError -> Bool
isFlexibleCaret DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
flexibleCaretBit
{-# INLINABLE isLexical #-}
isLexical :: DefuncError -> Bool
isLexical :: DefuncError -> Bool
isLexical DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
lexicalBit
specialisedError :: Word -> Word -> Word -> [String] -> CaretWidth -> DefuncError
specialisedError :: Word -> Word -> Word -> [String] -> CaretWidth -> DefuncError
specialisedError !Word
pOff !Word
line !Word
col ![String]
msgs CaretWidth
caret =
ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col ([String] -> CaretWidth -> BaseError 'Specialised
ClassicSpecialised [String]
msgs CaretWidth
caret))
where flags :: Word32
!flags :: Word32
flags
| CaretWidth -> Bool
isFlexible CaretWidth
caret = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
expectedEmptyBit) Int
flexibleCaretBit
| Bool
otherwise = Int -> Word32
forall a. Bits a => Int -> a
bit Int
expectedEmptyBit
emptyError :: Word -> Word -> Word -> Span -> DefuncError
emptyError :: Word -> Word -> Word -> Word -> DefuncError
emptyError !Word
pOff !Word
line !Word
col !Word
unexWidth =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Word -> BaseError 'Vanilla
Empty Word
unexWidth))
where flags :: Word32
!flags :: Word32
flags = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit
expectedError :: Word -> Word -> Word -> Set ExpectItem -> Span -> DefuncError
expectedError :: Word -> Word -> Word -> Set ExpectItem -> Word -> DefuncError
expectedError !Word
pOff !Word
line !Word
col !Set ExpectItem
exs !Word
unexWidth =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Set ExpectItem -> Word -> BaseError 'Vanilla
Expected Set ExpectItem
exs Word
unexWidth))
where flags :: Word32
!flags :: Word32
flags
| Set ExpectItem -> Bool
forall a. Set a -> Bool
Set.null Set ExpectItem
exs = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit
| Bool
otherwise = Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit
unexpectedError :: Word -> Word -> Word -> Set ExpectItem -> String -> CaretWidth -> DefuncError
unexpectedError :: Word
-> Word
-> Word
-> Set ExpectItem
-> String
-> CaretWidth
-> DefuncError
unexpectedError !Word
pOff !Word
line !Word
col !Set ExpectItem
exs !String
unex CaretWidth
caretWidth =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Set ExpectItem -> String -> CaretWidth -> BaseError 'Vanilla
Unexpected Set ExpectItem
exs String
unex CaretWidth
caretWidth))
where flags :: Word32
!flags :: Word32
flags
| Set ExpectItem -> Bool
forall a. Set a -> Bool
Set.null Set ExpectItem
exs = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit
| Bool
otherwise = Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit
merge :: DefuncError -> DefuncError -> DefuncError
merge :: DefuncError -> DefuncError -> DefuncError
merge err1 :: DefuncError
err1@(DefuncError ErrKindSingleton k
k1 Word32
flags1 Word
pOff1 Word
uOff1 DefuncError_ k
errTy1)
err2 :: DefuncError
err2@(DefuncError ErrKindSingleton k
k2 Word32
flags2 Word
pOff2 Word
uOff2 DefuncError_ k
errTy2) =
case Word -> Word -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Word
uOff1 Word
uOff2 of
Ordering
GT -> DefuncError
err1
Ordering
LT -> DefuncError
err2
Ordering
EQ -> case Word -> Word -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Word
pOff1 Word
pOff2 of
Ordering
GT -> DefuncError
err1
Ordering
LT -> DefuncError
err2
Ordering
EQ -> case ErrKindSingleton k
k1 of
ErrKindSingleton k
IsSpecialised -> case ErrKindSingleton k
k2 of
ErrKindSingleton k
IsSpecialised ->
ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised (Word32 -> Word32 -> Word32
combineFlags Word32
flags1 Word32
flags2) Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Specialised -> ErrorOp 'Specialised
forall (k :: ErrKind).
DefuncError_ k -> DefuncError_ k -> ErrorOp k
Merged DefuncError_ k
DefuncError_ 'Specialised
errTy1 DefuncError_ k
DefuncError_ 'Specialised
errTy2))
ErrKindSingleton k
IsVanilla | DefuncError -> Bool
isFlexibleCaret DefuncError
err1 ->
ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags1 Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Vanilla -> ErrorOp 'Specialised
AdjustCaret DefuncError_ k
DefuncError_ 'Specialised
errTy1 DefuncError_ k
DefuncError_ 'Vanilla
errTy2))
ErrKindSingleton k
_ -> DefuncError
err1
ErrKindSingleton k
IsVanilla -> case ErrKindSingleton k
k2 of
ErrKindSingleton k
IsVanilla ->
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Word32 -> Word32
combineFlags Word32
flags1 Word32
flags2) Word
pOff1 Word
uOff1 (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> DefuncError_ 'Vanilla -> ErrorOp 'Vanilla
forall (k :: ErrKind).
DefuncError_ k -> DefuncError_ k -> ErrorOp k
Merged DefuncError_ k
DefuncError_ 'Vanilla
errTy1 DefuncError_ k
DefuncError_ 'Vanilla
errTy2))
ErrKindSingleton k
IsSpecialised | DefuncError -> Bool
isFlexibleCaret DefuncError
err2 ->
ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags1 Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Vanilla -> ErrorOp 'Specialised
AdjustCaret DefuncError_ k
DefuncError_ 'Specialised
errTy2 DefuncError_ k
DefuncError_ 'Vanilla
errTy1))
ErrKindSingleton k
_ -> DefuncError
err2
where combineFlags :: Word32 -> Word32 -> Word32
combineFlags Word32
f1 Word32
f2 =
(Word32
f1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
f2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32 -> Word32
forall a. Bits a => a -> a
complement Word32
entrenchedMask) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. Word32 -> Word32 -> Word32
forall a. Ord a => a -> a -> a
max (Word32
f1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask) (Word32
f2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask)
withHints :: DefuncHints -> DefuncError -> DefuncError
withHints :: DefuncHints -> DefuncError -> DefuncError
withHints DefuncHints
Blank DefuncError
err = DefuncError
err
withHints DefuncHints
hints (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
clearBit Word32
flags Int
expectedEmptyBit) Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> DefuncHints -> ErrorOp 'Vanilla
WithHints DefuncError_ k
DefuncError_ 'Vanilla
errTy DefuncHints
hints))
withHints DefuncHints
_ DefuncError
err = DefuncError
err
withReasonAndOffset :: String -> Word -> DefuncError -> DefuncError
withReasonAndOffset :: String -> Word -> DefuncError -> DefuncError
withReasonAndOffset !String
reason !Word
off (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
pOff Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
off =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> String -> ErrorOp 'Vanilla
WithReason DefuncError_ k
DefuncError_ 'Vanilla
errTy String
reason))
withReasonAndOffset String
_ Word
_ DefuncError
err = DefuncError
err
withReason :: String -> DefuncError -> DefuncError
withReason :: String -> DefuncError -> DefuncError
withReason !String
reason DefuncError
err = String -> Word -> DefuncError -> DefuncError
withReasonAndOffset String
reason (DefuncError -> Word
presentationOffset DefuncError
err) DefuncError
err
label :: Word -> Set String -> DefuncError -> DefuncError
label :: Word -> Set String -> DefuncError -> DefuncError
label !Word
off !Set String
labels (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
pOff Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
off =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags' Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> Set String -> ErrorOp 'Vanilla
WithLabel DefuncError_ k
DefuncError_ 'Vanilla
errTy Set String
labels))
where !flags' :: Word32
flags'
| Set String -> Bool
forall a. Set a -> Bool
Set.null Set String
labels = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit Word32
flags Int
expectedEmptyBit
| Bool
otherwise = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
clearBit Word32
flags Int
expectedEmptyBit
label Word
_ Set String
_ DefuncError
err = DefuncError
err
amend :: Bool -> Word -> Word -> Word -> DefuncError -> DefuncError
amend :: Bool -> Word -> Word -> Word -> DefuncError -> DefuncError
amend !Bool
partial !Word
pOff !Word
line !Word
col err :: DefuncError
err@(DefuncError ErrKindSingleton k
k Word32
flags Word
_ Word
uOff DefuncError_ k
errTy)
| DefuncError -> Bool
entrenched DefuncError
err = DefuncError
err
| Bool
otherwise = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff' (ErrorOp k -> DefuncError_ k
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (Word -> Word -> DefuncError_ k -> ErrorOp k
forall (k :: ErrKind). Word -> Word -> DefuncError_ k -> ErrorOp k
Amended Word
line Word
col DefuncError_ k
errTy))
where
!uOff' :: Word
uOff' = if Bool
partial then Word
uOff else Word
pOff
entrench :: DefuncError -> DefuncError
entrench :: DefuncError -> DefuncError
entrench (DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1) Word
pOff Word
uOff DefuncError_ k
errTy
dislodge :: Word32 -> DefuncError -> DefuncError
dislodge :: Word32 -> DefuncError -> DefuncError
dislodge Word32
by err :: DefuncError
err@(DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy)
| Word32
eBy Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
0 = DefuncError
err
| Word32
eBy Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
by = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
by) Word
pOff Word
uOff DefuncError_ k
errTy
| Bool
otherwise = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32 -> Word32
forall a. Bits a => a -> a
complement Word32
entrenchedMask) Word
pOff Word
uOff DefuncError_ k
errTy
where !eBy :: Word32
eBy = DefuncError -> Word32
entrenchedBy DefuncError
err
markAsLexical :: Word -> DefuncError -> DefuncError
markAsLexical :: Word -> DefuncError -> DefuncError
markAsLexical !Word
off (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
off Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
pOff =
ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit Word32
flags Int
lexicalBit) Word
pOff Word
uOff DefuncError_ k
DefuncError_ 'Vanilla
errTy
markAsLexical Word
_ DefuncError
err = DefuncError
err
{-# INLINE vanillaBit #-}
{-# INLINE expectedEmptyBit #-}
{-# INLINE lexicalBit #-}
{-# INLINE flexibleCaretBit #-}
{-# INLINE entrenchedMask #-}
vanillaBit, expectedEmptyBit, lexicalBit, flexibleCaretBit :: Int
vanillaBit :: Int
vanillaBit = Int
31
expectedEmptyBit :: Int
expectedEmptyBit = Int
30
lexicalBit :: Int
lexicalBit = Int
29
flexibleCaretBit :: Int
flexibleCaretBit = Int
28
entrenchedMask :: Word32
entrenchedMask :: Word32
entrenchedMask = Word32
0b00001111_11111111_11111111_11111111