packages feed

api-tools 0.5.2 → 0.8.0.1

raw patch · 44 files changed

+2887/−3181 lines, 44 filesdep +base16-bytestringdep +binarydep +cborgdep ~QuickCheckdep ~aesondep ~aeson-prettynew-component:exe:perf-testPVP ok

version bump matches the API change (PVP)

Dependencies added: base16-bytestring, binary, cborg, scientific, serialise

Dependency ranges changed: QuickCheck, aeson, aeson-pretty, attoparsec, deepseq, lens, old-locale, safecopy, tasty, tasty-hunit, template-haskell, text, time, vector

API changes (from Hackage documentation)

- Data.API.API: instance FromJSONWithErrs Thing
- Data.API.API.Gen: _RegularExpression :: RegularExpression -> Text
- Data.API.API.Gen: _TypeRef :: TypeRef -> Text
- Data.API.API.Gen: _an_comment :: APINode -> !Text
- Data.API.API.Gen: _an_convert :: APINode -> !(Maybe Conversion)
- Data.API.API.Gen: _an_name :: APINode -> !Text
- Data.API.API.Gen: _an_prefix :: APINode -> !Text
- Data.API.API.Gen: _an_spec :: APINode -> !Spec
- Data.API.API.Gen: _cv_injection :: Conversion -> !Text
- Data.API.API.Gen: _cv_projection :: Conversion -> !Text
- Data.API.API.Gen: _fd_comment :: Field -> !Text
- Data.API.API.Gen: _fd_default :: Field -> !(Maybe DefaultValue)
- Data.API.API.Gen: _fd_name :: Field -> !Text
- Data.API.API.Gen: _fd_readonly :: Field -> !Bool
- Data.API.API.Gen: _fd_type :: Field -> !APIType
- Data.API.API.Gen: _ir_hi :: IntRange -> !(Maybe Int)
- Data.API.API.Gen: _ir_lo :: IntRange -> !(Maybe Int)
- Data.API.API.Gen: _sn_filter :: SpecNewtype -> !(Maybe Filter)
- Data.API.API.Gen: _sn_type :: SpecNewtype -> !BasicType
- Data.API.API.Gen: _ur_hi :: UTCRange -> !(Maybe UTCTime)
- Data.API.API.Gen: _ur_lo :: UTCRange -> !(Maybe UTCTime)
- Data.API.API.Gen: apiAPISimpleTests :: [(String, Property)]
- Data.API.API.Gen: instance Arbitrary APINode
- Data.API.API.Gen: instance Arbitrary APIType
- Data.API.API.Gen: instance Arbitrary BasicType
- Data.API.API.Gen: instance Arbitrary Conversion
- Data.API.API.Gen: instance Arbitrary DefaultValue
- Data.API.API.Gen: instance Arbitrary Field
- Data.API.API.Gen: instance Arbitrary Filter
- Data.API.API.Gen: instance Arbitrary IntRange
- Data.API.API.Gen: instance Arbitrary RegularExpression
- Data.API.API.Gen: instance Arbitrary Spec
- Data.API.API.Gen: instance Arbitrary SpecNewtype
- Data.API.API.Gen: instance Arbitrary TypeRef
- Data.API.API.Gen: instance Arbitrary UTCRange
- Data.API.API.Gen: instance Bounded BasicType
- Data.API.API.Gen: instance Enum BasicType
- Data.API.API.Gen: instance Eq APINode
- Data.API.API.Gen: instance Eq APIType
- Data.API.API.Gen: instance Eq BasicType
- Data.API.API.Gen: instance Eq Conversion
- Data.API.API.Gen: instance Eq DefaultValue
- Data.API.API.Gen: instance Eq Field
- Data.API.API.Gen: instance Eq Filter
- Data.API.API.Gen: instance Eq IntRange
- Data.API.API.Gen: instance Eq RegularExpression
- Data.API.API.Gen: instance Eq Spec
- Data.API.API.Gen: instance Eq SpecNewtype
- Data.API.API.Gen: instance Eq TypeRef
- Data.API.API.Gen: instance Eq UTCRange
- Data.API.API.Gen: instance Example APINode
- Data.API.API.Gen: instance Example APIType
- Data.API.API.Gen: instance Example BasicType
- Data.API.API.Gen: instance Example Conversion
- Data.API.API.Gen: instance Example DefaultValue
- Data.API.API.Gen: instance Example Field
- Data.API.API.Gen: instance Example Filter
- Data.API.API.Gen: instance Example IntRange
- Data.API.API.Gen: instance Example RegularExpression
- Data.API.API.Gen: instance Example Spec
- Data.API.API.Gen: instance Example SpecNewtype
- Data.API.API.Gen: instance Example TypeRef
- Data.API.API.Gen: instance Example UTCRange
- Data.API.API.Gen: instance FromJSON APINode
- Data.API.API.Gen: instance FromJSON APIType
- Data.API.API.Gen: instance FromJSON BasicType
- Data.API.API.Gen: instance FromJSON Conversion
- Data.API.API.Gen: instance FromJSON DefaultValue
- Data.API.API.Gen: instance FromJSON Field
- Data.API.API.Gen: instance FromJSON Filter
- Data.API.API.Gen: instance FromJSON IntRange
- Data.API.API.Gen: instance FromJSON RegularExpression
- Data.API.API.Gen: instance FromJSON Spec
- Data.API.API.Gen: instance FromJSON SpecNewtype
- Data.API.API.Gen: instance FromJSON TypeRef
- Data.API.API.Gen: instance FromJSON UTCRange
- Data.API.API.Gen: instance FromJSONWithErrs APINode
- Data.API.API.Gen: instance FromJSONWithErrs APIType
- Data.API.API.Gen: instance FromJSONWithErrs BasicType
- Data.API.API.Gen: instance FromJSONWithErrs Conversion
- Data.API.API.Gen: instance FromJSONWithErrs DefaultValue
- Data.API.API.Gen: instance FromJSONWithErrs Field
- Data.API.API.Gen: instance FromJSONWithErrs Filter
- Data.API.API.Gen: instance FromJSONWithErrs IntRange
- Data.API.API.Gen: instance FromJSONWithErrs RegularExpression
- Data.API.API.Gen: instance FromJSONWithErrs Spec
- Data.API.API.Gen: instance FromJSONWithErrs SpecNewtype
- Data.API.API.Gen: instance FromJSONWithErrs TypeRef
- Data.API.API.Gen: instance FromJSONWithErrs UTCRange
- Data.API.API.Gen: instance IsString RegularExpression
- Data.API.API.Gen: instance IsString TypeRef
- Data.API.API.Gen: instance Ord BasicType
- Data.API.API.Gen: instance Ord RegularExpression
- Data.API.API.Gen: instance Ord TypeRef
- Data.API.API.Gen: instance SafeCopy APINode
- Data.API.API.Gen: instance SafeCopy APIType
- Data.API.API.Gen: instance SafeCopy BasicType
- Data.API.API.Gen: instance SafeCopy Conversion
- Data.API.API.Gen: instance SafeCopy DefaultValue
- Data.API.API.Gen: instance SafeCopy Field
- Data.API.API.Gen: instance SafeCopy Filter
- Data.API.API.Gen: instance SafeCopy IntRange
- Data.API.API.Gen: instance SafeCopy RegularExpression
- Data.API.API.Gen: instance SafeCopy Spec
- Data.API.API.Gen: instance SafeCopy SpecNewtype
- Data.API.API.Gen: instance SafeCopy TypeRef
- Data.API.API.Gen: instance SafeCopy UTCRange
- Data.API.API.Gen: instance Show APINode
- Data.API.API.Gen: instance Show APIType
- Data.API.API.Gen: instance Show BasicType
- Data.API.API.Gen: instance Show Conversion
- Data.API.API.Gen: instance Show DefaultValue
- Data.API.API.Gen: instance Show Field
- Data.API.API.Gen: instance Show Filter
- Data.API.API.Gen: instance Show IntRange
- Data.API.API.Gen: instance Show RegularExpression
- Data.API.API.Gen: instance Show Spec
- Data.API.API.Gen: instance Show SpecNewtype
- Data.API.API.Gen: instance Show TypeRef
- Data.API.API.Gen: instance Show UTCRange
- Data.API.API.Gen: instance ToJSON APINode
- Data.API.API.Gen: instance ToJSON APIType
- Data.API.API.Gen: instance ToJSON BasicType
- Data.API.API.Gen: instance ToJSON Conversion
- Data.API.API.Gen: instance ToJSON DefaultValue
- Data.API.API.Gen: instance ToJSON Field
- Data.API.API.Gen: instance ToJSON Filter
- Data.API.API.Gen: instance ToJSON IntRange
- Data.API.API.Gen: instance ToJSON RegularExpression
- Data.API.API.Gen: instance ToJSON Spec
- Data.API.API.Gen: instance ToJSON SpecNewtype
- Data.API.API.Gen: instance ToJSON TypeRef
- Data.API.API.Gen: instance ToJSON UTCRange
- Data.API.API.Gen: instance Typeable APINode
- Data.API.API.Gen: instance Typeable APIType
- Data.API.API.Gen: instance Typeable BasicType
- Data.API.API.Gen: instance Typeable Conversion
- Data.API.API.Gen: instance Typeable DefaultValue
- Data.API.API.Gen: instance Typeable Field
- Data.API.API.Gen: instance Typeable Filter
- Data.API.API.Gen: instance Typeable IntRange
- Data.API.API.Gen: instance Typeable RegularExpression
- Data.API.API.Gen: instance Typeable Spec
- Data.API.API.Gen: instance Typeable SpecNewtype
- Data.API.API.Gen: instance Typeable TypeRef
- Data.API.API.Gen: instance Typeable UTCRange
- Data.API.Changes: afBadDefault :: ApplyFailure -> DefaultValue
- Data.API.Changes: afCustomMessage :: ApplyFailure -> String
- Data.API.Changes: afDecl :: ApplyFailure -> NormTypeDecl
- Data.API.Changes: afExistingField :: ApplyFailure -> FieldName
- Data.API.Changes: afExistingType :: ApplyFailure -> TypeName
- Data.API.Changes: afExpectedKind :: ApplyFailure -> TypeKind
- Data.API.Changes: afFieldName :: ApplyFailure -> FieldName
- Data.API.Changes: afFieldType :: ApplyFailure -> APIType
- Data.API.Changes: afMissingField :: ApplyFailure -> FieldName
- Data.API.Changes: afMissingType :: ApplyFailure -> TypeName
- Data.API.Changes: afMissingTypes :: ApplyFailure -> Set TypeName
- Data.API.Changes: afType :: ApplyFailure -> APIType
- Data.API.Changes: afTypeKind :: ApplyFailure -> TypeKind
- Data.API.Changes: afTypeName :: ApplyFailure -> TypeName
- Data.API.Changes: databaseMigration :: CustomMigrations db ty fld -> db -> Object -> Either ValueError Object
- Data.API.Changes: databaseMigrationSchema :: CustomMigrations db ty fld -> db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)
- Data.API.Changes: fieldMigration :: CustomMigrations db ty fld -> fld -> Value -> Either ValueError Value
- Data.API.Changes: instance (Eq a, Eq b) => Eq (MergeResult a b)
- Data.API.Changes: instance (Show a, Show b) => Show (MergeResult a b)
- Data.API.Changes: instance Eq APIChange
- Data.API.Changes: instance Eq APIChangelog
- Data.API.Changes: instance Eq APITableChange
- Data.API.Changes: instance Eq ApplyFailure
- Data.API.Changes: instance Eq DataChecks
- Data.API.Changes: instance Eq MigrateFailure
- Data.API.Changes: instance Eq TypeKind
- Data.API.Changes: instance Eq UpdateDeclPos
- Data.API.Changes: instance Eq UpdateTypePos
- Data.API.Changes: instance Eq ValidateFailure
- Data.API.Changes: instance Eq ValueError
- Data.API.Changes: instance Eq VersionExtra
- Data.API.Changes: instance Ord DataChecks
- Data.API.Changes: instance Ord VersionExtra
- Data.API.Changes: instance PP TypeKind
- Data.API.Changes: instance PP VersionExtra
- Data.API.Changes: instance PPLines APIChange
- Data.API.Changes: instance PPLines APITableChange
- Data.API.Changes: instance PPLines ApplyFailure
- Data.API.Changes: instance PPLines MigrateFailure
- Data.API.Changes: instance PPLines ValidateFailure
- Data.API.Changes: instance PPLines ValueError
- Data.API.Changes: instance Show APIChange
- Data.API.Changes: instance Show APIChangelog
- Data.API.Changes: instance Show APITableChange
- Data.API.Changes: instance Show ApplyFailure
- Data.API.Changes: instance Show MigrateFailure
- Data.API.Changes: instance Show TypeKind
- Data.API.Changes: instance Show UpdateDeclPos
- Data.API.Changes: instance Show UpdateTypePos
- Data.API.Changes: instance Show ValidateFailure
- Data.API.Changes: instance Show ValidateWarning
- Data.API.Changes: instance Show ValueError
- Data.API.Changes: instance Show VersionExtra
- Data.API.Changes: typeMigration :: CustomMigrations db ty fld -> ty -> Value -> Either ValueError Value
- Data.API.Changes: typeMigrationSchema :: CustomMigrations db ty fld -> ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)
- Data.API.Changes: vfApplyFailure :: ValidateFailure -> ApplyFailure
- Data.API.Changes: vfChangelogVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfDifferences :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
- Data.API.Changes: vfEarlierVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfFailedToApply :: ValidateFailure -> APIChange
- Data.API.Changes: vfFromVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfInvalidVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfLaterVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfMissingDeclarations :: ValidateFailure -> Set TypeName
- Data.API.Changes: vfSuccessfullyApplied :: ValidateFailure -> [APITableChange]
- Data.API.Changes: vfTargetVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfToVersion :: ValidateFailure -> VersionExtra
- Data.API.Doc: call_auth_required :: Call -> Bool
- Data.API.Doc: call_body :: Call -> Maybe (APIType, String)
- Data.API.Doc: call_description :: Call -> String
- Data.API.Doc: call_headers :: Call -> [Header]
- Data.API.Doc: call_http_method :: Call -> HTTPMethod
- Data.API.Doc: call_params :: Call -> [Param]
- Data.API.Doc: call_path :: Call -> [String]
- Data.API.Doc: call_samples :: Call -> [Sample]
- Data.API.Doc: call_views :: Call -> [View]
- Data.API.Doc: doc_info_call_url :: DocInfo -> HTTPMethod -> [String] -> URL
- Data.API.Doc: doc_info_type_url :: DocInfo -> TypeName -> URL
- Data.API.Doc: header_desc :: Header -> String
- Data.API.Doc: header_expl :: Header -> String
- Data.API.Doc: header_name :: Header -> String
- Data.API.Doc: header_required :: Header -> Bool
- Data.API.Doc: header_type :: Header -> APIType
- Data.API.Doc: param_desc :: Param -> String
- Data.API.Doc: param_expl :: Param -> String
- Data.API.Doc: param_name :: Param -> String
- Data.API.Doc: param_required :: Param -> Bool
- Data.API.Doc: param_type :: Param -> Either String APIType
- Data.API.Doc: sample_response :: Sample -> Maybe String
- Data.API.Doc: sample_status :: Sample -> StatusCode
- Data.API.Doc: sample_type :: Sample -> Body APIType
- Data.API.Doc: view_doc :: View -> String
- Data.API.Doc: view_id :: View -> String
- Data.API.Doc: view_params :: View -> [Param]
- Data.API.Doc: view_type :: View -> APIType
- Data.API.JSON: instance Alternative ParserWithErrs
- Data.API.JSON: instance Applicative ParserWithErrs
- Data.API.JSON: instance Eq Expected
- Data.API.JSON: instance Eq FormatExpected
- Data.API.JSON: instance Eq JSONError
- Data.API.JSON: instance Eq Step
- Data.API.JSON: instance FromJSON Expected
- Data.API.JSON: instance FromJSON FormatExpected
- Data.API.JSON: instance FromJSON JSONError
- Data.API.JSON: instance FromJSON Step
- Data.API.JSON: instance FromJSONWithErrs ()
- Data.API.JSON: instance FromJSONWithErrs Binary
- Data.API.JSON: instance FromJSONWithErrs Bool
- Data.API.JSON: instance FromJSONWithErrs Int
- Data.API.JSON: instance FromJSONWithErrs Integer
- Data.API.JSON: instance FromJSONWithErrs Text
- Data.API.JSON: instance FromJSONWithErrs UTCTime
- Data.API.JSON: instance FromJSONWithErrs Value
- Data.API.JSON: instance FromJSONWithErrs Version
- Data.API.JSON: instance FromJSONWithErrs a => FromJSONWithErrs (Maybe a)
- Data.API.JSON: instance FromJSONWithErrs a => FromJSONWithErrs [a]
- Data.API.JSON: instance Functor ParserWithErrs
- Data.API.JSON: instance Monad ParserWithErrs
- Data.API.JSON: instance SafeCopy Step
- Data.API.JSON: instance Show Expected
- Data.API.JSON: instance Show FormatExpected
- Data.API.JSON: instance Show JSONError
- Data.API.JSON: instance Show Step
- Data.API.JSON: instance ToJSON Expected
- Data.API.JSON: instance ToJSON FormatExpected
- Data.API.JSON: instance ToJSON JSONError
- Data.API.JSON: instance ToJSON Step
- Data.API.Markdown: mdmFieldDefault :: MarkdownMethods -> FieldName -> APIType -> Maybe DefaultValue
- Data.API.Markdown: mdmLink :: MarkdownMethods -> TypeName -> MDComment
- Data.API.Markdown: mdmPp :: MarkdownMethods -> MDComment -> MDComment -> MDComment
- Data.API.Markdown: mdmSummaryPostfix :: MarkdownMethods -> TypeName -> MDComment
- Data.API.NormalForm: instance Eq NormTypeDecl
- Data.API.NormalForm: instance PPLines NormTypeDecl
- Data.API.NormalForm: instance Show NormTypeDecl
- Data.API.PP: instance (PPLines s, PPLines t) => PPLines (s, t)
- Data.API.PP: instance PP APIType
- Data.API.PP: instance PP BasicType
- Data.API.PP: instance PP DefaultValue
- Data.API.PP: instance PP FieldName
- Data.API.PP: instance PP Text
- Data.API.PP: instance PP TypeName
- Data.API.PP: instance PP Version
- Data.API.PP: instance PP [Char]
- Data.API.PP: instance PP t => PP (Set t)
- Data.API.PP: instance PPLines Step
- Data.API.PP: instance PPLines Value
- Data.API.PP: instance PPLines t => PPLines [t]
- Data.API.Tools.Combinators: instance Monoid (Tool a)
- Data.API.Tools.Example: instance Example Binary
- Data.API.Tools.Example: instance Example Bool
- Data.API.Tools.Example: instance Example Int
- Data.API.Tools.Example: instance Example Text
- Data.API.Tools.Example: instance Example UTCTime
- Data.API.Tools.Example: instance Example Value
- Data.API.Tools.Example: instance Example a => Example (Maybe a)
- Data.API.Tools.Example: instance Example a => Example [a]
- Data.API.Tools.QuickCheck: instance Arbitrary UTCTime
- Data.API.Tools.SafeCopy: instance SafeCopy Binary
- Data.API.Types: _Binary :: Binary -> ByteString
- Data.API.Types: _FieldName :: FieldName -> String
- Data.API.Types: _TypeName :: TypeName -> String
- Data.API.Types: anComment :: APINode -> MDComment
- Data.API.Types: anConvert :: APINode -> Conversion
- Data.API.Types: anName :: APINode -> TypeName
- Data.API.Types: anPrefix :: APINode -> Prefix
- Data.API.Types: anSpec :: APINode -> Spec
- Data.API.Types: ftComment :: FieldType -> MDComment
- Data.API.Types: ftDefault :: FieldType -> Maybe DefaultValue
- Data.API.Types: ftReadOnly :: FieldType -> Bool
- Data.API.Types: ftType :: FieldType -> APIType
- Data.API.Types: instance Arbitrary Binary
- Data.API.Types: instance Arbitrary Text
- Data.API.Types: instance Eq APIType
- Data.API.Types: instance Eq BasicType
- Data.API.Types: instance Eq Binary
- Data.API.Types: instance Eq DefaultValue
- Data.API.Types: instance Eq FieldName
- Data.API.Types: instance Eq IntRange
- Data.API.Types: instance Eq RegEx
- Data.API.Types: instance Eq TypeName
- Data.API.Types: instance Eq UTCRange
- Data.API.Types: instance FromJSON APINode
- Data.API.Types: instance FromJSON APIType
- Data.API.Types: instance FromJSON BasicType
- Data.API.Types: instance FromJSON Binary
- Data.API.Types: instance FromJSON DefaultValue
- Data.API.Types: instance FromJSON FieldName
- Data.API.Types: instance FromJSON FieldType
- Data.API.Types: instance FromJSON Filter
- Data.API.Types: instance FromJSON IntRange
- Data.API.Types: instance FromJSON RegEx
- Data.API.Types: instance FromJSON Spec
- Data.API.Types: instance FromJSON SpecEnum
- Data.API.Types: instance FromJSON SpecNewtype
- Data.API.Types: instance FromJSON SpecRecord
- Data.API.Types: instance FromJSON SpecUnion
- Data.API.Types: instance FromJSON Thing
- Data.API.Types: instance FromJSON TypeName
- Data.API.Types: instance FromJSON UTCRange
- Data.API.Types: instance FromJSON s0 => FromJSON (CI s0)
- Data.API.Types: instance IsString APIType
- Data.API.Types: instance IsString FieldName
- Data.API.Types: instance IsString TypeName
- Data.API.Types: instance Lift DefaultValue
- Data.API.Types: instance Lift IntRange
- Data.API.Types: instance Lift RegEx
- Data.API.Types: instance Lift UTCRange
- Data.API.Types: instance NFData Binary
- Data.API.Types: instance Ord Binary
- Data.API.Types: instance Ord FieldName
- Data.API.Types: instance Ord TypeName
- Data.API.Types: instance Show APINode
- Data.API.Types: instance Show APIType
- Data.API.Types: instance Show BasicType
- Data.API.Types: instance Show Binary
- Data.API.Types: instance Show DefaultValue
- Data.API.Types: instance Show FieldName
- Data.API.Types: instance Show FieldType
- Data.API.Types: instance Show Filter
- Data.API.Types: instance Show IntRange
- Data.API.Types: instance Show RegEx
- Data.API.Types: instance Show Spec
- Data.API.Types: instance Show SpecEnum
- Data.API.Types: instance Show SpecNewtype
- Data.API.Types: instance Show SpecRecord
- Data.API.Types: instance Show SpecUnion
- Data.API.Types: instance Show Thing
- Data.API.Types: instance Show TypeName
- Data.API.Types: instance Show UTCRange
- Data.API.Types: instance ToJSON APINode
- Data.API.Types: instance ToJSON APIType
- Data.API.Types: instance ToJSON BasicType
- Data.API.Types: instance ToJSON Binary
- Data.API.Types: instance ToJSON DefaultValue
- Data.API.Types: instance ToJSON FieldName
- Data.API.Types: instance ToJSON FieldType
- Data.API.Types: instance ToJSON Filter
- Data.API.Types: instance ToJSON IntRange
- Data.API.Types: instance ToJSON RegEx
- Data.API.Types: instance ToJSON Spec
- Data.API.Types: instance ToJSON SpecEnum
- Data.API.Types: instance ToJSON SpecNewtype
- Data.API.Types: instance ToJSON SpecRecord
- Data.API.Types: instance ToJSON SpecUnion
- Data.API.Types: instance ToJSON Thing
- Data.API.Types: instance ToJSON TypeName
- Data.API.Types: instance ToJSON UTCRange
- Data.API.Types: instance ToJSON s0 => ToJSON (CI s0)
- Data.API.Types: ir_hi :: IntRange -> Maybe Int
- Data.API.Types: ir_lo :: IntRange -> Maybe Int
- Data.API.Types: re_regex :: RegEx -> Regex
- Data.API.Types: re_text :: RegEx -> Text
- Data.API.Types: seAlts :: SpecEnum -> [(FieldName, MDComment)]
- Data.API.Types: snFilter :: SpecNewtype -> Maybe Filter
- Data.API.Types: snType :: SpecNewtype -> BasicType
- Data.API.Types: srFields :: SpecRecord -> [(FieldName, FieldType)]
- Data.API.Types: suFields :: SpecUnion -> [(FieldName, (APIType, MDComment))]
- Data.API.Types: ur_hi :: UTCRange -> Maybe UTCTime
- Data.API.Types: ur_lo :: UTCRange -> Maybe UTCTime
+ Data.API.API: convertAPI :: API -> APISpec
+ Data.API.API: instance Data.API.JSON.FromJSONWithErrs Data.API.Types.Thing
+ Data.API.API: unconvertAPI :: APISpec -> API
+ Data.API.API.DSL: apiAPI :: API
+ Data.API.API.Gen: [_RegularExpression] :: RegularExpression -> Text
+ Data.API.API.Gen: [_TypeRef] :: TypeRef -> Text
+ Data.API.API.Gen: [_an_comment] :: APINode -> !Text
+ Data.API.API.Gen: [_an_convert] :: APINode -> !(Maybe Conversion)
+ Data.API.API.Gen: [_an_name] :: APINode -> !Text
+ Data.API.API.Gen: [_an_prefix] :: APINode -> !Text
+ Data.API.API.Gen: [_an_spec] :: APINode -> !Spec
+ Data.API.API.Gen: [_cv_injection] :: Conversion -> !Text
+ Data.API.API.Gen: [_cv_projection] :: Conversion -> !Text
+ Data.API.API.Gen: [_fd_comment] :: Field -> !Text
+ Data.API.API.Gen: [_fd_default] :: Field -> !(Maybe DefaultValue)
+ Data.API.API.Gen: [_fd_name] :: Field -> !Text
+ Data.API.API.Gen: [_fd_readonly] :: Field -> !Bool
+ Data.API.API.Gen: [_fd_type] :: Field -> !APIType
+ Data.API.API.Gen: [_ir_hi] :: IntRange -> !(Maybe Int)
+ Data.API.API.Gen: [_ir_lo] :: IntRange -> !(Maybe Int)
+ Data.API.API.Gen: [_sn_filter] :: SpecNewtype -> !(Maybe Filter)
+ Data.API.API.Gen: [_sn_type] :: SpecNewtype -> !BasicType
+ Data.API.API.Gen: [_ur_hi] :: UTCRange -> !(Maybe UTCTime)
+ Data.API.API.Gen: [_ur_lo] :: UTCRange -> !(Maybe UTCTime)
+ Data.API.API.Gen: apiAPITestsCBOR :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsCBORToJSON :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsJSON :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsJSONToCBOR :: [(String, Property)]
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.String.IsString Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.String.IsString Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Field
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Enum.Bounded Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Enum.Enum Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Field
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.UTCRange
+ Data.API.Changes: [afBadDefault] :: ApplyFailure -> DefaultValue
+ Data.API.Changes: [afCustomMessage] :: ApplyFailure -> String
+ Data.API.Changes: [afDecl] :: ApplyFailure -> NormTypeDecl
+ Data.API.Changes: [afExistingField] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afExistingType] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afExpectedKind] :: ApplyFailure -> TypeKind
+ Data.API.Changes: [afFieldName] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afFieldType] :: ApplyFailure -> APIType
+ Data.API.Changes: [afMissingField] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afMissingType] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afMissingTypes] :: ApplyFailure -> Set TypeName
+ Data.API.Changes: [afTypeKind] :: ApplyFailure -> TypeKind
+ Data.API.Changes: [afTypeName] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afType] :: ApplyFailure -> APIType
+ Data.API.Changes: [databaseMigrationSchema] :: CustomMigrations o v db ty fld -> db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)
+ Data.API.Changes: [databaseMigration] :: CustomMigrations o v db ty fld -> db -> o -> Either ValueError o
+ Data.API.Changes: [fieldMigration] :: CustomMigrations o v db ty fld -> fld -> v -> Either ValueError v
+ Data.API.Changes: [typeMigrationSchema] :: CustomMigrations o v db ty fld -> ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)
+ Data.API.Changes: [typeMigration] :: CustomMigrations o v db ty fld -> ty -> v -> Either ValueError v
+ Data.API.Changes: [vfApplyFailure] :: ValidateFailure -> ApplyFailure
+ Data.API.Changes: [vfChangelogVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfDifferences] :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
+ Data.API.Changes: [vfEarlierVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfFailedToApply] :: ValidateFailure -> APIChange
+ Data.API.Changes: [vfFromVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfInvalidVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfLaterVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfMissingDeclarations] :: ValidateFailure -> Set TypeName
+ Data.API.Changes: [vfSuccessfullyApplied] :: ValidateFailure -> [APITableChange]
+ Data.API.Changes: [vfTargetVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfToVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: instance GHC.Classes.Eq Data.API.Changes.DataChecks
+ Data.API.Changes: instance GHC.Classes.Ord Data.API.Changes.DataChecks
+ Data.API.Changes: migrateDataDump' :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations Record Value db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
+ Data.API.Changes: mkRecordMigration' :: (Record -> Either ValueError Record) -> (Value -> Either ValueError Value)
+ Data.API.Changes.Types: APIChange :: NormAPI -> APIChange -> (Map TypeName UpdateDeclPos) -> APITableChange
+ Data.API.Changes.Types: ChAddEnumVal :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChAddField :: TypeName -> FieldName -> APIType -> (Maybe DefaultValue) -> APIChange
+ Data.API.Changes.Types: ChAddType :: TypeName -> NormTypeDecl -> APIChange
+ Data.API.Changes.Types: ChAddUnionAlt :: TypeName -> FieldName -> APIType -> APIChange
+ Data.API.Changes.Types: ChChangeField :: TypeName -> FieldName -> APIType -> MigrationTag -> APIChange
+ Data.API.Changes.Types: ChCustomAll :: MigrationTag -> APIChange
+ Data.API.Changes.Types: ChCustomType :: TypeName -> MigrationTag -> APIChange
+ Data.API.Changes.Types: ChDeleteEnumVal :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChDeleteField :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChDeleteType :: TypeName -> APIChange
+ Data.API.Changes.Types: ChDeleteUnionAlt :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameEnumVal :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameField :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameType :: TypeName -> TypeName -> APIChange
+ Data.API.Changes.Types: ChRenameUnionAlt :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChangesStart :: Version -> APIChangelog
+ Data.API.Changes.Types: ChangesUpTo :: VersionExtra -> [APIChange] -> APIChangelog -> APIChangelog
+ Data.API.Changes.Types: DevVersion :: VersionExtra
+ Data.API.Changes.Types: Release :: Version -> VersionExtra
+ Data.API.Changes.Types: UpdateHere :: (Maybe UpdateDeclPos) -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateList :: UpdateTypePos -> UpdateTypePos
+ Data.API.Changes.Types: UpdateMaybe :: UpdateTypePos -> UpdateTypePos
+ Data.API.Changes.Types: UpdateNamed :: TypeName -> UpdateTypePos
+ Data.API.Changes.Types: UpdateRecord :: (Map FieldName (Maybe UpdateTypePos)) -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateType :: UpdateTypePos -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateUnion :: (Map FieldName (Maybe UpdateTypePos)) -> UpdateDeclPos
+ Data.API.Changes.Types: ValidateData :: NormAPI -> APITableChange
+ Data.API.Changes.Types: data APIChange
+ Data.API.Changes.Types: data APIChangelog
+ Data.API.Changes.Types: data APITableChange
+ Data.API.Changes.Types: data UpdateDeclPos
+ Data.API.Changes.Types: data UpdateTypePos
+ Data.API.Changes.Types: data VersionExtra
+ Data.API.Changes.Types: instance Data.API.PP.PP Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance Data.API.PP.PPLines Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance Data.API.PP.PPLines Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APIChangelog
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.UpdateDeclPos
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.UpdateTypePos
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance GHC.Classes.Ord Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APIChangelog
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.UpdateDeclPos
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.UpdateTypePos
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: showVersionExtra :: VersionExtra -> String
+ Data.API.Changes.Types: type APIWithChangelog = (API, APIChangelog)
+ Data.API.Changes.Types: type MigrationTag = String
+ Data.API.Doc: [call_auth_required] :: Call -> Bool
+ Data.API.Doc: [call_body] :: Call -> Maybe (APIType, String)
+ Data.API.Doc: [call_description] :: Call -> String
+ Data.API.Doc: [call_headers] :: Call -> [Header]
+ Data.API.Doc: [call_http_method] :: Call -> HTTPMethod
+ Data.API.Doc: [call_params] :: Call -> [Param]
+ Data.API.Doc: [call_path] :: Call -> [String]
+ Data.API.Doc: [call_samples] :: Call -> [Sample]
+ Data.API.Doc: [call_views] :: Call -> [View]
+ Data.API.Doc: [doc_info_call_url] :: DocInfo -> HTTPMethod -> [String] -> URL
+ Data.API.Doc: [doc_info_type_url] :: DocInfo -> TypeName -> URL
+ Data.API.Doc: [header_desc] :: Header -> String
+ Data.API.Doc: [header_expl] :: Header -> String
+ Data.API.Doc: [header_name] :: Header -> String
+ Data.API.Doc: [header_required] :: Header -> Bool
+ Data.API.Doc: [header_type] :: Header -> APIType
+ Data.API.Doc: [param_desc] :: Param -> String
+ Data.API.Doc: [param_expl] :: Param -> String
+ Data.API.Doc: [param_name] :: Param -> String
+ Data.API.Doc: [param_required] :: Param -> Bool
+ Data.API.Doc: [param_type] :: Param -> Either String APIType
+ Data.API.Doc: [sample_response] :: Sample -> Maybe String
+ Data.API.Doc: [sample_status] :: Sample -> StatusCode
+ Data.API.Doc: [sample_type] :: Sample -> Body APIType
+ Data.API.Doc: [view_doc] :: View -> String
+ Data.API.Doc: [view_id] :: View -> String
+ Data.API.Doc: [view_params] :: View -> [Param]
+ Data.API.Doc: [view_type] :: View -> APIType
+ Data.API.Error: ApiInvalid :: VersionExtra -> Set TypeName -> ValidateFailure
+ Data.API.Error: BadFormat :: FormatExpected -> String -> Text -> JSONError
+ Data.API.Error: CannotDowngrade :: VersionExtra -> VersionExtra -> ValidateFailure
+ Data.API.Error: ChangelogEntryInvalid :: [APITableChange] -> APIChange -> ApplyFailure -> ValidateFailure
+ Data.API.Error: ChangelogIncomplete :: VersionExtra -> VersionExtra -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl) -> ValidateFailure
+ Data.API.Error: ChangelogOutOfOrder :: VersionExtra -> VersionExtra -> ValidateFailure
+ Data.API.Error: CustomMigrationError :: String -> Value -> ValueError
+ Data.API.Error: DeclMalformed :: TypeName -> NormTypeDecl -> Set TypeName -> ApplyFailure
+ Data.API.Error: DefaultMissing :: TypeName -> FieldName -> ApplyFailure
+ Data.API.Error: ExpArray :: Expected
+ Data.API.Error: ExpBool :: Expected
+ Data.API.Error: ExpInt :: Expected
+ Data.API.Error: ExpObject :: Expected
+ Data.API.Error: ExpString :: Expected
+ Data.API.Error: Expected :: Expected -> String -> Value -> JSONError
+ Data.API.Error: FieldBadDefaultValue :: TypeName -> FieldName -> APIType -> DefaultValue -> ApplyFailure
+ Data.API.Error: FieldDoesNotExist :: TypeName -> TypeKind -> FieldName -> ApplyFailure
+ Data.API.Error: FieldExists :: TypeName -> TypeKind -> FieldName -> ApplyFailure
+ Data.API.Error: FmtBinary :: FormatExpected
+ Data.API.Error: FmtOther :: FormatExpected
+ Data.API.Error: FmtUTC :: FormatExpected
+ Data.API.Error: InElem :: Int -> Step
+ Data.API.Error: InField :: Text -> Step
+ Data.API.Error: IntRangeError :: String -> Int -> IntRange -> JSONError
+ Data.API.Error: InvalidAPI :: ApplyFailure -> ValueError
+ Data.API.Error: JSONError :: JSONError -> ValueError
+ Data.API.Error: MissingAlt :: [String] -> JSONError
+ Data.API.Error: MissingField :: JSONError
+ Data.API.Error: RegexError :: String -> Text -> RegEx -> JSONError
+ Data.API.Error: SyntaxError :: String -> JSONError
+ Data.API.Error: TKEnum :: TypeKind
+ Data.API.Error: TKNewtype :: TypeKind
+ Data.API.Error: TKRecord :: TypeKind
+ Data.API.Error: TKTypeSynonym :: TypeKind
+ Data.API.Error: TKUnion :: TypeKind
+ Data.API.Error: TableChangeError :: String -> ApplyFailure
+ Data.API.Error: TypeDoesNotExist :: TypeName -> ApplyFailure
+ Data.API.Error: TypeExists :: TypeName -> ApplyFailure
+ Data.API.Error: TypeInUse :: TypeName -> ApplyFailure
+ Data.API.Error: TypeMalformed :: APIType -> Set TypeName -> ApplyFailure
+ Data.API.Error: TypeWrongKind :: TypeName -> TypeKind -> ApplyFailure
+ Data.API.Error: UTCRangeError :: String -> UTCTime -> UTCRange -> JSONError
+ Data.API.Error: UnexpectedEnumVal :: [Text] -> Text -> JSONError
+ Data.API.Error: UnexpectedField :: JSONError
+ Data.API.Error: ValidateFailure :: ValidateFailure -> MigrateFailure
+ Data.API.Error: ValueError :: ValueError -> Position -> MigrateFailure
+ Data.API.Error: [afBadDefault] :: ApplyFailure -> DefaultValue
+ Data.API.Error: [afCustomMessage] :: ApplyFailure -> String
+ Data.API.Error: [afDecl] :: ApplyFailure -> NormTypeDecl
+ Data.API.Error: [afExistingField] :: ApplyFailure -> FieldName
+ Data.API.Error: [afExistingType] :: ApplyFailure -> TypeName
+ Data.API.Error: [afExpectedKind] :: ApplyFailure -> TypeKind
+ Data.API.Error: [afFieldName] :: ApplyFailure -> FieldName
+ Data.API.Error: [afFieldType] :: ApplyFailure -> APIType
+ Data.API.Error: [afMissingField] :: ApplyFailure -> FieldName
+ Data.API.Error: [afMissingType] :: ApplyFailure -> TypeName
+ Data.API.Error: [afMissingTypes] :: ApplyFailure -> Set TypeName
+ Data.API.Error: [afTypeKind] :: ApplyFailure -> TypeKind
+ Data.API.Error: [afTypeName] :: ApplyFailure -> TypeName
+ Data.API.Error: [afType] :: ApplyFailure -> APIType
+ Data.API.Error: [vfApplyFailure] :: ValidateFailure -> ApplyFailure
+ Data.API.Error: [vfChangelogVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfDifferences] :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
+ Data.API.Error: [vfEarlierVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfFailedToApply] :: ValidateFailure -> APIChange
+ Data.API.Error: [vfFromVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfInvalidVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfLaterVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfMissingDeclarations] :: ValidateFailure -> Set TypeName
+ Data.API.Error: [vfSuccessfullyApplied] :: ValidateFailure -> [APITableChange]
+ Data.API.Error: [vfTargetVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfToVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: badFormat :: String -> Text -> JSONError
+ Data.API.Error: data ApplyFailure
+ Data.API.Error: data Expected
+ Data.API.Error: data FormatExpected
+ Data.API.Error: data JSONError
+ Data.API.Error: data MigrateFailure
+ Data.API.Error: data Step
+ Data.API.Error: data TypeKind
+ Data.API.Error: data ValidateFailure
+ Data.API.Error: data ValidateWarning
+ Data.API.Error: data ValueError
+ Data.API.Error: expectedArray :: Value -> JSONError
+ Data.API.Error: expectedBool :: Value -> JSONError
+ Data.API.Error: expectedInt :: Value -> JSONError
+ Data.API.Error: expectedObject :: Value -> JSONError
+ Data.API.Error: expectedString :: Value -> JSONError
+ Data.API.Error: inField :: FieldName -> Step
+ Data.API.Error: instance Data.API.PP.PP Data.API.Error.TypeKind
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ApplyFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.MigrateFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.Step
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ValidateFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ValueError
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.Expected
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.FormatExpected
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.JSONError
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.Step
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.Expected
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.FormatExpected
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.JSONError
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.Step
+ Data.API.Error: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.Error.Step
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ApplyFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.Expected
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.FormatExpected
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.JSONError
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.MigrateFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.Step
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.TypeKind
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ValidateFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ValueError
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ApplyFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.Expected
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.FormatExpected
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.JSONError
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.MigrateFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.Step
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.TypeKind
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValidateFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValidateWarning
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValueError
+ Data.API.Error: prettyJSONError :: JSONError -> String
+ Data.API.Error: prettyJSONErrorPositions :: [(JSONError, Position)] -> String
+ Data.API.Error: prettyMigrateFailure :: MigrateFailure -> String
+ Data.API.Error: prettyStep :: Step -> String
+ Data.API.Error: prettyValidateFailure :: ValidateFailure -> String
+ Data.API.Error: prettyValueError :: ValueError -> String
+ Data.API.Error: prettyValueErrorPosition :: (ValueError, Position) -> String
+ Data.API.Error: type JSONWarning = JSONError
+ Data.API.Error: type MigrateWarning = ValidateWarning
+ Data.API.Error: type Position = [Step]
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs ()
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.API.Types.Binary
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Aeson.Types.Internal.Value
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Text.Internal.Text
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Time.Clock.UTC.UTCTime
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Version.Version
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Integer.Type.Integer
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Types.Bool
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Types.Int
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs a => Data.API.JSON.FromJSONWithErrs (GHC.Base.Maybe a)
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs a => Data.API.JSON.FromJSONWithErrs [a]
+ Data.API.JSON: instance GHC.Base.Alternative Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Applicative Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Functor Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Monad Data.API.JSON.ParserWithErrs
+ Data.API.JSONToCBOR: deserialiseJSONWithSchema :: API -> TypeName -> ByteString -> Value
+ Data.API.JSONToCBOR: jsonToCBORWithSchema :: API -> TypeName -> Value -> Term
+ Data.API.JSONToCBOR: postprocessJSON :: API -> TypeName -> Value -> Either ValueError Value
+ Data.API.JSONToCBOR: serialiseJSONWithSchema :: API -> TypeName -> Value -> ByteString
+ Data.API.Markdown: [mdmFieldDefault] :: MarkdownMethods -> FieldName -> APIType -> Maybe DefaultValue
+ Data.API.Markdown: [mdmLink] :: MarkdownMethods -> TypeName -> MDComment
+ Data.API.Markdown: [mdmPp] :: MarkdownMethods -> MDComment -> MDComment -> MDComment
+ Data.API.Markdown: [mdmSummaryPostfix] :: MarkdownMethods -> TypeName -> MDComment
+ Data.API.NormalForm: instance Control.DeepSeq.NFData Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance Data.API.PP.PPLines Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance GHC.Classes.Eq Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance GHC.Show.Show Data.API.NormalForm.NormTypeDecl
+ Data.API.PP: instance (Data.API.PP.PPLines s, Data.API.PP.PPLines t) => Data.API.PP.PPLines (s, t)
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.APIType
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.BasicType
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.DefaultValue
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.FieldName
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.TypeName
+ Data.API.PP: instance Data.API.PP.PP Data.Text.Internal.Text
+ Data.API.PP: instance Data.API.PP.PP Data.Version.Version
+ Data.API.PP: instance Data.API.PP.PP [GHC.Types.Char]
+ Data.API.PP: instance Data.API.PP.PP t => Data.API.PP.PP (Data.Set.Base.Set t)
+ Data.API.PP: instance Data.API.PP.PPLines Data.Aeson.Types.Internal.Value
+ Data.API.PP: instance Data.API.PP.PPLines t => Data.API.PP.PPLines [t]
+ Data.API.TH: fieldNameE :: FieldName -> ExpQ
+ Data.API.TH: fieldNameVarE :: FieldName -> ExpQ
+ Data.API.TH: mkNameText :: Text -> Name
+ Data.API.TH: typeNameE :: TypeName -> ExpQ
+ Data.API.Tools: cborGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: cborTestsTool :: Name -> APITool
+ Data.API.Tools: cborToJSONTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: cborTool :: APITool
+ Data.API.Tools: jsonGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: jsonToCBORTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.CBOR: cborTool :: APITool
+ Data.API.Tools.Combinators: instance GHC.Base.Monoid (Data.API.Tools.Combinators.Tool a)
+ Data.API.Tools.Datatypes: datatypesTool' :: (APINode -> [Name]) -> APITool
+ Data.API.Tools.Datatypes: defaultDerivedClasses :: APINode -> [Name]
+ Data.API.Tools.Datatypes: nodeFieldP :: APINode -> FieldName -> PatQ
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.API.Types.Binary
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Aeson.Types.Internal.Value
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Text.Internal.Text
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Time.Clock.UTC.UTCTime
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example GHC.Types.Bool
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example GHC.Types.Int
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example a => Data.API.Tools.Example.Example (GHC.Base.Maybe a)
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example a => Data.API.Tools.Example.Example [a]
+ Data.API.Tools.JSONTests: cborGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: cborTestsTool :: Name -> APITool
+ Data.API.Tools.JSONTests: cborToJSONTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: jsonGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: jsonToCBORTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: prop_cborRoundtrip :: forall a. (Eq a, Serialise a) => a -> Bool
+ Data.API.Tools.JSONTests: prop_cborToJSON :: forall a. (Eq a, Serialise a, ToJSON a) => API -> TypeName -> a -> Result
+ Data.API.Tools.JSONTests: prop_jsonToCBOR :: forall a. (Eq a, Serialise a, ToJSON a) => API -> TypeName -> a -> Result
+ Data.API.Tools.QuickCheck: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Time.Clock.UTC.UTCTime
+ Data.API.Types: [_Binary] :: Binary -> ByteString
+ Data.API.Types: [_FieldName] :: FieldName -> Text
+ Data.API.Types: [_TypeName] :: TypeName -> Text
+ Data.API.Types: [anComment] :: APINode -> MDComment
+ Data.API.Types: [anConvert] :: APINode -> Conversion
+ Data.API.Types: [anName] :: APINode -> TypeName
+ Data.API.Types: [anPrefix] :: APINode -> Prefix
+ Data.API.Types: [anSpec] :: APINode -> Spec
+ Data.API.Types: [ftComment] :: FieldType -> MDComment
+ Data.API.Types: [ftDefault] :: FieldType -> Maybe DefaultValue
+ Data.API.Types: [ftReadOnly] :: FieldType -> Bool
+ Data.API.Types: [ftType] :: FieldType -> APIType
+ Data.API.Types: [ir_hi] :: IntRange -> Maybe Int
+ Data.API.Types: [ir_lo] :: IntRange -> Maybe Int
+ Data.API.Types: [re_regex] :: RegEx -> Regex
+ Data.API.Types: [re_text] :: RegEx -> Text
+ Data.API.Types: [seAlts] :: SpecEnum -> [(FieldName, MDComment)]
+ Data.API.Types: [snFilter] :: SpecNewtype -> Maybe Filter
+ Data.API.Types: [snType] :: SpecNewtype -> BasicType
+ Data.API.Types: [srFields] :: SpecRecord -> [(FieldName, FieldType)]
+ Data.API.Types: [suFields] :: SpecUnion -> [(FieldName, (APIType, MDComment))]
+ Data.API.Types: [ur_hi] :: UTCRange -> Maybe UTCTime
+ Data.API.Types: [ur_lo] :: UTCRange -> Maybe UTCTime
+ Data.API.Types: base64ToBinary :: Text -> Either String Binary
+ Data.API.Types: instance Codec.Serialise.Class.Serialise Data.API.Types.Binary
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.APINode
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.APIType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.BasicType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Binary
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.DefaultValue
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.FieldName
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.FieldType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Filter
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.IntRange
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.RegEx
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Spec
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecEnum
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecNewtype
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecRecord
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecUnion
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Thing
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.TypeName
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.APINode
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.APIType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.BasicType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Binary
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.DefaultValue
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.FieldName
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.FieldType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Filter
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.IntRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.RegEx
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Spec
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecEnum
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecNewtype
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecRecord
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecUnion
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Thing
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.TypeName
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON s0 => Data.Aeson.Types.FromJSON.FromJSON (Data.CaseInsensitive.Internal.CI s0)
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.APINode
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.APIType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.BasicType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Binary
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.DefaultValue
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.FieldName
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.FieldType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Filter
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.IntRange
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.RegEx
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Spec
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecEnum
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecNewtype
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecRecord
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecUnion
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Thing
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.TypeName
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON s0 => Data.Aeson.Types.ToJSON.ToJSON (Data.CaseInsensitive.Internal.CI s0)
+ Data.API.Types: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.Types.Binary
+ Data.API.Types: instance Data.String.IsString Data.API.Types.APIType
+ Data.API.Types: instance Data.String.IsString Data.API.Types.FieldName
+ Data.API.Types: instance Data.String.IsString Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.APINode
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.APIType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.BasicType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Binary
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.DefaultValue
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.FieldType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Filter
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.IntRange
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.RegEx
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Spec
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecEnum
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecNewtype
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecRecord
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecUnion
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Thing
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.UTCRange
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.Binary
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.APINode
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.APIType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.BasicType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Binary
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.DefaultValue
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.FieldType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Filter
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.IntRange
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.RegEx
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Spec
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecEnum
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecNewtype
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecRecord
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecUnion
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Thing
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.UTCRange
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.APINode
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.APIType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.BasicType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.DefaultValue
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.FieldName
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.FieldType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Filter
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.IntRange
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.RegEx
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Spec
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecEnum
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecNewtype
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecRecord
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecUnion
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Thing
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.TypeName
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.UTCRange
+ Data.API.Types: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.Types.Binary
+ Data.API.Types: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Text.Internal.Text
+ Data.API.Utils: InBoth :: a -> b -> MergeResult a b
+ Data.API.Utils: OnlyInLeft :: a -> MergeResult a b
+ Data.API.Utils: OnlyInRight :: b -> MergeResult a b
+ Data.API.Utils: data MergeResult a b
+ Data.API.Utils: diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)
+ Data.API.Utils: instance (GHC.Classes.Eq b, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.API.Utils.MergeResult a b)
+ Data.API.Utils: instance (GHC.Show.Show b, GHC.Show.Show a) => GHC.Show.Show (Data.API.Utils.MergeResult a b)
+ Data.API.Utils: matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))
+ Data.API.Utils: mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)
+ Data.API.Value: Bool :: !Bool -> Value
+ Data.API.Value: Bytes :: !Binary -> Value
+ Data.API.Value: Enum :: !FieldName -> Value
+ Data.API.Value: Field :: FieldName -> Value -> Field
+ Data.API.Value: Int :: !Int -> Value
+ Data.API.Value: JSON :: !Value -> Value
+ Data.API.Value: List :: ![Value] -> Value
+ Data.API.Value: Maybe :: !(Maybe Value) -> Value
+ Data.API.Value: Record :: !Record -> Value
+ Data.API.Value: String :: !Text -> Value
+ Data.API.Value: UTCTime :: !UTCTime -> Value
+ Data.API.Value: Union :: !FieldName -> !Value -> Value
+ Data.API.Value: [fieldName] :: Field -> FieldName
+ Data.API.Value: [fieldValue] :: Field -> Value
+ Data.API.Value: arbitrary :: NormAPI -> Gen (APIType, Value)
+ Data.API.Value: arbitraryJSONValue :: Gen Value
+ Data.API.Value: arbitraryOfType :: NormAPI -> APIType -> Gen Value
+ Data.API.Value: data Field
+ Data.API.Value: data Value
+ Data.API.Value: decode :: NormAPI -> APIType -> Decoder s Value
+ Data.API.Value: deleteField :: FieldName -> Record -> Record
+ Data.API.Value: encode :: Value -> Encoding
+ Data.API.Value: expectEnum :: Value -> Position -> Either (ValueError, Position) FieldName
+ Data.API.Value: expectList :: Value -> Position -> Either (ValueError, Position) [Value]
+ Data.API.Value: expectMaybe :: Value -> Position -> Either (ValueError, Position) (Maybe Value)
+ Data.API.Value: expectRecord :: Value -> Position -> Either (ValueError, Position) Record
+ Data.API.Value: expectUnion :: Value -> Position -> Either (ValueError, Position) (FieldName, Value)
+ Data.API.Value: findField :: FieldName -> Record -> Maybe (Record, Value, Record)
+ Data.API.Value: fromDefaultValue :: NormAPI -> APIType -> DefaultValue -> Maybe Value
+ Data.API.Value: fromJSON :: NormAPI -> APIType -> Value -> Either [(JSONError, Position)] (Value, [(JSONWarning, Position)])
+ Data.API.Value: insertField :: FieldName -> Value -> Record -> Record
+ Data.API.Value: instance Control.DeepSeq.NFData Data.API.Value.Field
+ Data.API.Value: instance Control.DeepSeq.NFData Data.API.Value.Value
+ Data.API.Value: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Value.Value
+ Data.API.Value: instance GHC.Classes.Eq Data.API.Value.Field
+ Data.API.Value: instance GHC.Classes.Eq Data.API.Value.Value
+ Data.API.Value: instance GHC.Show.Show Data.API.Value.Field
+ Data.API.Value: instance GHC.Show.Show Data.API.Value.Value
+ Data.API.Value: joinRecords :: Record -> FieldName -> Value -> Record -> Record
+ Data.API.Value: lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl
+ Data.API.Value: mapToRecord :: Map FieldName Value -> Record
+ Data.API.Value: matchesNormAPI :: NormAPI -> APIType -> Value -> Position -> Either (ValueError, Position) ()
+ Data.API.Value: parseJSON :: NormAPI -> APIType -> Value -> ParserWithErrs Value
+ Data.API.Value: prop_cborGeneric :: Serialise a => API -> TypeName -> a -> Result
+ Data.API.Value: prop_cborRoundTrip :: NormAPI -> Property
+ Data.API.Value: prop_jsonGeneric :: ToJSON a => API -> TypeName -> a -> Result
+ Data.API.Value: prop_jsonRoundTrip :: NormAPI -> Property
+ Data.API.Value: recordToMap :: Record -> Map FieldName Value
+ Data.API.Value: renameField :: FieldName -> FieldName -> Record -> Record
+ Data.API.Value: type Record = [Field]
+ Data.Binary.Serialise.CBOR.Extra: (<$!>) :: Monad m => (a -> b) -> m a -> m b
+ Data.Binary.Serialise.CBOR.Extra: decodeListWith :: Decoder s a -> Decoder s [a]
+ Data.Binary.Serialise.CBOR.Extra: decodeMaybeWith :: Decoder s a -> Decoder s (Maybe a)
+ Data.Binary.Serialise.CBOR.Extra: decodeUnion :: [(Text, Decoder s a)] -> Decoder s a
+ Data.Binary.Serialise.CBOR.Extra: encodeListWith :: (a -> Encoding) -> [a] -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeMaybeWith :: (a -> Encoding) -> Maybe a -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeRecordFields :: [Encoding] -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeUnion :: Text -> Encoding -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: infixl 4 <$!>
+ Data.Binary.Serialise.CBOR.JSON: cborToJson :: Term -> Value
+ Data.Binary.Serialise.CBOR.JSON: decodeJSON :: Decoder s Value
+ Data.Binary.Serialise.CBOR.JSON: encodeJSON :: Value -> Encoding
+ Data.Binary.Serialise.CBOR.JSON: instance Codec.Serialise.Class.Serialise Data.Aeson.Types.Internal.Value
+ Data.Binary.Serialise.CBOR.JSON: jsonToCbor :: Value -> Term
- Data.API.Changes: CustomMigrations :: (db -> Object -> Either ValueError Object) -> (db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)) -> (ty -> Value -> Either ValueError Value) -> (ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)) -> (fld -> Value -> Either ValueError Value) -> CustomMigrations db ty fld
+ Data.API.Changes: CustomMigrations :: (db -> o -> Either ValueError o) -> (db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)) -> (ty -> v -> Either ValueError v) -> (ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)) -> (fld -> v -> Either ValueError v) -> CustomMigrations o v db ty fld
- Data.API.Changes: data CustomMigrations db ty fld
+ Data.API.Changes: data CustomMigrations o v db ty fld
- Data.API.Changes: migrateDataDump :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
+ Data.API.Changes: migrateDataDump :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations Object Value db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
- Data.API.Changes: validateChanges :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations db rec fld -> TypeName -> DataChecks -> Either ValidateFailure [ValidateWarning]
+ Data.API.Changes: validateChanges :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations o v db rec fld -> TypeName -> DataChecks -> Either ValidateFailure [ValidateWarning]
- Data.API.JSON: parseJSONWithErrs :: FromJSONWithErrs a => Value -> ParserWithErrs a
+ Data.API.JSON: parseJSONWithErrs :: (FromJSONWithErrs a, FromJSON a) => Value -> ParserWithErrs a
- Data.API.Tools.Example: example :: Example a => Gen a
+ Data.API.Tools.Example: example :: (Example a, Arbitrary a) => Gen a
- Data.API.Tools.JSONTests: prop_decodesTo :: (Eq a, FromJSONWithErrs a) => Value -> a -> Bool
+ Data.API.Tools.JSONTests: prop_decodesTo :: forall a. (Eq a, FromJSONWithErrs a) => Value -> a -> Bool
- Data.API.Tools.JSONTests: prop_decodesTo' :: (Eq a, FromJSONWithErrs a) => ParseFlags -> Value -> a -> Bool
+ Data.API.Tools.JSONTests: prop_decodesTo' :: forall a. (Eq a, FromJSONWithErrs a) => ParseFlags -> Value -> a -> Bool
- Data.API.Tools.JSONTests: prop_resultsMatchRoundtrip :: (Eq a, ToJSON a, FromJSONWithErrs a) => a -> Bool
+ Data.API.Tools.JSONTests: prop_resultsMatchRoundtrip :: forall a. (Eq a, ToJSON a, FromJSONWithErrs a) => a -> Bool
- Data.API.Types: FieldName :: String -> FieldName
+ Data.API.Types: FieldName :: Text -> FieldName
- Data.API.Types: TypeName :: String -> TypeName
+ Data.API.Types: TypeName :: Text -> TypeName

Files

api-tools.cabal view
@@ -1,5 +1,5 @@ Name:                api-tools-Version:             0.5.2+Version:             0.8.0.1 Synopsis:            DSL for generating API boilerplate and docs Description:         api-tools provides a compact DSL for describing an API.                      It uses Template Haskell to generate the@@ -25,24 +25,32 @@ Source-Repository this   Type:              git   Location:          git://github.com/iconnect/api-tools.git-  Tag:               0.5.2+  Tag:               0.8.0.0 +flag time15+  default: True+ Library   Hs-Source-Dirs:    src    Exposed-modules:         Data.API.API+        Data.API.API.DSL         Data.API.API.Gen         Data.API.Changes+        Data.API.Changes.Types         Data.API.Doc         Data.API.Doc.Subst+        Data.API.Error         Data.API.JSON+        Data.API.JSONToCBOR         Data.API.Markdown         Data.API.NormalForm         Data.API.Parse         Data.API.PP         Data.API.TH         Data.API.Tools+        Data.API.Tools.CBOR         Data.API.Tools.Combinators         Data.API.Tools.Datatypes         Data.API.Tools.DeepSeq@@ -57,38 +65,52 @@         Data.API.Tutorial         Data.API.Types         Data.API.Utils+        Data.API.Value+        Data.Binary.Serialise.CBOR.Extra+        Data.Binary.Serialise.CBOR.JSON    Other-modules:-        Data.API.API.DSL         Data.API.Doc.Call         Data.API.Doc.Dir         Data.API.Doc.Types         Data.API.Scan+        Data.API.TH.Compat    Build-depends:         Cabal                >= 1.4      && < 2    ,-        QuickCheck           >= 2.5.1    && < 2.8  ,-        aeson                >= 0.6.2    && < 0.9  ,-        aeson-pretty         >= 0.1      && < 0.8  ,+        QuickCheck           >= 2.5.1    && < 2.10 ,+        aeson                >= 0.10     && < 1.3  ,+        aeson-pretty         >= 0.1      && < 0.9  ,         array                >= 0.4      && < 0.6  ,-        attoparsec           >= 0.10.4   && < 0.13 ,+        attoparsec           >= 0.10.4   && < 0.14 ,         base                 >= 4        && < 5    ,+        base16-bytestring    >= 0.1      && < 0.2  ,         base64-bytestring    >= 1.0      && < 1.1  ,+        binary,         bytestring           >= 0.9      && < 0.11 ,         case-insensitive     >= 1.0      && < 1.3  ,+        cborg                >= 0.1.1.0  && < 0.2  ,         containers           >= 0.5      && < 0.6  ,-        deepseq              >= 1.1      && < 1.4  ,-        lens                 >= 3.8.7    && < 4.4  ,-        old-locale           >= 1.0.0.4  && < 1.1  ,+        deepseq              >= 1.1      && < 1.5  ,+        lens                 >= 3.8.7    && < 4.16 ,         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,         safe                 >= 0.3.3    && < 0.4  ,-        safecopy             >= 0.8.1    && < 0.9  ,-        time                 >= 1.4      && < 1.5  ,-        template-haskell     >= 2.7      && < 2.10 ,-        text                 >= 0.11.3   && < 1.2  ,+        safecopy             >= 0.8.1    && < 0.10 ,+        scientific           >= 0.3      && < 0.4  ,+        serialise            >= 0.1.0.0  && < 0.2  ,+        template-haskell     >= 2.7      && < 2.12 ,+        text                 >= 0.11.3   && < 1.3  ,         unordered-containers >= 0.2.3.0  && < 0.3  ,-        vector               >= 0.10.0.1 && < 0.11+        vector               >= 0.10.0.1 && < 0.12 +  if flag(time15)+    Build-depends:+        time                 >= 1.5.0    && < 1.7+  else+    Build-depends:+        old-locale           >= 1        && < 1.1,+        time                 >= 1.1.4    && < 1.5+   Build-tools:         alex,         happy@@ -107,26 +129,24 @@    Build-depends:         api-tools,-        QuickCheck           >= 2.5.1    && < 2.8  ,-        aeson                >= 0.6.2    && < 0.9  ,-        aeson-pretty         >= 0.1      && < 0.8  ,+        QuickCheck           >= 2.5.1    && < 2.10 ,+        aeson                                      ,+        aeson-pretty         >= 0.1      && < 0.9  ,         array                >= 0.4      && < 0.6  ,-        attoparsec           >= 0.10.4   && < 0.13 ,+        attoparsec           >= 0.10.4   && < 0.14 ,         base                 >= 4        && < 5    ,         base64-bytestring    >= 1.0      && < 1.1  ,         bytestring           >= 0.9      && < 0.11 ,         case-insensitive     >= 1.0      && < 1.3  ,         containers           >= 0.5      && < 0.6  ,-        lens                 >= 3.8.7    && < 4.4  ,-        old-locale           >= 1.0.0.4  && < 1.1  ,+        lens                 >= 3.8.7    && < 4.16 ,         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,         safe                 >= 0.3.3    && < 0.4  ,-        safecopy             >= 0.8.1    && < 0.9  ,-        time                 >= 1.4      && < 1.5  ,-        template-haskell     >= 2.7      && < 2.10 ,-        text                 >= 0.11.3   && < 1.2  ,+        safecopy             >= 0.8.1    && < 0.10 ,+        template-haskell     >= 2.7      && < 2.12 ,+        text                 >= 0.11.3   && < 1.3  ,         unordered-containers >= 0.2.3.0  && < 0.3  ,-        vector               >= 0.10.0.1 && < 0.11+        vector               >= 0.10.0.1 && < 0.12    GHC-Options:         -main-is Data.API.MigrationTool@@ -136,6 +156,45 @@   Default-Language: Haskell2010  +Executable perf-test+  Hs-Source-Dirs:    main++  Main-is:    Data/API/PerfTest.hs++  Build-depends:+        api-tools,+        QuickCheck           >= 2.5.1    && < 2.10 ,+        aeson                                      ,+        aeson-pretty         >= 0.1      && < 0.9  ,+        array                >= 0.4      && < 0.6  ,+        attoparsec           >= 0.10.4   && < 0.14 ,+        base                 >= 4        && < 5    ,+        base64-bytestring    >= 1.0      && < 1.1  ,+        bytestring           >= 0.9      && < 0.11 ,+        case-insensitive     >= 1.0      && < 1.3  ,+        cborg                >= 0.1.1.0  && < 0.2  ,+        containers           >= 0.5      && < 0.6  ,+        deepseq              >= 1.1      && < 1.5  ,+        lens                 >= 3.8.7    && < 4.16 ,+        regex-compat-tdfa    >= 0.95.1   && < 0.96 ,+        safe                 >= 0.3.3    && < 0.4  ,+        safecopy             >= 0.8.1    && < 0.10 ,+        serialise            >= 0.1.0.0  && < 0.2  ,+        template-haskell     >= 2.7      && < 2.12 ,+        text                 >= 0.11.3   && < 1.3  ,+        unordered-containers >= 0.2.3.0  && < 0.3  ,+        vector               >= 0.10.0.1 && < 0.12,+        time++  GHC-Options:+        -main-is Data.API.PerfTest+        -Wall+        -fwarn-tabs+        -rtsopts++  Default-Language: Haskell2010++ Test-Suite test-api-tools   Hs-Source-Dirs:    tests @@ -153,29 +212,30 @@   Build-depends:         api-tools,         Cabal                >= 1.4      && < 2    ,-        QuickCheck           >= 2.5.1    && < 2.8  ,-        aeson                >= 0.6.2    && < 0.9  ,-        aeson-pretty         >= 0.1      && < 0.8  ,+        QuickCheck           >= 2.5.1    && < 2.10 ,+        aeson                                      ,+        aeson-pretty         >= 0.1      && < 0.9  ,         array                >= 0.4      && < 0.6  ,-        attoparsec           >= 0.10.4   && < 0.13 ,+        attoparsec           >= 0.10.4   && < 0.14 ,         base                 >= 4        && < 5    ,         base64-bytestring    >= 1.0      && < 1.1  ,         bytestring           >= 0.9      && < 0.11 ,         case-insensitive     >= 1.0      && < 1.3  ,+        cborg                >= 0.1.1.0  && < 0.2  ,         containers           >= 0.5      && < 0.6  ,-        lens                 >= 3.8.7    && < 4.4  ,-        old-locale           >= 1.0.0.4  && < 1.1  ,+        lens                 >= 3.8.7    && < 4.16 ,         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,         safe                 >= 0.3.3    && < 0.4  ,-        safecopy             >= 0.8.1    && < 0.9  ,-        tasty                >= 0.3      && < 0.9  ,-        tasty-hunit          >= 0.2      && < 0.9  ,+        safecopy             >= 0.8.1    && < 0.10 ,+        serialise            >= 0.1.0.0  && < 0.2  ,+        tasty                >= 0.10.1   && < 0.12 ,+        tasty-hunit          >= 0.2      && < 10.0 ,         tasty-quickcheck     >= 0.3      && < 0.9  ,-        time                 >= 1.4      && < 1.5  ,-        template-haskell     >= 2.7      && < 2.10 ,-        text                 >= 0.11.3   && < 1.2  ,+        time,+        template-haskell     >= 2.7      && < 2.12 ,+        text                 >= 0.11.3   && < 1.3  ,         unordered-containers >= 0.2.3.0  && < 0.3  ,-        vector               >= 0.10.0.1 && < 0.11+        vector               >= 0.10.0.1 && < 0.12    GHC-Options:         -main-is Data.API.Test.Main
changelog view
@@ -1,5 +1,26 @@ -*-change-log-*- +0.8.0.1 Adam Gundry <adam@well-typed.com> October 2017+	* Silently truncate floating point numbers to integers++0.8.0.0 Mikolaj Konarski <mikolaj@well-typed.com> August 2017+	* Update to match the published cborg 0.1 API++0.7.0.1 Adam Gundry <adam@well-typed.com> April 2017+	* Add support for GHC 8.0 and drop 7.6+	* Tweak generated Markdown headers++0.7.0.0 Adam Gundry <adam@well-typed.com> January 2016+	* Implement more efficient data migrations+	* Change FieldName and TypeName to use Text instead of String+	* Adapt to changes in binary-serialise-cbor++0.6.0.1 Adam Gundry <adam@well-typed.com> October 2015+	* Support building on GHC 7.10.2 and relax dependencies++0.6 Adam Gundry <adam@well-typed.com> August 2015+	* Add tool to generate CBOR Serialise instances, and related code+ 0.5.2 Adam Gundry <adam@well-typed.com> December 2014 	* Fix bug in DeepSeq tool: records not reduced to normal form 	* Add instance for NFData Binary
− dist/build/Data/API/Parse.hs
@@ -1,1802 +0,0 @@-{-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE TemplateHaskell            #-}---module Data.API.Parse-    ( parseAPI-    , parseAPIWithChangelog-    , api-    , apiWithChangelog-    ) where--import           Data.API.Types-import           Data.API.Scan-import           Data.API.Changes-import           Data.Char-import           Data.String-import qualified Data.Text                  as T-import qualified Data.CaseInsensitive       as CI-import qualified Data.Version               as V-import           Distribution.Text (simpleParse)-import           Language.Haskell.TH-import           Language.Haskell.TH.Quote-import           Text.Printf-import           Text.Regex-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))---- parser produced by Happy Version 1.19.4--newtype HappyAbsSyn  = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn5 :: (APIWithChangelog) -> (HappyAbsSyn )-happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn5 #-}-happyOut5 :: (HappyAbsSyn ) -> (APIWithChangelog)-happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut5 #-}-happyIn6 :: (API) -> (HappyAbsSyn )-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn6 #-}-happyOut6 :: (HappyAbsSyn ) -> (API)-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut6 #-}-happyIn7 :: ([Thing]) -> (HappyAbsSyn )-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn ) -> ([Thing])-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Thing) -> (HappyAbsSyn )-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn ) -> (Thing)-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (APINode) -> (HappyAbsSyn )-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn ) -> (APINode)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (Spec) -> (HappyAbsSyn )-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn ) -> (Spec)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (Conversion) -> (HappyAbsSyn )-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn ) -> (Conversion)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (MDComment) -> (HappyAbsSyn )-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn ) -> (MDComment)-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: ([MDComment]) -> (HappyAbsSyn )-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn ) -> ([MDComment])-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (Prefix) -> (HappyAbsSyn )-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn ) -> (Prefix)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (SpecRecord) -> (HappyAbsSyn )-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn ) -> (SpecRecord)-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (SpecUnion) -> (HappyAbsSyn )-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn ) -> (SpecUnion)-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: ([(FieldName, FieldType)]) -> (HappyAbsSyn )-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn ) -> ([(FieldName, FieldType)])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (FieldType) -> (HappyAbsSyn )-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn ) -> (FieldType)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (Bool) -> (HappyAbsSyn )-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn ) -> (Bool)-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: ([(FieldName,(APIType,MDComment))]) -> (HappyAbsSyn )-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn ) -> ([(FieldName,(APIType,MDComment))])-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (SpecEnum) -> (HappyAbsSyn )-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn ) -> (SpecEnum)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: ([(FieldName,MDComment)]) -> (HappyAbsSyn )-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn ) -> ([(FieldName,MDComment)])-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (SpecNewtype) -> (HappyAbsSyn )-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn ) -> (SpecNewtype)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (Maybe Filter) -> (HappyAbsSyn )-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn ) -> (Maybe Filter)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (Filter) -> (HappyAbsSyn )-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn ) -> (Filter)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (RegEx) -> (HappyAbsSyn )-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn ) -> (RegEx)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (APIType) -> (HappyAbsSyn )-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn ) -> (APIType)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: (Maybe DefaultValue) -> (HappyAbsSyn )-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn ) -> (Maybe DefaultValue)-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (BasicType) -> (HappyAbsSyn )-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn ) -> (BasicType)-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: (FieldName) -> (HappyAbsSyn )-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn ) -> (FieldName)-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (String) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (String)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (TypeName) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (TypeName)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (APIChangelog) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (APIChangelog)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (V.Version) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> (V.Version)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: (VersionExtra) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> (VersionExtra)-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([APIChange]) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> ([APIChange])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([[APIChange]]) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> ([[APIChange]])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: ([APIChange]) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> ([APIChange])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([FieldChange]) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> ([FieldChange])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([FieldChange]) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> ([FieldChange])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: (Maybe DefaultValue) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> (Maybe DefaultValue)-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (DefaultValue) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (DefaultValue)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ([UnionChange]) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> ([UnionChange])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: ([UnionChange]) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> ([UnionChange])-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: ([EnumChange]) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> ([EnumChange])-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: ([EnumChange]) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> ([EnumChange])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (MigrationTag) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (MigrationTag)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyInTok :: (PToken) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (PToken)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\x00\x00\x00\x00\xf8\x00\x0c\x01\xe5\x00\xe5\x00\x47\x00\x01\x01\x08\x01\xe7\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\xdd\x00\x00\x00\xf9\x00\x00\x00\x02\x01\x3a\x00\x00\x00\xfc\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\x6e\x00\xf2\xff\x00\x00\xf4\x00\x00\x00\x00\x00\xdc\x00\x00\x00\xdc\x00\xdc\x00\xdc\x00\xe1\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\xfb\x00\xfa\x00\x60\x00\x00\x00\x00\x00\xd7\x00\x43\x00\x3c\x00\xfd\xff\xd6\x00\x00\x00\xfd\xff\x00\x00\x50\x00\x00\x00\x3c\x00\x00\x00\x66\x00\x00\x00\x1f\x00\x00\x00\x63\x00\x00\x00\x00\x00\xf7\x00\xf6\x00\x47\x00\xf5\x00\x47\x00\x47\x00\xf1\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x47\x00\xed\x00\x00\x00\x26\x00\xee\x00\xec\x00\x47\x00\x00\x00\x47\x00\x00\x00\xfa\xff\x47\x00\x47\x00\x47\x00\x00\x00\x47\x00\x47\x00\x47\x00\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x00\x00\xeb\x00\xd2\x00\x00\x00\xea\x00\xce\x00\x00\x00\xe8\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x4c\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x26\x00\x26\x00\x00\x00\xc8\x00\x47\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\xe0\x00\xdf\x00\x00\x00\x00\x00\x47\x00\x26\x00\x47\x00\x26\x00\x47\x00\x26\x00\xc7\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\xb6\x00\x00\x00\xfe\xff\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xd1\x00\x78\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x28\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\xba\x00\xc0\x00\x00\x00\x00\x00\xc4\x00\xc3\x00\xc2\x00\x00\x00\xad\x00\x00\x00\x02\x00\x00\x00\x00\x00\xc1\x00\x00\x00\xbf\x00\xbe\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x46\x00\x36\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\xc6\x00\x99\x00\xbc\x00\x00\x00\x00\x00\x76\x00\x9d\x00\xa3\x00\xa1\x00\x69\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\xa8\x00\x00\x00\xa6\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\xa0\x00\xb0\x00\x9c\x00\x00\x00\x9f\x00\x98\x00\x96\x00\x94\x00\x00\x00\x92\x00\x8f\x00\x8d\x00\x00\x00\x8b\x00\x89\x00\x87\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x74\x00\x2f\x00\x00\x00\x35\x00\x81\x00\x00\x00\xf4\xff\x00\x00\x00\x00\x91\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x70\x00\x7b\x00\x6f\x00\xee\xff\x37\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\xf8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\xfa\xff\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\xed\xff\xed\xff\x00\x00\xef\xff\xfd\xff\x00\x00\xfb\xff\xf9\xff\xf8\xff\x00\x00\xec\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc7\xff\x00\x00\xc0\xff\xba\xff\xbd\xff\xee\xff\xed\xff\xbf\xff\x00\x00\xbc\xff\xed\xff\x00\x00\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xff\xed\xff\xc1\xff\xb2\xff\x00\x00\x94\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc2\xff\xb8\xff\x00\x00\x00\x00\xf0\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xd1\xff\x00\x00\x00\x00\xca\xff\xcb\xff\xc9\xff\xcd\xff\xcc\xff\xd0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\xb9\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xb6\xff\xaf\xff\x00\x00\xaa\xff\xb5\xff\x9f\xff\x00\x00\x9b\xff\xb4\xff\x99\xff\x00\x00\x95\xff\xb7\xff\xdd\xff\xe2\xff\x00\x00\xea\xff\x00\x00\xeb\xff\x00\x00\xc8\xff\xd4\xff\x00\x00\xf7\xff\x00\x00\x00\x00\xd3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\x00\x00\xdf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xff\x00\x00\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xff\x00\x00\x00\x00\xad\xff\x00\x00\x00\x00\x9d\xff\x00\x00\x00\x00\x97\xff\x98\xff\xde\xff\xdc\xff\x00\x00\x00\x00\xd5\xff\xed\xff\xe0\xff\x00\x00\x00\x00\x00\x00\xe8\xff\xe5\xff\x00\x00\xf1\xff\xce\xff\xe6\xff\xe9\xff\xed\xff\x00\x00\xe1\xff\xdb\xff\xd8\xff\xd9\xff\xd6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\xa8\xff\x9c\xff\x9e\xff\x96\xff\x00\x00\x00\x00\xed\xff\xe3\xff\xed\xff\xcf\xff\x00\x00\xa6\xff\xa2\xff\xa5\xff\xa4\xff\xa3\xff\xa1\xff\xa7\xff\xe7\xff\xe4\xff\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\xab\xff\xa9\xff\xd7\xff\xda\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x03\x00\x03\x00\x09\x00\x0a\x00\x13\x00\x07\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x17\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x24\x00\x03\x00\x04\x00\x25\x00\x1d\x00\x07\x00\x08\x00\x09\x00\x1c\x00\x21\x00\x23\x00\x27\x00\x2a\x00\x24\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x03\x00\x07\x00\x08\x00\x0c\x00\x07\x00\x1a\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x19\x00\x1a\x00\x05\x00\x0d\x00\x1e\x00\x25\x00\x1c\x00\x0a\x00\x0b\x00\x23\x00\x0e\x00\x1c\x00\x16\x00\x10\x00\x18\x00\x12\x00\x24\x00\x24\x00\x05\x00\x16\x00\x16\x00\x18\x00\x18\x00\x0a\x00\x0b\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x10\x00\x0d\x00\x12\x00\x1f\x00\x1e\x00\x13\x00\x16\x00\x23\x00\x18\x00\x23\x00\x16\x00\x1e\x00\x18\x00\x1c\x00\x1d\x00\x1e\x00\x23\x00\x20\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x25\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x26\x00\x26\x00\x07\x00\x08\x00\x2a\x00\x2a\x00\x00\x00\x01\x00\x02\x00\x18\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x29\x00\x16\x00\x16\x00\x18\x00\x18\x00\x16\x00\x16\x00\x18\x00\x18\x00\x16\x00\x27\x00\x18\x00\x16\x00\x1b\x00\x18\x00\x2a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x11\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x14\x00\x15\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x22\x00\x23\x00\x28\x00\x29\x00\x07\x00\x08\x00\x26\x00\x27\x00\x1f\x00\x20\x00\x23\x00\x1d\x00\x1e\x00\x01\x00\x02\x00\x01\x00\x02\x00\x18\x00\x0f\x00\x06\x00\x2a\x00\x1b\x00\x1b\x00\x1b\x00\x21\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x2a\x00\x26\x00\x04\x00\x09\x00\x09\x00\x1c\x00\x1f\x00\x08\x00\x08\x00\x24\x00\x22\x00\x05\x00\x20\x00\x05\x00\x20\x00\x05\x00\x05\x00\x05\x00\x20\x00\x05\x00\x04\x00\x08\x00\x05\x00\x02\x00\x02\x00\x02\x00\x24\x00\x24\x00\x02\x00\x02\x00\x0c\x00\x0b\x00\x24\x00\x20\x00\x06\x00\x01\x00\x0b\x00\x05\x00\x24\x00\x24\x00\x2b\x00\x01\x00\x23\x00\x27\x00\x0b\x00\x01\x00\xff\xff\x17\x00\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\xb6\x00\x3e\x00\x8e\x00\x8f\x00\x2d\x00\x3f\x00\xaa\x00\x65\x00\x09\x00\x0a\x00\xb3\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x2e\x00\x0d\x00\x0e\x00\xb4\x00\x54\x00\x0f\x00\x0a\x00\x10\x00\x2a\x00\xb7\x00\x55\x00\x90\x00\xc4\x00\x4a\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\x3e\x00\x09\x00\x0a\x00\x63\x00\x3f\x00\x11\x00\x09\x00\x0a\x00\xbd\x00\x0a\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x64\x00\x65\x00\x36\x00\x9b\x00\x5c\x00\xc5\x00\x1d\x00\x37\x00\x38\x00\x5d\x00\x99\x00\x0b\x00\x96\x00\x39\x00\x3c\x00\x3a\x00\xc1\x00\x4a\x00\x4a\x00\x3b\x00\xa9\x00\x3c\x00\x3c\x00\x37\x00\x38\x00\x24\x00\x25\x00\x26\x00\x27\x00\x39\x00\x95\x00\x3a\x00\x28\x00\x58\x00\x72\x00\x3b\x00\x29\x00\x3c\x00\x59\x00\x96\x00\x5c\x00\x3c\x00\x13\x00\x14\x00\x15\x00\x5d\x00\x16\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x17\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\xa0\x00\xa2\x00\xbe\x00\x0a\x00\xa1\x00\xa3\x00\x05\x00\x03\x00\x04\x00\x75\x00\x76\x00\x77\x00\x79\x00\x7a\x00\x7b\x00\x2f\x00\x30\x00\x31\x00\x77\x00\xab\x00\xad\x00\x3c\x00\x3c\x00\xb1\x00\x9c\x00\x3c\x00\x3c\x00\x66\x00\x7b\x00\x3c\x00\x67\x00\x5d\x00\x3c\x00\x50\x00\xac\x00\x65\x00\xae\x00\x65\x00\xb2\x00\x0a\x00\x98\x00\x65\x00\x9e\x00\x0a\x00\x81\x00\x65\x00\x82\x00\x65\x00\x83\x00\x65\x00\x84\x00\x65\x00\x85\x00\x65\x00\x86\x00\x65\x00\x5f\x00\x87\x00\x65\x00\x88\x00\x65\x00\x89\x00\x65\x00\x8a\x00\x65\x00\x8b\x00\x8c\x00\x90\x00\x65\x00\x91\x00\x0a\x00\x92\x00\x65\x00\x6a\x00\x65\x00\x6d\x00\x65\x00\x6e\x00\x65\x00\x70\x00\x65\x00\x51\x00\x52\x00\x59\x00\x5a\x00\x21\x00\x0a\x00\x55\x00\x56\x00\x1e\x00\x1f\x00\x80\x00\x18\x00\x19\x00\x03\x00\x04\x00\x06\x00\x04\x00\x5e\x00\x61\x00\x68\x00\x2b\x00\x4c\x00\x4d\x00\x4e\x00\x22\x00\x4f\x00\x31\x00\x33\x00\x34\x00\xc7\x00\xc8\x00\xbd\x00\xc0\x00\xc1\x00\xc3\x00\xc4\x00\xb0\x00\xb1\x00\x2e\x00\x9b\x00\x9e\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa9\x00\x94\x00\xa8\x00\x95\x00\x6c\x00\x98\x00\x6d\x00\x70\x00\x72\x00\x74\x00\x2e\x00\x33\x00\x61\x00\x63\x00\x6a\x00\x0d\x00\x33\x00\x4c\x00\x36\x00\x2a\x00\x0d\x00\x18\x00\x33\x00\x21\x00\xbe\xff\x1d\x00\x1c\x00\x1b\x00\x0d\x00\x08\x00\x00\x00\x09\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (2, 107) [-	(2 , happyReduce_2),-	(3 , happyReduce_3),-	(4 , happyReduce_4),-	(5 , happyReduce_5),-	(6 , happyReduce_6),-	(7 , happyReduce_7),-	(8 , happyReduce_8),-	(9 , happyReduce_9),-	(10 , happyReduce_10),-	(11 , happyReduce_11),-	(12 , happyReduce_12),-	(13 , happyReduce_13),-	(14 , happyReduce_14),-	(15 , happyReduce_15),-	(16 , happyReduce_16),-	(17 , happyReduce_17),-	(18 , happyReduce_18),-	(19 , happyReduce_19),-	(20 , happyReduce_20),-	(21 , happyReduce_21),-	(22 , happyReduce_22),-	(23 , happyReduce_23),-	(24 , happyReduce_24),-	(25 , happyReduce_25),-	(26 , happyReduce_26),-	(27 , happyReduce_27),-	(28 , happyReduce_28),-	(29 , happyReduce_29),-	(30 , happyReduce_30),-	(31 , happyReduce_31),-	(32 , happyReduce_32),-	(33 , happyReduce_33),-	(34 , happyReduce_34),-	(35 , happyReduce_35),-	(36 , happyReduce_36),-	(37 , happyReduce_37),-	(38 , happyReduce_38),-	(39 , happyReduce_39),-	(40 , happyReduce_40),-	(41 , happyReduce_41),-	(42 , happyReduce_42),-	(43 , happyReduce_43),-	(44 , happyReduce_44),-	(45 , happyReduce_45),-	(46 , happyReduce_46),-	(47 , happyReduce_47),-	(48 , happyReduce_48),-	(49 , happyReduce_49),-	(50 , happyReduce_50),-	(51 , happyReduce_51),-	(52 , happyReduce_52),-	(53 , happyReduce_53),-	(54 , happyReduce_54),-	(55 , happyReduce_55),-	(56 , happyReduce_56),-	(57 , happyReduce_57),-	(58 , happyReduce_58),-	(59 , happyReduce_59),-	(60 , happyReduce_60),-	(61 , happyReduce_61),-	(62 , happyReduce_62),-	(63 , happyReduce_63),-	(64 , happyReduce_64),-	(65 , happyReduce_65),-	(66 , happyReduce_66),-	(67 , happyReduce_67),-	(68 , happyReduce_68),-	(69 , happyReduce_69),-	(70 , happyReduce_70),-	(71 , happyReduce_71),-	(72 , happyReduce_72),-	(73 , happyReduce_73),-	(74 , happyReduce_74),-	(75 , happyReduce_75),-	(76 , happyReduce_76),-	(77 , happyReduce_77),-	(78 , happyReduce_78),-	(79 , happyReduce_79),-	(80 , happyReduce_80),-	(81 , happyReduce_81),-	(82 , happyReduce_82),-	(83 , happyReduce_83),-	(84 , happyReduce_84),-	(85 , happyReduce_85),-	(86 , happyReduce_86),-	(87 , happyReduce_87),-	(88 , happyReduce_88),-	(89 , happyReduce_89),-	(90 , happyReduce_90),-	(91 , happyReduce_91),-	(92 , happyReduce_92),-	(93 , happyReduce_93),-	(94 , happyReduce_94),-	(95 , happyReduce_95),-	(96 , happyReduce_96),-	(97 , happyReduce_97),-	(98 , happyReduce_98),-	(99 , happyReduce_99),-	(100 , happyReduce_100),-	(101 , happyReduce_101),-	(102 , happyReduce_102),-	(103 , happyReduce_103),-	(104 , happyReduce_104),-	(105 , happyReduce_105),-	(106 , happyReduce_106),-	(107 , happyReduce_107)-	]--happy_n_terms = 44 :: Int-happy_n_nonterms = 43 :: Int--happyReduce_2 = happySpecReduce_3  0# happyReduction_2-happyReduction_2 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	happyIn5-		 ((happy_var_1, happy_var_3)-	)}}--happyReduce_3 = happySpecReduce_1  1# happyReduction_3-happyReduction_3 happy_x_1-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> -	happyIn6-		 (reverse happy_var_1-	)}--happyReduce_4 = happySpecReduce_3  2# happyReduction_4-happyReduction_4 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> -	case happyOut8 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_5 = happySpecReduce_0  2# happyReduction_5-happyReduction_5  =  happyIn7-		 ([]-	)--happyReduce_6 = happySpecReduce_1  3# happyReduction_6-happyReduction_6 happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	happyIn8-		 (ThNode    happy_var_1-	)}--happyReduce_7 = happySpecReduce_1  3# happyReduction_7-happyReduction_7 happy_x_1-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> -	happyIn8-		 (ThComment happy_var_1-	)}--happyReduce_8 = happyReduce 7# 4# happyReduction_8-happyReduction_8 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut14 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { ((,) _ (TypeIden happy_var_3)) -> -	case happyOut12 happy_x_4 of { happy_var_4 -> -	case happyOut10 happy_x_6 of { happy_var_6 -> -	case happyOut11 happy_x_7 of { happy_var_7 -> -	happyIn9-		 (APINode (TypeName happy_var_3) happy_var_4 happy_var_1 happy_var_6 happy_var_7-	) `HappyStk` happyRest}}}}}--happyReduce_9 = happySpecReduce_1  5# happyReduction_9-happyReduction_9 happy_x_1-	 =  case happyOut15 happy_x_1 of { happy_var_1 -> -	happyIn10-		 (SpRecord  happy_var_1-	)}--happyReduce_10 = happySpecReduce_1  5# happyReduction_10-happyReduction_10 happy_x_1-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> -	happyIn10-		 (SpUnion   happy_var_1-	)}--happyReduce_11 = happySpecReduce_1  5# happyReduction_11-happyReduction_11 happy_x_1-	 =  case happyOut21 happy_x_1 of { happy_var_1 -> -	happyIn10-		 (SpEnum    happy_var_1-	)}--happyReduce_12 = happySpecReduce_1  5# happyReduction_12-happyReduction_12 happy_x_1-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> -	happyIn10-		 (SpNewtype happy_var_1-	)}--happyReduce_13 = happySpecReduce_1  5# happyReduction_13-happyReduction_13 happy_x_1-	 =  case happyOut27 happy_x_1 of { happy_var_1 -> -	happyIn10-		 (SpSynonym happy_var_1-	)}--happyReduce_14 = happyReduce 4# 6# happyReduction_14-happyReduction_14 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_2 of { happy_var_2 -> -	case happyOut30 happy_x_4 of { happy_var_4 -> -	happyIn11-		 (Just (happy_var_2,happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_15 = happySpecReduce_0  6# happyReduction_15-happyReduction_15  =  happyIn11-		 (Nothing-	)--happyReduce_16 = happySpecReduce_1  7# happyReduction_16-happyReduction_16 happy_x_1-	 =  case happyOut13 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (unlines $ reverse happy_var_1-	)}--happyReduce_17 = happySpecReduce_2  8# happyReduction_17-happyReduction_17 happy_x_2-	happy_x_1-	 =  case happyOut13 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { ((,) _ (Comment  happy_var_2)) -> -	happyIn13-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_18 = happySpecReduce_0  8# happyReduction_18-happyReduction_18  =  happyIn13-		 ([]-	)--happyReduce_19 = happySpecReduce_1  9# happyReduction_19-happyReduction_19 happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	happyIn14-		 (CI.mk happy_var_1-	)}--happyReduce_20 = happySpecReduce_2  10# happyReduction_20-happyReduction_20 happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_2 of { happy_var_2 -> -	happyIn15-		 (SpecRecord $ reverse happy_var_2-	)}--happyReduce_21 = happySpecReduce_2  11# happyReduction_21-happyReduction_21 happy_x_2-	happy_x_1-	 =  case happyOut20 happy_x_2 of { happy_var_2 -> -	happyIn16-		 (SpecUnion  $ reverse happy_var_2-	)}--happyReduce_22 = happyReduce 4# 12# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_2 of { happy_var_2 -> -	case happyOut18 happy_x_4 of { happy_var_4 -> -	happyIn17-		 ((happy_var_2,happy_var_4) : happy_var_1-	) `HappyStk` happyRest}}}--happyReduce_23 = happySpecReduce_3  12# happyReduction_23-happyReduction_23 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> -	case happyOut18 happy_x_3 of { happy_var_3 -> -	happyIn17-		 ([(happy_var_1,happy_var_3)]-	)}}--happyReduce_24 = happyReduce 4# 13# happyReduction_24-happyReduction_24 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut27 happy_x_1 of { happy_var_1 -> -	case happyOut19 happy_x_2 of { happy_var_2 -> -	case happyOut28 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_4 of { happy_var_4 -> -	happyIn18-		 (FieldType happy_var_1 happy_var_2 happy_var_3 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_25 = happySpecReduce_1  14# happyReduction_25-happyReduction_25 happy_x_1-	 =  happyIn19-		 (True-	)--happyReduce_26 = happySpecReduce_0  14# happyReduction_26-happyReduction_26  =  happyIn19-		 (False-	)--happyReduce_27 = happyReduce 6# 15# happyReduction_27-happyReduction_27 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut20 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut27 happy_x_5 of { happy_var_5 -> -	case happyOut12 happy_x_6 of { happy_var_6 -> -	happyIn20-		 ((happy_var_3,(happy_var_5,happy_var_6)) : happy_var_1-	) `HappyStk` happyRest}}}}--happyReduce_28 = happyReduce 5# 15# happyReduction_28-happyReduction_28 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_2 of { happy_var_2 -> -	case happyOut27 happy_x_4 of { happy_var_4 -> -	case happyOut12 happy_x_5 of { happy_var_5 -> -	happyIn20-		 ([(happy_var_2,(happy_var_4,happy_var_5))]-	) `HappyStk` happyRest}}}--happyReduce_29 = happySpecReduce_2  16# happyReduction_29-happyReduction_29 happy_x_2-	happy_x_1-	 =  case happyOut22 happy_x_2 of { happy_var_2 -> -	happyIn21-		 (SpecEnum $ reverse happy_var_2-	)}--happyReduce_30 = happyReduce 4# 17# happyReduction_30-happyReduction_30 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut22 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_4 of { happy_var_4 -> -	happyIn22-		 ((happy_var_3,happy_var_4) : happy_var_1-	) `HappyStk` happyRest}}}--happyReduce_31 = happySpecReduce_3  17# happyReduction_31-happyReduction_31 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_2 of { happy_var_2 -> -	case happyOut12 happy_x_3 of { happy_var_3 -> -	happyIn22-		 ([(happy_var_2,happy_var_3)]-	)}}--happyReduce_32 = happySpecReduce_3  18# happyReduction_32-happyReduction_32 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut29 happy_x_2 of { happy_var_2 -> -	case happyOut24 happy_x_3 of { happy_var_3 -> -	happyIn23-		 (SpecNewtype happy_var_2 happy_var_3-	)}}--happyReduce_33 = happySpecReduce_2  19# happyReduction_33-happyReduction_33 happy_x_2-	happy_x_1-	 =  case happyOut25 happy_x_2 of { happy_var_2 -> -	happyIn24-		 (Just happy_var_2-	)}--happyReduce_34 = happySpecReduce_0  19# happyReduction_34-happyReduction_34  =  happyIn24-		 (Nothing-	)--happyReduce_35 = happySpecReduce_1  20# happyReduction_35-happyReduction_35 happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	happyIn25-		 (FtrStrg happy_var_1-	)}--happyReduce_36 = happySpecReduce_2  20# happyReduction_36-happyReduction_36 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { ((,) _ (Intg     happy_var_2)) -> -	happyIn25-		 (FtrIntg $ IntRange (Just happy_var_2) Nothing-	)}--happyReduce_37 = happyReduce 5# 20# happyReduction_37-happyReduction_37 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { ((,) _ (Intg     happy_var_2)) -> -	case happyOutTok happy_x_5 of { ((,) _ (Intg     happy_var_5)) -> -	happyIn25-		 (FtrIntg $ IntRange (Just happy_var_2) (Just happy_var_5)-	) `HappyStk` happyRest}}--happyReduce_38 = happySpecReduce_2  20# happyReduction_38-happyReduction_38 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { ((,) _ (Intg     happy_var_2)) -> -	happyIn25-		 (FtrIntg $ IntRange Nothing   (Just happy_var_2)-	)}--happyReduce_39 = happySpecReduce_2  20# happyReduction_39-happyReduction_39 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { ((,) _ (UTCTIME  happy_var_2)) -> -	happyIn25-		 (FtrUTC  $ UTCRange (Just happy_var_2) Nothing-	)}--happyReduce_40 = happyReduce 5# 20# happyReduction_40-happyReduction_40 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { ((,) _ (UTCTIME  happy_var_2)) -> -	case happyOutTok happy_x_5 of { ((,) _ (UTCTIME  happy_var_5)) -> -	happyIn25-		 (FtrUTC  $ UTCRange (Just happy_var_2) (Just happy_var_5)-	) `HappyStk` happyRest}}--happyReduce_41 = happySpecReduce_2  20# happyReduction_41-happyReduction_41 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { ((,) _ (UTCTIME  happy_var_2)) -> -	happyIn25-		 (FtrUTC  $ UTCRange Nothing   (Just happy_var_2)-	)}--happyReduce_42 = happySpecReduce_1  21# happyReduction_42-happyReduction_42 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (Strg     happy_var_1)) -> -	happyIn26-		 (RegEx (T.pack happy_var_1) $ mkRegexWithOpts happy_var_1 False True-	)}--happyReduce_43 = happySpecReduce_2  22# happyReduction_43-happyReduction_43 happy_x_2-	happy_x_1-	 =  case happyOut27 happy_x_2 of { happy_var_2 -> -	happyIn27-		 (TyMaybe            happy_var_2-	)}--happyReduce_44 = happySpecReduce_3  22# happyReduction_44-happyReduction_44 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut27 happy_x_2 of { happy_var_2 -> -	happyIn27-		 (TyList             happy_var_2-	)}--happyReduce_45 = happySpecReduce_1  22# happyReduction_45-happyReduction_45 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> -	happyIn27-		 (TyName   (TypeName happy_var_1)-	)}--happyReduce_46 = happySpecReduce_1  22# happyReduction_46-happyReduction_46 happy_x_1-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> -	happyIn27-		 (TyBasic            happy_var_1-	)}--happyReduce_47 = happySpecReduce_1  22# happyReduction_47-happyReduction_47 happy_x_1-	 =  happyIn27-		 (TyJSON-	)--happyReduce_48 = happySpecReduce_1  23# happyReduction_48-happyReduction_48 happy_x_1-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> -	happyIn28-		 (Just happy_var_1-	)}--happyReduce_49 = happySpecReduce_0  23# happyReduction_49-happyReduction_49  =  happyIn28-		 (Nothing-	)--happyReduce_50 = happySpecReduce_1  24# happyReduction_50-happyReduction_50 happy_x_1-	 =  happyIn29-		 (BTstring-	)--happyReduce_51 = happySpecReduce_1  24# happyReduction_51-happyReduction_51 happy_x_1-	 =  happyIn29-		 (BTbinary-	)--happyReduce_52 = happySpecReduce_1  24# happyReduction_52-happyReduction_52 happy_x_1-	 =  happyIn29-		 (BTbool-	)--happyReduce_53 = happySpecReduce_1  24# happyReduction_53-happyReduction_53 happy_x_1-	 =  happyIn29-		 (BTint-	)--happyReduce_54 = happySpecReduce_1  24# happyReduction_54-happyReduction_54 happy_x_1-	 =  happyIn29-		 (BTutc-	)--happyReduce_55 = happySpecReduce_1  25# happyReduction_55-happyReduction_55 happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	happyIn30-		 (FieldName happy_var_1-	)}--happyReduce_56 = happySpecReduce_1  26# happyReduction_56-happyReduction_56 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (VarIden  happy_var_1)) -> -	happyIn31-		 (happy_var_1-	)}--happyReduce_57 = happySpecReduce_1  26# happyReduction_57-happyReduction_57 happy_x_1-	 =  happyIn31-		 ("default"-	)--happyReduce_58 = happySpecReduce_1  26# happyReduction_58-happyReduction_58 happy_x_1-	 =  happyIn31-		 ("field"-	)--happyReduce_59 = happySpecReduce_1  26# happyReduction_59-happyReduction_59 happy_x_1-	 =  happyIn31-		 ("alternative"-	)--happyReduce_60 = happySpecReduce_1  26# happyReduction_60-happyReduction_60 happy_x_1-	 =  happyIn31-		 ("to"-	)--happyReduce_61 = happySpecReduce_1  27# happyReduction_61-happyReduction_61 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> -	happyIn32-		 (TypeName happy_var_1-	)}--happyReduce_62 = happyReduce 5# 28# happyReduction_62-happyReduction_62 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut35 happy_x_2 of { happy_var_2 -> -	case happyOut36 happy_x_3 of { happy_var_3 -> -	case happyOut33 happy_x_5 of { happy_var_5 -> -	happyIn33-		 (ChangesUpTo happy_var_2 happy_var_3 happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_63 = happySpecReduce_2  28# happyReduction_63-happyReduction_63 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn33-		 (ChangesStart happy_var_2-	)}--happyReduce_64 = happySpecReduce_3  28# happyReduction_64-happyReduction_64 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut33 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (happy_var_3-	)}--happyReduce_65 = happySpecReduce_1  29# happyReduction_65-happyReduction_65 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (Strg     happy_var_1)) -> -	happyIn34-		 (parseVer happy_var_1-	)}--happyReduce_66 = happySpecReduce_1  30# happyReduction_66-happyReduction_66 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (Strg     happy_var_1)) -> -	happyIn35-		 (parseVersionExtra happy_var_1-	)}--happyReduce_67 = happySpecReduce_1  31# happyReduction_67-happyReduction_67 happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	happyIn36-		 (concat (reverse happy_var_1)-	)}--happyReduce_68 = happySpecReduce_2  32# happyReduction_68-happyReduction_68 happy_x_2-	happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut38 happy_x_2 of { happy_var_2 -> -	happyIn37-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_69 = happySpecReduce_0  32# happyReduction_69-happyReduction_69  =  happyIn37-		 ([]-	)--happyReduce_70 = happySpecReduce_3  33# happyReduction_70-happyReduction_70 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut10 happy_x_3 of { happy_var_3 -> -	happyIn38-		 ([ChAddType happy_var_2 (declNF happy_var_3)]-	)}}--happyReduce_71 = happySpecReduce_2  33# happyReduction_71-happyReduction_71 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn38-		 ([ChDeleteType happy_var_2]-	)}--happyReduce_72 = happyReduce 4# 33# happyReduction_72-happyReduction_72 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut32 happy_x_4 of { happy_var_4 -> -	happyIn38-		 ([ChRenameType happy_var_2 happy_var_4]-	) `HappyStk` happyRest}}--happyReduce_73 = happyReduce 4# 33# happyReduction_73-happyReduction_73 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut39 happy_x_4 of { happy_var_4 -> -	happyIn38-		 (map (fldChangeToAPIChange happy_var_3)   (reverse happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_74 = happyReduce 4# 33# happyReduction_74-happyReduction_74 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut43 happy_x_4 of { happy_var_4 -> -	happyIn38-		 (map (unionChangeToAPIChange happy_var_3) (reverse happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_75 = happyReduce 4# 33# happyReduction_75-happyReduction_75 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut45 happy_x_4 of { happy_var_4 -> -	happyIn38-		 (map (enumChangeToAPIChange happy_var_3)  (reverse happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_76 = happyReduce 4# 33# happyReduction_76-happyReduction_76 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut47 happy_x_4 of { happy_var_4 -> -	happyIn38-		 ([ChCustomType happy_var_3 happy_var_4]-	) `HappyStk` happyRest}}--happyReduce_77 = happySpecReduce_2  33# happyReduction_77-happyReduction_77 happy_x_2-	happy_x_1-	 =  case happyOut47 happy_x_2 of { happy_var_2 -> -	happyIn38-		 ([ChCustomAll happy_var_2]-	)}--happyReduce_78 = happySpecReduce_1  33# happyReduction_78-happyReduction_78 happy_x_1-	 =  happyIn38-		 ([]-	)--happyReduce_79 = happySpecReduce_2  34# happyReduction_79-happyReduction_79 happy_x_2-	happy_x_1-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> -	case happyOut40 happy_x_2 of { happy_var_2 -> -	happyIn39-		 (happy_var_2 ++ happy_var_1-	)}}--happyReduce_80 = happySpecReduce_1  34# happyReduction_80-happyReduction_80 happy_x_1-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> -	happyIn39-		 (happy_var_1-	)}--happyReduce_81 = happyReduce 6# 35# happyReduction_81-happyReduction_81 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut27 happy_x_5 of { happy_var_5 -> -	case happyOut41 happy_x_6 of { happy_var_6 -> -	happyIn40-		 ([FldChAdd happy_var_3 happy_var_5 happy_var_6]-	) `HappyStk` happyRest}}}--happyReduce_82 = happySpecReduce_3  35# happyReduction_82-happyReduction_82 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn40-		 ([FldChDelete happy_var_3]-	)}--happyReduce_83 = happyReduce 5# 35# happyReduction_83-happyReduction_83 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut30 happy_x_5 of { happy_var_5 -> -	happyIn40-		 ([FldChRename happy_var_3 happy_var_5]-	) `HappyStk` happyRest}}--happyReduce_84 = happyReduce 7# 35# happyReduction_84-happyReduction_84 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut27 happy_x_5 of { happy_var_5 -> -	case happyOut47 happy_x_7 of { happy_var_7 -> -	happyIn40-		 ([FldChChange happy_var_3 happy_var_5 happy_var_7]-	) `HappyStk` happyRest}}}--happyReduce_85 = happySpecReduce_1  35# happyReduction_85-happyReduction_85 happy_x_1-	 =  happyIn40-		 ([]-	)--happyReduce_86 = happySpecReduce_2  36# happyReduction_86-happyReduction_86 happy_x_2-	happy_x_1-	 =  case happyOut42 happy_x_2 of { happy_var_2 -> -	happyIn41-		 (Just happy_var_2-	)}--happyReduce_87 = happySpecReduce_0  36# happyReduction_87-happyReduction_87  =  happyIn41-		 (Nothing-	)--happyReduce_88 = happySpecReduce_2  37# happyReduction_88-happyReduction_88 happy_x_2-	happy_x_1-	 =  happyIn42-		 (DefValList-	)--happyReduce_89 = happySpecReduce_1  37# happyReduction_89-happyReduction_89 happy_x_1-	 =  happyIn42-		 (DefValMaybe-	)--happyReduce_90 = happySpecReduce_1  37# happyReduction_90-happyReduction_90 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (Strg     happy_var_1)) -> -	happyIn42-		 (DefValString (T.pack happy_var_1)-	)}--happyReduce_91 = happySpecReduce_1  37# happyReduction_91-happyReduction_91 happy_x_1-	 =  happyIn42-		 (DefValBool True-	)--happyReduce_92 = happySpecReduce_1  37# happyReduction_92-happyReduction_92 happy_x_1-	 =  happyIn42-		 (DefValBool False-	)--happyReduce_93 = happySpecReduce_1  37# happyReduction_93-happyReduction_93 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (Intg     happy_var_1)) -> -	happyIn42-		 (DefValInt happy_var_1-	)}--happyReduce_94 = happySpecReduce_1  37# happyReduction_94-happyReduction_94 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (UTCTIME  happy_var_1)) -> -	happyIn42-		 (DefValUtc happy_var_1-	)}--happyReduce_95 = happySpecReduce_2  38# happyReduction_95-happyReduction_95 happy_x_2-	happy_x_1-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> -	case happyOut44 happy_x_2 of { happy_var_2 -> -	happyIn43-		 (happy_var_2 ++ happy_var_1-	)}}--happyReduce_96 = happySpecReduce_1  38# happyReduction_96-happyReduction_96 happy_x_1-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> -	happyIn43-		 (happy_var_1-	)}--happyReduce_97 = happyReduce 5# 39# happyReduction_97-happyReduction_97 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut27 happy_x_5 of { happy_var_5 -> -	happyIn44-		 ([UnChAdd happy_var_3 happy_var_5]-	) `HappyStk` happyRest}}--happyReduce_98 = happySpecReduce_3  39# happyReduction_98-happyReduction_98 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn44-		 ([UnChDelete happy_var_3]-	)}--happyReduce_99 = happyReduce 5# 39# happyReduction_99-happyReduction_99 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut30 happy_x_5 of { happy_var_5 -> -	happyIn44-		 ([UnChRename happy_var_3 happy_var_5]-	) `HappyStk` happyRest}}--happyReduce_100 = happySpecReduce_1  39# happyReduction_100-happyReduction_100 happy_x_1-	 =  happyIn44-		 ([]-	)--happyReduce_101 = happySpecReduce_2  40# happyReduction_101-happyReduction_101 happy_x_2-	happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut46 happy_x_2 of { happy_var_2 -> -	happyIn45-		 (happy_var_2 ++ happy_var_1-	)}}--happyReduce_102 = happySpecReduce_1  40# happyReduction_102-happyReduction_102 happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	happyIn45-		 (happy_var_1-	)}--happyReduce_103 = happySpecReduce_3  41# happyReduction_103-happyReduction_103 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn46-		 ([EnChAdd happy_var_3]-	)}--happyReduce_104 = happySpecReduce_3  41# happyReduction_104-happyReduction_104 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn46-		 ([EnChDelete happy_var_3]-	)}--happyReduce_105 = happyReduce 5# 41# happyReduction_105-happyReduction_105 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut30 happy_x_3 of { happy_var_3 -> -	case happyOut30 happy_x_5 of { happy_var_5 -> -	happyIn46-		 ([EnChRename happy_var_3 happy_var_5]-	) `HappyStk` happyRest}}--happyReduce_106 = happySpecReduce_1  41# happyReduction_106-happyReduction_106 happy_x_1-	 =  happyIn46-		 ([]-	)--happyReduce_107 = happySpecReduce_1  42# happyReduction_107-happyReduction_107 happy_x_1-	 =  case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> -	happyIn47-		 (happy_var_1-	)}--happyNewToken action sts stk [] =-	happyDoAction 43# notHappyAtAll action sts stk []--happyNewToken action sts stk (tk:tks) =-	let cont i = happyDoAction i tk action sts stk tks in-	case tk of {-	(,) _ Semi -> cont 1#;-	(,) _ Bar -> cont 2#;-	(,) _ Bra -> cont 3#;-	(,) _ Ket -> cont 4#;-	(,) _ ColCol -> cont 5#;-	(,) _ Equals -> cont 6#;-	(,) _ Query -> cont 7#;-	(,) _ Comma -> cont 8#;-	(,) _ LtEq -> cont 9#;-	(,) _ GtEq -> cont 10#;-	(,) _ Version -> cont 11#;-	(,) _ With -> cont 12#;-	(,) _ Integer -> cont 13#;-	(,) _ Boolean -> cont 14#;-	(,) _ UTC -> cont 15#;-	(,) _ String -> cont 16#;-	(,) _ BInary -> cont 17#;-	(,) _ Json -> cont 18#;-	(,) _ Record -> cont 19#;-	(,) _ Union -> cont 20#;-	(,) _ Enum -> cont 21#;-	(,) _ Basic -> cont 22#;-	(,) _ Changes -> cont 23#;-	(,) _ Added -> cont 24#;-	(,) _ Removed -> cont 25#;-	(,) _ Renamed -> cont 26#;-	(,) _ Changed -> cont 27#;-	(,) _ Default -> cont 28#;-	(,) _ Field -> cont 29#;-	(,) _ Alternative -> cont 30#;-	(,) _ Migration -> cont 31#;-	(,) _ To -> cont 32#;-	(,) _ NOTHING -> cont 33#;-	(,) _ Readonly -> cont 34#;-	(,) _ (Comment  happy_dollar_dollar) -> cont 35#;-	(,) _ (TypeIden happy_dollar_dollar) -> cont 36#;-	(,) _ (VarIden  happy_dollar_dollar) -> cont 37#;-	(,) _ (Intg     happy_dollar_dollar) -> cont 38#;-	(,) _ (Strg     happy_dollar_dollar) -> cont 39#;-	(,) _ TRUE -> cont 40#;-	(,) _ FALSE -> cont 41#;-	(,) _ (UTCTIME  happy_dollar_dollar) -> cont 42#;-	_ -> happyError' (tk:tks)-	}--happyError_ 43# tk tks = happyError' tks-happyError_ _ tk tks = happyError' (tk:tks)--happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b-happyThen = (>>=)-happyReturn :: () => a -> ParseM a-happyReturn = (return)-happyThen1 m k tks = (>>=) m (\a -> k a tks)-happyReturn1 :: () => a -> b -> ParseM a-happyReturn1 = \a tks -> (return) a-happyError' :: () => [(PToken)] -> ParseM a-happyError' = happyError--parse tks = happySomeParser where-  happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut6 x))--parse_with_changelog tks = happySomeParser where-  happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut5 x))--happySeq = happyDontSeq---type ParseM = Either [PToken]--happyError :: [PToken] -> ParseM a-happyError = Left--parseAPI :: String -> (Int, Int) -> String -> API-parseAPI = wrap parse--wrap :: ([PToken] -> ParseM a) -> String -> (Int, Int) -> String -> a-wrap parser fn (start_ln,_start_cn) s = case parser (scan s) of-    Right v  -> v-    Left tks -> error $ printf "Syntax error at %s of %s:\n        %s\n" (loc tks) fn $ show (take 5 tks)-  where-    loc tks = case tks of-            []                    -> "<EOF>"-            (AlexPn ad ln cn,_):_ -> printf "line %d, column %d (@%d)" (start_ln+ln-1) (cn-1) ad--parseAPIWithChangelog :: String -> (Int, Int) -> String -> APIWithChangelog-parseAPIWithChangelog = wrap parse_with_changelog---data FieldChange = FldChAdd FieldName APIType (Maybe DefaultValue)-                 | FldChDelete FieldName-                 | FldChRename FieldName FieldName-                 | FldChChange FieldName APIType MigrationTag--fldChangeToAPIChange :: TypeName -> FieldChange -> APIChange-fldChangeToAPIChange t (FldChAdd f ty def)  = ChAddField t f ty def-fldChangeToAPIChange t (FldChDelete f)      = ChDeleteField t f-fldChangeToAPIChange t (FldChRename f f')   = ChRenameField t f f'-fldChangeToAPIChange t (FldChChange f ty m) = ChChangeField t f ty m--data UnionChange = UnChAdd FieldName APIType-                 | UnChDelete FieldName-                 | UnChRename FieldName FieldName--unionChangeToAPIChange :: TypeName -> UnionChange -> APIChange-unionChangeToAPIChange t (UnChAdd f ty)    = ChAddUnionAlt t f ty-unionChangeToAPIChange t (UnChDelete f)    = ChDeleteUnionAlt t f-unionChangeToAPIChange t (UnChRename f f') = ChRenameUnionAlt t f f'--data EnumChange = EnChAdd FieldName-                | EnChDelete FieldName-                | EnChRename FieldName FieldName--enumChangeToAPIChange :: TypeName -> EnumChange -> APIChange-enumChangeToAPIChange t (EnChAdd f)       = ChAddEnumVal t f-enumChangeToAPIChange t (EnChDelete f)    = ChDeleteEnumVal t f-enumChangeToAPIChange t (EnChRename f f') = ChRenameEnumVal t f f'---parseVer :: String -> V.Version-parseVer x = case simpleParse x of-                 Just v -> v-                 Nothing -> error $ "Syntax error while parsing version " ++ x--parseVersionExtra :: String -> VersionExtra-parseVersionExtra "development" = DevVersion-parseVersionExtra s             = Release $ parseVer s---api :: QuasiQuoter-api =-    QuasiQuoter-        { quoteExp  = located [|parseAPI|]-        , quotePat  = error "api QuasiQuoter used in patten      context"-        , quoteType = error "api QuasiQuoter used in type        context"-        , quoteDec  = error "api QuasiQuoter used in declaration context"-        }--apiWithChangelog :: QuasiQuoter-apiWithChangelog =-    QuasiQuoter-        { quoteExp  = located [|parseAPIWithChangelog|]-        , quotePat  = error "apiWithChangelog QuasiQuoter used in patten      context"-        , quoteType = error "apiWithChangelog QuasiQuoter used in type        context"-        , quoteDec  = error "apiWithChangelog QuasiQuoter used in declaration context"-        }--located :: ExpQ -> String -> ExpQ-located e s = do-    l <- location-    let fn = loc_filename l-        ls = loc_start    l-    [|$(e) fn ls s|]-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 10 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 10 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)-#else-#define LT(n,m) (n Happy_GHC_Exts.<# m)-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)-#define EQ(n,m) (n Happy_GHC_Exts.==# m)-#endif-{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 67 "templates/GenericTemplate.hs" #-}--{-# LINE 77 "templates/GenericTemplate.hs" #-}--{-# LINE 86 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser).  We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =-        happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = -        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st-        = {- nothing -}---          case action of-                0#           -> {- nothing -}-                                     happyFail i tk st-                -1#          -> {- nothing -}-                                     happyAccept i tk st-                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}--                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st-                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))-                n                 -> {- nothing -}---                                     happyShift new_state i tk st-                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))-   where off    = indexShortOffAddr happyActOffsets st-         off_i  = (off Happy_GHC_Exts.+# i)-         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))-                  then EQ(indexShortOffAddr happyCheck off_i, i)-                  else False-         action-          | check     = indexShortOffAddr happyTable off_i-          | otherwise = indexShortOffAddr happyDefActions st---indexShortOffAddr (HappyA# arr) off =-        Happy_GHC_Exts.narrow16Int# i-  where-        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))-        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))-        off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---     trace "shifting the error token" $-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')-     = let r = fn v1 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')-     = let r = fn v1 v2 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')-     = let r = fn v1 v2 v3 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of-         sts1@((HappyCons (st1@(action)) (_))) ->-                let r = fn stk in  -- it doesn't hurt to always seq here...-                happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =-      case happyDrop k (HappyCons (st) (sts)) of-        sts1@((HappyCons (st1@(action)) (_))) ->-          let drop_stk = happyDropStk k stk in-          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))--happyMonad2Reduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =-      case happyDrop k (HappyCons (st) (sts)) of-        sts1@((HappyCons (st1@(action)) (_))) ->-         let drop_stk = happyDropStk k stk--             off = indexShortOffAddr happyGotoOffsets st1-             off_i = (off Happy_GHC_Exts.+# nt)-             new_state = indexShortOffAddr happyTable off_i----          in-          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))--happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = -   {- nothing -}-   happyDoAction j tk new_state-   where off = indexShortOffAddr happyGotoOffsets st-         off_i = (off Happy_GHC_Exts.+# nt)-         new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---      trace "failing" $ -        happyError_ i tk--{-  We don't need state discarding for our restricted implementation of-    "error".  In fact, it can cause some bogus parses, so I've disabled it-    for now --SDM---- discard a state-happyFail  0# tk old_st (HappyCons ((action)) (sts)) -                                                (saved_tok `HappyStk` _ `HappyStk` stk) =---      trace ("discarding state, depth " ++ show (length stk))  $-        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,---                       save the old token and carry on.-happyFail  i tk (action) sts stk =---      trace "entering error recovery" $-        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll :: a-notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing.  If the --strict flag is given, then Happy emits ---      happySeq = happyDoSeq--- otherwise it emits---      happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq   a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template.  GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
− dist/build/Data/API/Scan.hs
@@ -1,636 +0,0 @@-{-# LANGUAGE CPP,MagicHash #-}-{-# LINE 1 "src/Data/API/Scan.x" #-}--{-# OPTIONS_GHC -w #-}--module Data.API.Scan-    ( scan-    , PToken-    , AlexPosn(..)-    , Token(..)-    ) where--import           Data.API.Types-import           Data.API.Utils--import           Data.Char-import           Data.Time-import           Safe--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Char (ord)-import Data.Array.Base (unsafeAt)-#else-import Array-import Char (ord)-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-{-# LINE 1 "templates/wrappers.hs" #-}-{-# LINE 1 "templates/wrappers.hs" #-}-{-# LINE 1 "<command-line>" #-}-------# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 6 "<command-line>" #-}-{-# LINE 1 "templates/wrappers.hs" #-}--- -------------------------------------------------------------------------------- Alex wrapper code.------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.--import Data.Word (Word8)-{-# LINE 22 "templates/wrappers.hs" #-}--import qualified Data.Bits---- | Encode a Haskell String to a list of Word8 values, in UTF8 format.-utf8Encode :: Char -> [Word8]-utf8Encode = map fromIntegral . go . ord- where-  go oc-   | oc <= 0x7f       = [oc]--   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)-                        , 0x80 + oc Data.Bits..&. 0x3f-                        ]--   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)-                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)-                        , 0x80 + oc Data.Bits..&. 0x3f-                        ]-   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)-                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)-                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)-                        , 0x80 + oc Data.Bits..&. 0x3f-                        ]----type Byte = Word8---- -------------------------------------------------------------------------------- The input type---type AlexInput = (AlexPosn,     -- current position,-                  Char,         -- previous char-                  [Byte],       -- pending bytes on current char-                  String)       -- current input string--ignorePendingBytes :: AlexInput -> AlexInput-ignorePendingBytes (p,c,ps,s) = (p,c,[],s)--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar (p,c,bs,s) = c--alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)-alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))-alexGetByte (p,c,[],[]) = Nothing-alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c -                                  (b:bs) = utf8Encode c-                              in p' `seq`  Just (b, (p', c, bs, s))---{-# LINE 92 "templates/wrappers.hs" #-}--{-# LINE 106 "templates/wrappers.hs" #-}--{-# LINE 121 "templates/wrappers.hs" #-}---- -------------------------------------------------------------------------------- Token positions---- `Posn' records the location of a token in the input text.  It has three--- fields: the address (number of chacaters preceding the token), line number--- and column of a token within the file. `start_pos' gives the position of the--- start of the file and `eof_pos' a standard encoding for the end of file.--- `move_pos' calculates the new position after traversing a given character,--- assuming the usual eight character tab stops.---data AlexPosn = AlexPn !Int !Int !Int-        deriving (Eq,Show)--alexStartPos :: AlexPosn-alexStartPos = AlexPn 0 1 1--alexMove :: AlexPosn -> Char -> AlexPosn-alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+7) `div` 8)*8+1)-alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1-alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)----- -------------------------------------------------------------------------------- Default monad--{-# LINE 242 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Monad (with ByteString input)--{-# LINE 333 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Basic wrapper--{-# LINE 360 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Basic wrapper, ByteString version--{-# LINE 378 "templates/wrappers.hs" #-}--{-# LINE 392 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Posn wrapper---- Adds text positions to the basic model.-----alexScanTokens :: String -> [token]-alexScanTokens str = go (alexStartPos,'\n',[],str)-  where go inp@(pos,_,_,str) =-          case alexScan inp 0 of-                AlexEOF -> []-                AlexError ((AlexPn _ line column),_,_,_) -> error $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)-                AlexSkip  inp' len     -> go inp'-                AlexToken inp' len act -> act pos (take len str) : go inp'------ -------------------------------------------------------------------------------- Posn wrapper, ByteString version--{-# LINE 424 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- GScan wrapper---- For compatibility with previous versions of Alex, and because we can.--alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\xd9\xff\xff\xff\xfd\xff\xff\xff\xcb\xff\xff\xff\xd6\xff\xff\xff\x9b\xff\xff\xff\xd6\x00\x00\x00\x2a\x01\x00\x00\xe6\xff\xff\xff\x29\x01\x00\x00\xa9\x01\x00\x00\x7c\x02\x00\x00\x69\x02\x00\x00\xfc\x02\x00\x00\x7c\x03\x00\x00\xe9\xff\xff\xff\xfc\x03\x00\x00\x7c\x04\x00\x00\xfc\x04\x00\x00\xa8\xff\xff\xff\x7c\x05\x00\x00\xfc\x05\x00\x00\x7c\x06\x00\x00\xfc\x06\x00\x00\xec\xff\xff\xff\xb4\x02\x00\x00\xbe\x02\x00\x00\xcc\x07\x00\x00\xd6\x07\x00\x00\xc7\xff\xff\xff\xe0\x07\x00\x00\x00\x00\x00\x00\x8b\x07\x00\x00\x5b\x08\x00\x00\x00\x00\x00\x00\x06\x08\x00\x00\x00\x00\x00\x00\x47\x08\x00\x00\x00\x00\x00\x00\xb8\x08\x00\x00\xe2\xff\xff\xff\x00\x00\x00\x00\xf9\x08\x00\x00\xf9\x09\x00\x00\xf3\xff\xff\xff\xb9\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x0a\x00\x00\x00\x00\x00\x00\x6b\x0a\x00\x00\x3b\x0b\x00\x00\x45\x0b\x00\x00\xb0\xff\xff\xff\x7f\x0b\x00\x00\x3f\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x0b\x00\x00\x86\x0c\x00\x00\x00\x00\x00\x00\xf2\x0b\x00\x00\x86\x0d\x00\x00\xe4\x0d\x00\x00\x81\x0d\x00\x00\x00\x00\x00\x00\xc2\x0c\x00\x00\xcc\x0c\x00\x00\xb5\xff\xff\xff\x00\x00\x00\x00\xc2\x0d\x00\x00\xc2\x0e\x00\x00\x82\x0e\x00\x00\x00\x00\x00\x00\x78\x0f\x00\x00\xc8\xff\xff\xff\xfe\xff\xff\xff\x78\x10\x00\x00\x38\x10\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x2e\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0f\x00\x00\x09\x11\x00\x00\xfe\x11\x00\x00\x49\x12\x00\x00\x94\x12\x00\x00\xdf\x12\x00\x00\x2a\x13\x00\x00\x75\x13\x00\x00\xc0\x13\x00\x00\x0b\x14\x00\x00\x56\x14\x00\x00\xa1\x14\x00\x00\xec\x14\x00\x00\x37\x15\x00\x00\x82\x15\x00\x00\xcd\x15\x00\x00\x18\x16\x00\x00\x63\x16\x00\x00\xae\x16\x00\x00\xf9\x16\x00\x00\x44\x17\x00\x00\x8f\x17\x00\x00\xda\x17\x00\x00\x25\x18\x00\x00\x70\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x18\x00\x00\x00\x00\x00\x00\x06\x19\x00\x00\x51\x19\x00\x00\x9c\x19\x00\x00\xe7\x19\x00\x00\x32\x1a\x00\x00\x7d\x1a\x00\x00\xc8\x1a\x00\x00\x13\x1b\x00\x00\x5e\x1b\x00\x00\xa9\x1b\x00\x00\xf4\x1b\x00\x00\x3f\x1c\x00\x00\x8a\x1c\x00\x00\xd5\x1c\x00\x00\x20\x1d\x00\x00\x6b\x1d\x00\x00\xb6\x1d\x00\x00\x01\x1e\x00\x00\x4c\x1e\x00\x00\x97\x1e\x00\x00\xe2\x1e\x00\x00\x2d\x1f\x00\x00\x78\x1f\x00\x00\xc3\x1f\x00\x00\x0e\x20\x00\x00\x59\x20\x00\x00\xa4\x20\x00\x00\xef\x20\x00\x00\x3a\x21\x00\x00\x85\x21\x00\x00\xd0\x21\x00\x00\x1b\x22\x00\x00\x66\x22\x00\x00\xb1\x22\x00\x00\xfc\x22\x00\x00\x47\x23\x00\x00\x92\x23\x00\x00\xdd\x23\x00\x00\x28\x24\x00\x00\x73\x24\x00\x00\xbe\x24\x00\x00\x09\x25\x00\x00\x54\x25\x00\x00\x9f\x25\x00\x00\xea\x25\x00\x00\x35\x26\x00\x00\x80\x26\x00\x00\xcb\x26\x00\x00\x16\x27\x00\x00\x61\x27\x00\x00\xac\x27\x00\x00\xf7\x27\x00\x00\x42\x28\x00\x00\x8d\x28\x00\x00\xd8\x28\x00\x00\x23\x29\x00\x00\x6e\x29\x00\x00\xb9\x29\x00\x00\x04\x2a\x00\x00\x4f\x2a\x00\x00\x9a\x2a\x00\x00\xe8\x2a\x00\x00\x33\x2b\x00\x00\x7e\x2b\x00\x00\xc9\x2b\x00\x00\x14\x2c\x00\x00\x5f\x2c\x00\x00\xaa\x2c\x00\x00\xf5\x2c\x00\x00\x40\x2d\x00\x00\x8b\x2d\x00\x00\xd6\x2d\x00\x00\x21\x2e\x00\x00\x6c\x2e\x00\x00\xb7\x2e\x00\x00\x02\x2f\x00\x00\x4d\x2f\x00\x00\x98\x2f\x00\x00\xe3\x2f\x00\x00\x2e\x30\x00\x00\x79\x30\x00\x00\xc4\x30\x00\x00\x0f\x31\x00\x00\x5a\x31\x00\x00\xa5\x31\x00\x00\xf0\x31\x00\x00\x3b\x32\x00\x00\x86\x32\x00\x00\xd1\x32\x00\x00\x1c\x33\x00\x00\x67\x33\x00\x00\xb2\x33\x00\x00\xfd\x33\x00\x00\x48\x34\x00\x00\x93\x34\x00\x00\xde\x34\x00\x00\x29\x35\x00\x00\x74\x35\x00\x00\xbf\x35\x00\x00\x0a\x36\x00\x00\x55\x36\x00\x00\xa0\x36\x00\x00\xeb\x36\x00\x00\x36\x37\x00\x00\x81\x37\x00\x00\xcc\x37\x00\x00\x17\x38\x00\x00\x62\x38\x00\x00\xad\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x0d\x00\x00\xe6\x0d\x00\x00\xf0\x0d\x00\x00\xfa\x0d\x00\x00\x04\x0e\x00\x00\xb3\x38\x00\x00\x00\x00\x00\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x51\x00\xff\xff\x5a\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x5b\x00\x77\x00\xef\x00\x0b\x00\x35\x00\x50\x00\x1b\x00\x4a\x00\x1e\x00\x34\x00\x3b\x00\x44\x00\x0c\x00\x2c\x00\x05\x00\x78\x00\x00\x00\x5d\x00\x01\x00\x00\x00\x08\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x58\x00\x53\x00\x03\x00\x59\x00\x04\x00\x5c\x00\x33\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x55\x00\x57\x00\x56\x00\x00\x00\xb9\x00\x78\x00\xc9\x00\xa8\x00\xbf\x00\xb3\x00\xd1\x00\xac\x00\xb9\x00\xb9\x00\xc0\x00\x9a\x00\xb9\x00\xb9\x00\xb7\x00\xb4\x00\xb9\x00\xb9\x00\xb9\x00\xae\x00\xc3\x00\x82\x00\xd9\x00\xb2\x00\x95\x00\xb9\x00\xb9\x00\xb9\x00\x0f\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x22\x00\x22\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7a\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\xff\xff\x00\x00\x06\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\xe8\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2d\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x17\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x02\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x22\x00\x22\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x0a\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x3e\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x0d\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x10\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2d\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x17\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x00\x00\x00\x00\x19\x00\x00\x00\x4a\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x3f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x40\x00\x10\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x32\x00\x14\x00\x26\x00\x26\x00\x26\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4e\x00\x0a\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x46\x00\x0e\x00\x39\x00\x39\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\x62\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x63\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x64\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x68\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\x69\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x6a\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x71\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x73\x00\xb9\x00\xb9\x00\x92\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x74\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x75\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x76\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xe4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x80\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xde\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x84\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x85\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x86\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xda\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x87\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x88\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xd7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x89\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8a\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x90\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x91\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x94\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x96\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xba\x00\xb9\x00\x9b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa9\x00\xaa\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x9d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xad\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x9f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xa0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xce\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xca\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xc8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xc7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x13\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbe\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xaf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xab\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xd0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x9e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x99\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x98\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x97\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x93\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x8e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x83\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x81\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x9c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x72\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x70\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x6f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x67\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x66\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x65\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x61\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x60\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xff\xff\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x5f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x5e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x48\x00\x0d\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3d\x00\x11\x00\x2f\x00\x2f\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x79\x00\x2f\x00\x2d\x00\x6f\x00\x20\x00\x2d\x00\x22\x00\x54\x00\x3a\x00\x2a\x00\x6e\x00\x27\x00\x28\x00\x6c\x00\x5a\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x3a\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x3a\x00\x5d\x00\xff\xff\x5f\x00\x5a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x27\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#--alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x24\x00\xff\xff\x29\x00\x29\x00\x2e\x00\x2e\x00\x31\x00\x31\x00\xff\xff\x38\x00\x38\x00\x3b\x00\xff\xff\x3b\x00\x3b\x00\x3c\x00\x3c\x00\x41\x00\x41\x00\xff\xff\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\x45\x00\x45\x00\x3b\x00\x49\x00\x49\x00\x4a\x00\xff\xff\x4a\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x4f\x00\xef\x00\xef\x00\xef\x00\x4a\x00\xff\xff\xff\xff\x51\x00\x51\x00\x51\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\x00\xff\xff"#--alex_accept = listArray (0::Int,240) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48)]-{-# LINE 80 "src/Data/API/Scan.x" #-}---type PToken = (AlexPosn,Token)--data Token-    = Semi-    | Bar-    | BInary-    | Bra-    | Ket-    | ColCol-    | Colon-    | Comma-    | Equals-    | LtEq-    | GtEq-    | Boolean-    | Integer-    | UTC-    | Query-    | Record-    | String-    | Json-    | Union-    | Version-    | With-    | Enum-    | Basic-    | Changes-    | Added-    | Removed-    | Renamed-    | Changed-    | Default-    | Field-    | Alternative-    | Migration-    | To-    | NOTHING-    | TRUE-    | FALSE-    | Readonly-    | UTCTIME  UTCTime-    | Comment  String-    | TypeIden String-    | VarIden  String-    | Intg     Int-    | Strg     String-    | ERROR-    deriving (Eq,Show)--utc_ :: AlexPosn -> String -> PToken-utc_ = mk $ \s -> maybe ERROR UTCTIME $ parseUTC_ s--line_comment :: AlexPosn -> String -> PToken-line_comment = mk $ Comment . munch_ws . tailSafe . tailSafe --block_comment :: AlexPosn -> String -> PToken-block_comment p (_:_:str) = -    case reverse $ munch_ws str of-      _:_:rc -> (p,Comment $ reverse $ munch_ws rc)-      _      -> error "Scan.line_comment"-block_comment _ _ = error "Scan.line_comment" --strip_qs :: (String->Token) -> AlexPosn -> String -> PToken-strip_qs f p (_:s) = (p,f $ initNote "Scan.strip_qs" s)-strip_qs _ _ _     = error "Scan.strip_qs"--munch_ws :: String -> String-munch_ws = dropWhile isSpace--simple :: Token -> AlexPosn -> String -> PToken-simple tk = mk $ const tk--intg :: AlexPosn -> String -> PToken-intg p s = (p,Intg $ readNote "Data.API.Scan.intg" s)--string :: AlexPosn -> String -> PToken-string = mk (Strg . f . chop)-  where-    f ""    = ""-    f (c:s) = case c of-                '\\' -> g s-                _    -> c : f s--    g ""    = ""-    g (c:s) = c : f s--chop :: String -> String-chop ""    = ""-chop (c:s) =-    case reverse s of-      ""   -> ""-      _:rs -> reverse rs--mk :: (String->Token) -> AlexPosn -> String -> PToken-mk f p s = (p,f s)--scan :: String -> [PToken]-scan = pp . alexScanTokens--pp :: [PToken] -> [PToken]-pp [] = []-pp (pt@(p@(AlexPn _ _ cn),_):inp) =-    case cn of-      1 -> (p,Semi):pt:pp inp-      _ ->          pt:pp inp--test :: IO ()-test = - do s <- getContents-    print (scan s)--alex_action_3 =  simple    Semi            -alex_action_4 =  simple    Bar             -alex_action_5 =  simple    Bra             -alex_action_6 =  simple    Ket             -alex_action_7 =  simple    ColCol          -alex_action_8 =  simple    Colon           -alex_action_9 =  simple    Equals          -alex_action_10 =  simple    LtEq            -alex_action_11 =  simple    GtEq            -alex_action_12 =  simple    Query           -alex_action_13 =  simple    Comma           -alex_action_14 =  simple    Version         -alex_action_15 =  simple    With            -alex_action_16 =  simple    Integer         -alex_action_17 =  simple    Boolean         -alex_action_18 =  simple    UTC             -alex_action_19 =  simple    String          -alex_action_20 =  simple    BInary          -alex_action_21 =  simple    Json            -alex_action_22 =  simple    Record          -alex_action_23 =  simple    Union           -alex_action_24 =  simple    Enum            -alex_action_25 =  simple    Basic           -alex_action_26 =  simple    Changes         -alex_action_27 =  simple    Added           -alex_action_28 =  simple    Removed         -alex_action_29 =  simple    Renamed         -alex_action_30 =  simple    Changed         -alex_action_31 =  simple    Default         -alex_action_32 =  simple    Field           -alex_action_33 =  simple    Alternative     -alex_action_34 =  simple    Migration       -alex_action_35 =  simple    To              -alex_action_36 =  simple    NOTHING         -alex_action_37 =  simple    TRUE            -alex_action_38 =  simple    FALSE           -alex_action_39 =  simple    Readonly        -alex_action_40 =  utc_                      -alex_action_41 =  mk        TypeIden        -alex_action_42 =  strip_qs  TypeIden        -alex_action_43 =  mk        VarIden         -alex_action_44 =  strip_qs  VarIden         -alex_action_45 =  string                    -alex_action_46 =  intg                      -alex_action_47 =  line_comment              -alex_action_48 =  block_comment             -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<command-line>" #-}--------# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 7 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- ALEX TEMPLATE------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine--{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define GTE(n,m) (tagToEnum# (n >=# m))-#define EQ(n,m) (tagToEnum# (n ==# m))-#else-#define GTE(n,m) (n >=# m)-#define EQ(n,m) (n ==# m)-#endif-{-# LINE 51 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN-  narrow16Int# i-  where-        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)-        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))-        low  = int2Word# (ord# (indexCharOffAddr# arr off'))-        off' = off *# 2#-#else-  indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN-  narrow32Int# i-  where-   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`-		     (b2 `uncheckedShiftL#` 16#) `or#`-		     (b1 `uncheckedShiftL#` 8#) `or#` b0)-   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))-   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))-   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))-   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))-   off' = off *# 4#-#else-  indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a-  = AlexEOF-  | AlexError  !AlexInput-  | AlexSkip   !AlexInput !Int-  | AlexToken  !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))-  = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))-  = case alex_scan_tkn user input 0# input sc AlexNone of-	(AlexNone, input') ->-		case alexGetByte input of-			Nothing -> ----				   AlexEOF-			Just _ ->----				   AlexError input'--	(AlexLastSkip input'' len, _) ->----		AlexSkip input'' len--	(AlexLastAcc k input''' len, _) ->----		AlexToken input''' len k----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =-  input `seq` -- strict in the input-  let -	new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))-  in-  new_acc `seq`-  case alexGetByte input of-     Nothing -> (new_acc, input)-     Just (c, new_input) -> ----      case fromIntegral c of { (I# (ord_c)) ->-        let-                base   = alexIndexInt32OffAddr alex_base s-                offset = (base +# ord_c)-                check  = alexIndexInt16OffAddr alex_check offset-		-                new_s = if GTE(offset,0#) && EQ(check,ord_c)-			  then alexIndexInt16OffAddr alex_table offset-			  else alexIndexInt16OffAddr alex_deflt s-	in-        case new_s of-	    -1# -> (new_acc, input)-		-- on an error, we want to keep the input *before* the-		-- character that failed, not after.-    	    _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)-                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)-			new_input new_s new_acc-      }-  where-	check_accs (AlexAccNone) = last_acc-	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))-	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))-{-# LINE 198 "templates/GenericTemplate.hs" #-}--data AlexLastAcc a-  = AlexNone-  | AlexLastAcc a !AlexInput !Int-  | AlexLastSkip  !AlexInput !Int--instance Functor AlexLastAcc where-    fmap f AlexNone = AlexNone-    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z-    fmap f (AlexLastSkip x y) = AlexLastSkip x y--data AlexAcc a user-  = AlexAccNone-  | AlexAcc a-  | AlexAccSkip-{-# LINE 242 "templates/GenericTemplate.hs" #-}---- used by wrappers-iUnbox (I# (i)) = i
main/Data/API/MigrationTool.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedStrings #-} module Data.API.MigrationTool     ( main     ) where@@ -73,7 +74,7 @@ data ChangeTag = None     deriving (Read, Show) -customMigrations :: CustomMigrations ChangeTag ChangeTag ChangeTag+customMigrations :: CustomMigrations JS.Object JS.Value ChangeTag ChangeTag ChangeTag customMigrations = CustomMigrations (nope JS.Object) (const noSchemaChanges)                                     (nope id)        (const noSchemaChanges)                                     (nope id)
+ main/Data/API/PerfTest.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE OverloadedStrings #-}++module Data.API.PerfTest+    ( main+    ) where++import           Data.API.API.DSL+import qualified Data.API.API.Gen               as Gen+import           Data.API.NormalForm+import           Data.API.Types+import qualified Data.API.Value                 as Value++import           Control.DeepSeq+import           Control.Exception+import qualified Data.Aeson                     as JS+import qualified Codec.Serialise     as CBOR+import           Data.Binary.Serialise.CBOR.Extra+import           System.Environment+import           Test.QuickCheck++tyDesc :: APIType++{-+type T = [UTCTime]+tyDesc = TyList (TyBasic BTutc)+-}++type T = Gen.APISpec+tyDesc = TyName "APISpec"++newtype V = V { _V :: Value.Value }++instance CBOR.Serialise V where+  encode (V v) = Value.encode v+  decode = V <$!> Value.decode (apiNormalForm apiAPI) tyDesc++main :: IO ()+main = do+  args <- getArgs+  case args of+    ["read"        , fp] -> do x <- CBOR.readFileDeserialise fp+                               _ <- evaluate (force (x :: T))+                               return ()+    ["read-aeson"  , fp] -> do x <- CBOR.readFileDeserialise fp+                               _ <- evaluate (force (x :: JS.Value))+                               return ()+    ["read-generic", fp] -> do x <- CBOR.readFileDeserialise fp+                               _ <- evaluate (force (_V x))+                               return ()+    ["write"        ,fp] -> do x <- generate (resize 500 arbitrary)+                               CBOR.writeFileSerialise fp (x :: T)+    ["write"      ,fp,i] -> do x <- generate (resize (read i) arbitrary)+                               CBOR.writeFileSerialise fp (x :: T)+    _ -> error "perf-test (read|read-generic|write) <file>"
src/Data/API/API.hs view
@@ -6,6 +6,8 @@ module Data.API.API     ( apiAPI     , extractAPI+    , convertAPI+    , unconvertAPI     ) where  import           Data.API.API.DSL@@ -18,17 +20,20 @@ import qualified Data.Text                      as T import           Control.Applicative import           Text.Regex+import           Prelude   -- | Take an API spec and generate a JSON description of the API- extractAPI :: API -> Value-extractAPI api = toJSON $ map convert [ an | ThNode an <- api ]+extractAPI = toJSON . convertAPI +convertAPI :: API -> D.APISpec+convertAPI api = [ convert an | ThNode an <- api ]+ convert :: APINode -> D.APINode convert (APINode{..}) =     D.APINode-        { D._an_name    = T.pack $ _TypeName      anName+        { D._an_name    = _TypeName               anName         , D._an_comment = T.pack                  anComment         , D._an_prefix  = T.pack $ CI.original    anPrefix         , D._an_spec    = convert_spec            anSpec@@ -45,10 +50,10 @@       SpSynonym ty -> D.SP_synonym $ convert_type              ty  convert_conversion :: (FieldName,FieldName) -> D.Conversion-convert_conversion (i,p) =+convert_conversion (inj,prj) =     D.Conversion-        { D._cv_injection  = T.pack $ _FieldName p-        , D._cv_projection = T.pack $ _FieldName i+        { D._cv_injection  = _FieldName inj+        , D._cv_projection = _FieldName prj         }  convert_specnt :: SpecNewtype -> D.SpecNewtype@@ -70,7 +75,7 @@   where     f (fn,fty) =         D.Field-            { D._fd_name     = T.pack $ _FieldName fn+            { D._fd_name     = _FieldName fn             , D._fd_type     = convert_type $ ftType fty             , D._fd_readonly = ftReadOnly fty             , D._fd_default  = convert_default <$> ftDefault fty@@ -82,7 +87,7 @@   where     f (fn,(ty,co)) =         D.Field-            { D._fd_name     = T.pack $ _FieldName fn+            { D._fd_name     = _FieldName fn             , D._fd_type     = convert_type ty             , D._fd_readonly = False             , D._fd_default  = Nothing@@ -90,7 +95,7 @@             }  convert_alts :: [(FieldName,MDComment)] -> [T.Text]-convert_alts fns = map (T.pack . _FieldName . fst) fns+convert_alts fns = map (_FieldName . fst) fns  convert_type :: APIType -> D.APIType convert_type ty0 =@@ -102,7 +107,7 @@       TyJSON        -> D.TY_json    0  convert_ref :: TypeName -> D.TypeRef-convert_ref (TypeName tn) = D.TypeRef (T.pack tn)+convert_ref (TypeName tn) = D.TypeRef tn  convert_basic :: BasicType -> D.BasicType convert_basic bt =@@ -128,10 +133,13 @@ instance FromJSONWithErrs Thing where     parseJSONWithErrs v = (ThNode . unconvert) <$> parseJSONWithErrs v +unconvertAPI :: D.APISpec -> API+unconvertAPI = map (ThNode . unconvert)+ unconvert :: D.APINode -> APINode unconvert (D.APINode{..}) =     APINode-        { anName    = TypeName $ T.unpack       _an_name+        { anName    = TypeName                  _an_name         , anComment = T.unpack                  _an_comment         , anPrefix  = CI.mk $ T.unpack          _an_prefix         , anSpec    = unconvert_spec            _an_spec@@ -149,8 +157,8 @@  unconvert_conversion :: D.Conversion -> (FieldName, FieldName) unconvert_conversion c =-    ( FieldName $ T.unpack $ D._cv_injection  c-    , FieldName $ T.unpack $ D._cv_projection c+    ( FieldName $ D._cv_injection  c+    , FieldName $ D._cv_projection c     )  unconvert_specnt :: D.SpecNewtype -> SpecNewtype@@ -170,7 +178,7 @@ unconvert_fields :: [D.Field] -> [(FieldName, FieldType)] unconvert_fields al = map f al   where-    f fld = ( FieldName $ T.unpack $ D._fd_name fld+    f fld = ( FieldName $ D._fd_name fld             , FieldType { ftType     = unconvert_type $ D._fd_type fld                         , ftReadOnly = D._fd_readonly fld                         , ftDefault  = unconvert_default <$> D._fd_default fld@@ -181,13 +189,13 @@ unconvert_union :: [D.Field] -> [(FieldName, (APIType, MDComment))] unconvert_union al = map f al   where-    f fld = ( FieldName $ T.unpack $ D._fd_name fld+    f fld = ( FieldName $ D._fd_name fld             , ( unconvert_type $ D._fd_type fld               , T.unpack $ D._fd_comment fld             ))  unconvert_alts :: [T.Text] -> [(FieldName,MDComment)]-unconvert_alts fns = map ((\x -> (x, "")) . FieldName . T.unpack) fns+unconvert_alts fns = map ((\x -> (x, "")) . FieldName) fns  unconvert_type :: D.APIType -> APIType unconvert_type ty0 =@@ -199,7 +207,7 @@       D.TY_json _     -> TyJSON  unconvert_ref :: D.TypeRef -> TypeName-unconvert_ref (D.TypeRef tn) = TypeName $ T.unpack tn+unconvert_ref (D.TypeRef tn) = TypeName tn  unconvert_basic :: D.BasicType -> BasicType unconvert_basic bt =
src/Data/API/API/Gen.hs view
@@ -18,10 +18,15 @@ $(generateAPITools apiAPI                    [ enumTool                    , jsonTool'+                   , cborTool+                   , deepSeqTool                    , quickCheckTool                    , lensTool                    , safeCopyTool                    , exampleTool                    , samplesTool   (mkName "apiAPISamples")-                   , jsonTestsTool (mkName "apiAPISimpleTests")+                   , jsonTestsTool (mkName "apiAPITestsJSON")+                   , cborTestsTool (mkName "apiAPITestsCBOR")+                   , cborToJSONTestsTool 'apiAPI (mkName "apiAPITestsCBORToJSON")+                   , jsonToCBORTestsTool 'apiAPI (mkName "apiAPITestsJSONToCBOR")                    ])
src/Data/API/Changes.hs view
@@ -1,10 +1,10 @@-{-# OPTIONS_GHC -fno-warn-deprecations #-} {-# LANGUAGE TemplateHaskell   #-}  -- | This module deals with validating API changelogs and migrating -- JSON data between different versions of a schema. module Data.API.Changes     ( migrateDataDump+    , migrateDataDump'        -- * Validating changelogs     , validateChanges@@ -23,6 +23,7 @@       -- * Custom migrations     , CustomMigrations(..)     , mkRecordMigration+    , mkRecordMigration'     , mkRecordMigrationSchema     , noDataChanges     , noSchemaChanges@@ -53,17 +54,20 @@     , prettyValueErrorPosition     ) where +import           Data.API.Changes.Types+import           Data.API.Error import           Data.API.JSON import           Data.API.NormalForm-import           Data.API.PP+import           Data.API.TH.Compat import           Data.API.Types import           Data.API.Utils+import           Data.API.Value as Value+import           Data.Binary.Serialise.CBOR.Extra  import           Control.Applicative-import           Control.Monad+import           Control.Monad (guard, foldM, void) import qualified Data.Aeson as JS-import qualified Data.ByteString.Char8 as B-import qualified Data.ByteString.Base64 as B64+import           Data.List import           Data.Map (Map) import qualified Data.Map as Map import           Data.Maybe@@ -72,9 +76,8 @@ import qualified Data.HashMap.Strict as HMap import qualified Data.Vector as V import qualified Data.Text as T-import           Data.Version import           Data.Time-import           Data.List+import           Data.Version import           Language.Haskell.TH import           Safe @@ -95,7 +98,7 @@                 => (API, Version)               -- ^ Starting schema and version                 -> (API, VersionExtra)          -- ^ Ending schema and version                 -> APIChangelog                 -- ^ Log of changes, containing both versions-                -> CustomMigrations db rec fld  -- ^ Custom migration functions+                -> CustomMigrations JS.Object JS.Value db rec fld  -- ^ Custom migration functions                 -> TypeName                     -- ^ Name of the dataset's type                 -> DataChecks                   -- ^ How thoroughly to validate changes                 -> JS.Value                     -- ^ Dataset to be migrated@@ -107,60 +110,24 @@     db' <- applyChangesToDatabase root custom' db changes  ?!? uncurry ValueError     return (db', warnings) -data MigrateFailure-    = ValidateFailure ValidateFailure-    | ValueError ValueError Position-    deriving (Eq, Show)+migrateDataDump' :: (Read db, Read rec, Read fld)+                => (API, Version)               -- ^ Starting schema and version+                -> (API, VersionExtra)          -- ^ Ending schema and version+                -> APIChangelog                 -- ^ Log of changes, containing both versions+                -> CustomMigrations Record Value db rec fld  -- ^ Custom migration functions+                -> TypeName                     -- ^ Name of the dataset's type+                -> DataChecks                   -- ^ How thoroughly to validate changes+                -> Value.Value                  -- ^ Dataset to be migrated+                -> Either MigrateFailure (Value.Value, [MigrateWarning])+migrateDataDump' startApi endApi changelog custom root chks db = do+    let custom' = readCustomMigrations custom+    (changes, warnings) <- validateChanges' startApi endApi changelog custom' root chks+                                                           ?!? ValidateFailure+    db' <- applyChangesToDatabase' root custom' db changes  ?!? uncurry ValueError+    return (db', warnings) -type MigrateWarning = ValidateWarning ---------------------- The key types--- -type APIWithChangelog = (API, APIChangelog)---- | An API changelog, consisting of a list of versions with the--- changes from one version to the next.  The versions must be in--- descending order (according to the 'Ord' 'Version' instance).-data APIChangelog =-     -- | The changes from the previous version up to this version.-     ChangesUpTo VersionExtra [APIChange] APIChangelog-     -- | The initial version-   | ChangesStart Version-    deriving (Eq, Show)---- | A single change within a changelog-data APIChange-    = ChAddType       TypeName NormTypeDecl-    | ChDeleteType    TypeName-    | ChRenameType    TypeName TypeName--      -- Specific changes for record types-    | ChAddField      TypeName FieldName APIType (Maybe DefaultValue)-    | ChDeleteField   TypeName FieldName-    | ChRenameField   TypeName FieldName FieldName-    | ChChangeField   TypeName FieldName APIType MigrationTag--      -- Changes for union types-    | ChAddUnionAlt    TypeName FieldName APIType-    | ChDeleteUnionAlt TypeName FieldName-    | ChRenameUnionAlt TypeName FieldName FieldName--      -- Changes for enum types-    | ChAddEnumVal    TypeName FieldName-    | ChDeleteEnumVal TypeName FieldName-    | ChRenameEnumVal TypeName FieldName FieldName--      -- Custom migrations-    | ChCustomType    TypeName MigrationTag-    | ChCustomAll     MigrationTag-    deriving (Eq, Show)---- | Within the changelog, custom migrations are represented as--- strings, so we have less type-safety.-type MigrationTag = String- -- | Custom migrations used in the changelog must be implemented in -- Haskell, and supplied in this record.  There are three kinds: --@@ -179,17 +146,17 @@ -- the enumeration types generated by 'generateMigrationKinds', which -- correspond to the exact set of custom migration tags used in the -- changelog.-data CustomMigrations db ty fld = CustomMigrations-    { databaseMigration       :: db -> JS.Object -> Either ValueError JS.Object+data CustomMigrations o v db ty fld = CustomMigrations+    { databaseMigration       :: db -> o -> Either ValueError o     , databaseMigrationSchema :: db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)-    , typeMigration           :: ty -> JS.Value -> Either ValueError JS.Value+    , typeMigration           :: ty -> v -> Either ValueError v     , typeMigrationSchema     :: ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)-    , fieldMigration          :: fld -> JS.Value -> Either ValueError JS.Value }+    , fieldMigration          :: fld -> v -> Either ValueError v } -type CustomMigrationsTagged = CustomMigrations MigrationTag MigrationTag MigrationTag+type CustomMigrationsTagged o v = CustomMigrations o v MigrationTag MigrationTag MigrationTag  readCustomMigrations :: (Read db, Read ty, Read fld)-                     => CustomMigrations db ty fld -> CustomMigrationsTagged+                     => CustomMigrations o v db ty fld -> CustomMigrationsTagged o v readCustomMigrations (CustomMigrations db dbs r rs f) =     CustomMigrations (db . read) (dbs . read) (r . read) (rs . read) (f . read) @@ -199,6 +166,11 @@ mkRecordMigration f (JS.Object o) = JS.Object <$> f o mkRecordMigration _ v             = Left $ JSONError $ expectedObject v +mkRecordMigration' :: (Record -> Either ValueError Record)+                   -> (Value  -> Either ValueError Value)+mkRecordMigration' f (Record xs) = Record <$> f xs+mkRecordMigration' _ v           = Left $ JSONError $ expectedObject (JS.toJSON v)+ -- | Lift a schema change on record types to work on arbitrary type declarations mkRecordMigrationSchema :: TypeName                         -> (NormRecordType -> Either ApplyFailure (Maybe NormRecordType))@@ -238,20 +210,6 @@ -- Changelog utils -- --- | Represents either a released version (with a version number) or--- the version under development, which is newer than any release-data VersionExtra = Release Version-                  | DevVersion-  deriving (Eq, Ord, Show)--showVersionExtra :: VersionExtra -> String-showVersionExtra (Release v) = showVersion v-showVersionExtra DevVersion  = "development"--instance PP VersionExtra where-  pp = showVersionExtra-- -- | The earliest version in the changelog changelogStartVersion :: APIChangelog -> Version changelogStartVersion (ChangesStart v) = v@@ -307,28 +265,6 @@ -- Representing update positions -- --- | Represents the positions in a declaration to apply an update-data UpdateDeclPos-    = UpdateHere   (Maybe UpdateDeclPos)-    | UpdateRecord (Map FieldName (Maybe UpdateTypePos))-    | UpdateUnion  (Map FieldName (Maybe UpdateTypePos))-    | UpdateType   UpdateTypePos-    deriving (Eq, Show)---- | Represents the positions in a type to apply an update-data UpdateTypePos-    = UpdateList UpdateTypePos-    | UpdateMaybe UpdateTypePos-    | UpdateNamed TypeName-    deriving (Eq, Show)--data APITableChange-      -- | The pair of an APIChange and the positions in which to apply it-    = APIChange APIChange (Map TypeName UpdateDeclPos)-      -- | Request to validate the dataset against the given API-    | ValidateData NormAPI-    deriving (Eq, Show)- -- | Given a type to be modified, find the positions in which each -- type in the API must be updated findUpdatePos :: TypeName -> NormAPI -> Map TypeName UpdateDeclPos@@ -366,70 +302,13 @@ -- Validating API changes -- --- | Errors that may be discovered when validating a changelog-data ValidateFailure-        -- | the changelog must be in descending order of versions-    = ChangelogOutOfOrder { vfLaterVersion   :: VersionExtra-                          , vfEarlierVersion :: VersionExtra }-        -- | forbid migrating from one version to an earlier version-    | CannotDowngrade { vfFromVersion :: VersionExtra-                      , vfToVersion   :: VersionExtra }-        -- | an API uses types that are not declared-    | ApiInvalid { vfInvalidVersion      :: VersionExtra-                 , vfMissingDeclarations :: Set TypeName }-        -- | changelog entry does not apply-    | ChangelogEntryInvalid { vfSuccessfullyApplied :: [APITableChange]-                            , vfFailedToApply       :: APIChange-                            , vfApplyFailure        :: ApplyFailure }-        -- | changelog is incomplete-        --   (ie all entries apply ok but result isn't the target api)-    | ChangelogIncomplete { vfChangelogVersion :: VersionExtra-                          , vfTargetVersion    :: VersionExtra-                          , vfDifferences      :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) }-  deriving (Eq, Show)--data ValidateWarning = ValidateWarning -- add warnings about bits we cannot check (opaque custom)-  deriving Show---- | Errors that may occur applying a single API change-data ApplyFailure-    = TypeExists           { afExistingType  :: TypeName }     -- ^ for adding or renaming type-    | TypeDoesNotExist     { afMissingType   :: TypeName }     -- ^ for deleting or renaming a type-    | TypeWrongKind        { afTypeName      :: TypeName-                           , afExpectedKind  :: TypeKind }     -- ^ e.g. it's not a record type-    | TypeInUse            { afTypeName      :: TypeName }     -- ^ cannot delete/modify types that are still used-    | TypeMalformed        { afType          :: APIType-                           , afMissingTypes  :: Set TypeName } -- ^ type refers to a non-existent type-    | DeclMalformed        { afTypeName      :: TypeName-                           , afDecl          :: NormTypeDecl-                           , afMissingTypes  :: Set TypeName } -- ^ decl refers to a non-existent type-    | FieldExists          { afTypeName      :: TypeName-                           , afTypeKind      :: TypeKind-                           , afExistingField :: FieldName }    -- ^ for adding or renaming a field-    | FieldDoesNotExist    { afTypeName      :: TypeName-                           , afTypeKind      :: TypeKind-                           , afMissingField  :: FieldName }    -- ^ for deleting or renaming a field-    | FieldBadDefaultValue { afTypeName      :: TypeName-                           , afFieldName     :: FieldName-                           , afFieldType     :: APIType-                           , afBadDefault    :: DefaultValue } -- ^ for adding a field, must be a default-                                                               --   value compatible with the type-    | DefaultMissing       { afTypeName      :: TypeName-                           , afFieldName     :: FieldName }    -- ^ for adding a field to a table-    | TableChangeError     { afCustomMessage :: String }       -- ^ custom error in tableChange-  deriving (Eq, Show)--data TypeKind = TKRecord | TKUnion | TKEnum | TKNewtype | TKTypeSynonym-  deriving (Eq, Show)-- -- | Check that a changelog adequately describes how to migrate from -- one version to another. validateChanges :: (Read db, Read rec, Read fld)                 => (API, Version)              -- ^ Starting schema and version                 -> (API, VersionExtra)         -- ^ Ending schema and version                 -> APIChangelog                -- ^ Changelog to be validated-                -> CustomMigrations db rec fld -- ^ Custom migration functions+                -> CustomMigrations o v db rec fld -- ^ Custom migration functions                 -> TypeName                    -- ^ Name of the dataset's type                 -> DataChecks                  -- ^ How thoroughly to validate changes                 -> Either ValidateFailure [ValidateWarning]@@ -442,7 +321,7 @@ validateChanges' :: (API, Version)         -- ^ Starting schema and version                  -> (API, VersionExtra)    -- ^ Ending schema and version                  -> APIChangelog           -- ^ Changelog to be validated-                 -> CustomMigrationsTagged -- ^ Custom migration functions+                 -> CustomMigrationsTagged o v -- ^ Custom migration functions                  -> TypeName               -- ^ Name of the dataset's type                  -> DataChecks             -- ^ How thoroughly to validate changes                  -> Either ValidateFailure ([APITableChange], [ValidateWarning])@@ -481,7 +360,7 @@ -- a list of the changes with appropriate TableChanges interspersed. -- On failure, return the list of successfully applied changes, the -- change that failed and the reason for the failure.-applyAPIChangesToAPI :: TypeName -> CustomMigrationsTagged -> DataChecks+applyAPIChangesToAPI :: TypeName -> CustomMigrationsTagged o v -> DataChecks                      -> [APIChange] -> NormAPI                      -> Either ValidateFailure (NormAPI, [APITableChange]) applyAPIChangesToAPI root custom chks changes api = do@@ -494,13 +373,13 @@     addV a cs                      = ValidateData a : cs  -- | Apply the API change-doChangeAPI :: TypeName -> CustomMigrationsTagged -> DataChecks+doChangeAPI :: TypeName -> CustomMigrationsTagged o v -> DataChecks             -> (NormAPI, [APITableChange]) -> APIChange             -> Either ValidateFailure (NormAPI, [APITableChange]) doChangeAPI root custom chks (api, changes) change = do     (api', pos) <- applyAPIChangeToAPI root custom change api                        ?!? ChangelogEntryInvalid changes change-    let changes' = APIChange change pos : changes+    let changes' = APIChange api change pos : changes         changes'' | validateAfter chks change = ValidateData api' : changes'                   | otherwise                 = changes'     return (api', changes'')@@ -510,7 +389,7 @@ -- each change in that context, and that we end up with the API we expect -- and (2) getting the intermediate APIs during data migration, because we need -- the schema of the intermediate data as part of applying the migration.-applyAPIChangeToAPI :: TypeName -> CustomMigrationsTagged -> APIChange -> NormAPI+applyAPIChangeToAPI :: TypeName -> CustomMigrationsTagged o v -> APIChange -> NormAPI                     -> Either ApplyFailure (NormAPI, Map TypeName UpdateDeclPos)  applyAPIChangeToAPI _ _ (ChAddType tname tdecl) api = do@@ -635,9 +514,6 @@          , Map.singleton root (UpdateHere Nothing))  -lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl-lookupType tname api = Map.lookup tname api ?! TypeDoesNotExist tname- expectRecordType :: NormTypeDecl -> Maybe (Map FieldName APIType) expectRecordType (NRecordType rinfo) = Just rinfo expectRecordType _                   = Nothing@@ -660,16 +536,16 @@ -- We assume the changes have already been validated, and that the data -- matches the API. ---applyChangesToDatabase :: TypeName -> CustomMigrationsTagged+applyChangesToDatabase :: TypeName -> CustomMigrationsTagged JS.Object JS.Value                        -> JS.Value -> [APITableChange]                        -> Either (ValueError, Position) JS.Value applyChangesToDatabase root custom = foldM (applyChangeToDatabase root custom)   -- just apply each of the individual changes in sequence to the whole dataset -applyChangeToDatabase :: TypeName -> CustomMigrationsTagged+applyChangeToDatabase :: TypeName -> CustomMigrationsTagged JS.Object JS.Value                       -> JS.Value -> APITableChange                       -> Either (ValueError, Position) JS.Value-applyChangeToDatabase root custom v (APIChange c upds) =+applyChangeToDatabase root custom v (APIChange _ c upds) =     updateTypeAt upds (applyChangeToData c custom) (UpdateNamed root) v [] applyChangeToDatabase root _      v (ValidateData api) = do     dataMatchesNormAPI root api v@@ -703,38 +579,36 @@  -- | This actually applies the change to the data value, assuming it -- is already in the correct place-applyChangeToData :: APIChange -> CustomMigrationsTagged+applyChangeToData :: APIChange -> CustomMigrationsTagged JS.Object JS.Value                   -> JS.Value -> Position -> Either (ValueError, Position) JS.Value  applyChangeToData (ChAddField tname fname ftype mb_defval) _ =   case mb_defval <|> defaultValueForType ftype of     Just defval -> let newFieldValue = defaultValueAsJsValue defval-                   in withObject (\ v _ -> pure $ HMap.insert (fieldKey fname) newFieldValue v)+                   in withObject (\ v _ -> pure $ HMap.insert (_FieldName fname) newFieldValue v)     Nothing     -> \ _ p -> Left (InvalidAPI (DefaultMissing tname fname), p)  applyChangeToData (ChDeleteField _ fname) _ =-    withObject (\ v _ -> pure $ HMap.delete (fieldKey fname) v)+    withObject (\ v _ -> pure $ HMap.delete (_FieldName fname) v)  applyChangeToData (ChRenameField _ fname fname') _ =-    withObject $ \rec p -> case HMap.lookup k_fname rec of-                           Just field -> renameField field rec-                           Nothing    -> Left (JSONError MissingField, InField k_fname : p)+    withObject $ \rec p -> case HMap.lookup (_FieldName fname) rec of+                           Just field -> rename field rec+                           Nothing    -> Left (JSONError MissingField, inField fname : p)   where-    k_fname       = fieldKey fname-    k_fname'      = fieldKey fname'-    renameField x = pure . HMap.insert k_fname' x . HMap.delete k_fname+    rename x = pure . HMap.insert (_FieldName fname') x . HMap.delete (_FieldName fname)  applyChangeToData (ChChangeField _ fname _ftype tag) custom =-    withObjectField (fieldKey fname) (liftMigration $ fieldMigration custom tag)+    withObjectField (_FieldName fname) (liftMigration $ fieldMigration custom tag)  applyChangeToData (ChRenameUnionAlt _ fname fname') _ = withObject $ \un p ->     case HMap.toList un of-        [(k, r)] | k == fieldKey fname -> return $ HMap.singleton (fieldKey fname') r-                 | otherwise           -> return un+        [(k, r)] | k == _FieldName fname -> return $ HMap.singleton (_FieldName fname') r+                 | otherwise             -> return un         _ -> Left (JSONError $ SyntaxError "Not singleton", p)  applyChangeToData (ChRenameEnumVal _ fname fname') _ = withString $ \s _ ->-    if s == fieldKey fname then return (fieldKey fname')+    if s == _FieldName fname then return (_FieldName fname')                            else return s  applyChangeToData (ChCustomType _ tag)   custom = liftMigration $ typeMigration custom tag@@ -753,17 +627,119 @@                  -> (a -> Position -> Either (ValueError, Position) b) liftMigration f v p = f v ?!? flip (,) p ++---------------------------------------------------------------------+-- Performing data transformation (new generic value representation)+--++applyChangesToDatabase' :: TypeName -> CustomMigrationsTagged Record Value+                        -> Value.Value -> [APITableChange]+                        -> Either (ValueError, Position) Value.Value+applyChangesToDatabase' root custom = foldM (applyChangeToDatabase' root custom)+  -- just apply each of the individual changes in sequence to the whole dataset++applyChangeToDatabase' :: TypeName -> CustomMigrationsTagged Record Value+                       -> Value.Value -> APITableChange+                       -> Either (ValueError, Position) Value.Value+applyChangeToDatabase' root custom v (APIChange api c upds) =+    updateTypeAt' upds (applyChangeToData' api c custom) (UpdateNamed root) v []+applyChangeToDatabase' root _      v (ValidateData api) = do+    matchesNormAPI api (TyName root) v []+    return v+++-- | Apply an update at the given position in a declaration's value+updateDeclAt' :: Map TypeName UpdateDeclPos+              -> (Value.Value -> Position -> Either (ValueError, Position) Value.Value)+              -> UpdateDeclPos+              -> Value.Value -> Position -> Either (ValueError, Position) Value.Value+updateDeclAt' _    alter (UpdateHere Nothing)    v p = alter v p+updateDeclAt' upds alter (UpdateHere (Just upd)) v p = flip alter p =<< updateDeclAt' upds alter upd v p+updateDeclAt' upds alter (UpdateRecord upd_flds) v p = do+    xs <- expectRecord v p+    Record <$!> mapM update xs+  where+    update x@(Field fn v') = case Map.lookup fn upd_flds of+        Just Nothing    -> pure x+        Just (Just utp) -> Field fn <$!> updateTypeAt' upds alter utp v' (inField fn : p)+        Nothing         -> Left (JSONError UnexpectedField, inField fn : p)+updateDeclAt' upds alter (UpdateUnion upd_alts)  v p = do+    (fn, v') <- expectUnion v p+    case Map.lookup fn upd_alts of+        Just Nothing    -> pure v+        Just (Just utp) -> Union fn <$!> updateTypeAt' upds alter utp v' (inField fn : p)+        Nothing         -> Left (JSONError UnexpectedField, inField fn : p)+updateDeclAt' upds alter (UpdateType upd)        v p = updateTypeAt' upds alter upd v p++-- | Apply an update at the given position in a type's value+updateTypeAt' :: Map TypeName UpdateDeclPos+             -> (Value.Value -> Position -> Either (ValueError, Position) Value.Value)+             -> UpdateTypePos+             -> Value.Value -> Position -> Either (ValueError, Position) Value.Value+updateTypeAt' upds alter (UpdateList upd)    v p = do+    xs <- expectList v p+    List <$!> mapM (\ (i, v') -> updateTypeAt' upds alter upd v' (InElem i : p)) (zip [0..] xs)+updateTypeAt' upds alter (UpdateMaybe upd)   v p = do+    mb <- expectMaybe v p+    case mb of+      Nothing -> pure v+      Just v' -> Maybe . Just <$!> updateTypeAt' upds alter upd v' p+updateTypeAt' upds alter (UpdateNamed tname) v p = case Map.lookup tname upds of+    Just upd -> updateDeclAt' upds alter upd v p+    Nothing  -> pure v+++-- | This actually applies the change to the data value, assuming it+-- is already in the correct place+applyChangeToData' :: NormAPI -> APIChange -> CustomMigrationsTagged Record Value+                  -> Value.Value -> Position -> Either (ValueError, Position) Value.Value++applyChangeToData' api (ChAddField tname fname ftype mb_defval) _ v p =+  case mb_defval <|> defaultValueForType ftype of+    Just defval -> case fromDefaultValue api ftype defval of+                     Just v' -> Record . insertField fname v' <$!> expectRecord v p+                     Nothing -> Left (InvalidAPI (FieldBadDefaultValue tname fname ftype defval), p)+    Nothing -> Left (InvalidAPI (DefaultMissing tname fname), p)++applyChangeToData' _ (ChDeleteField _ fname) _ v p =+    Record . deleteField fname <$!> expectRecord v p++applyChangeToData' _ (ChRenameField _ fname fname') _ v p =+    Record . renameField fname fname' <$!> expectRecord v p++applyChangeToData' _ (ChChangeField _ fname _ftype tag) custom v p = do+    xs <- expectRecord v p+    case findField fname xs of+        Just (ys, v', zs)  -> do v'' <- liftMigration (fieldMigration custom tag) v' (inField fname:p)+                                 pure (Record (joinRecords ys fname v'' zs))+        Nothing            -> Left (JSONError MissingField, inField fname : p)++applyChangeToData' _ (ChRenameUnionAlt _ fname fname') _ v p = do+    (fn, v') <- expectUnion v p+    pure $! if fn == fname then Union fname' v' else v++applyChangeToData' _ (ChRenameEnumVal _ fname fname') _ v p = do+    fn <- expectEnum v p+    pure $! if fn == fname then Enum fname' else v++applyChangeToData' _ (ChCustomType _ tag)   custom v p = liftMigration (typeMigration custom tag) v p+applyChangeToData' _ (ChCustomAll tag)      custom v p = do+    xs <- expectRecord v p+    Record <$!> liftMigration (databaseMigration custom tag) xs p++applyChangeToData' _ (ChAddType _ _)        _ v _ = pure v+applyChangeToData' _ (ChDeleteType _)       _ v _ = pure v+applyChangeToData' _ (ChRenameType _ _)     _ v _ = pure v+applyChangeToData' _ (ChAddUnionAlt _ _ _)  _ v _ = pure v+applyChangeToData' _ (ChDeleteUnionAlt _ _) _ v _ = pure v+applyChangeToData' _ (ChAddEnumVal _ _)     _ v _ = pure v+applyChangeToData' _ (ChDeleteEnumVal _ _)  _ v _ = pure v++ ------------------------------------- -- Utils for manipulating JS.Values -- --- | Errors that can be discovered when migrating data values-data ValueError-    = JSONError JSONError                  -- ^ Data doesn't match schema-    | CustomMigrationError String JS.Value -- ^ Error generated during custom migration-    | InvalidAPI ApplyFailure              -- ^ An API change was invalid-    deriving (Eq, Show)- withObject :: (JS.Object -> Position -> Either (ValueError, Position) JS.Object)            -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObject alter (JS.Object obj) p = JS.Object <$> alter obj p@@ -783,7 +759,7 @@                          -> (a -> JS.Value -> Position -> Either (ValueError, Position) JS.Value)                          -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObjectMatchingFields m f (JS.Object obj) p = do-    zs <- matchMaps (Map.mapKeys fieldKey m) (hmapToMap obj) ?!? toErr+    zs <- matchMaps (Map.mapKeys _FieldName m) (hmapToMap obj) ?!? toErr     obj' <- Map.traverseWithKey (\ k (ty, val) -> (f ty val (InField k : p))) zs     return $ JS.Object $ mapToHMap obj'   where@@ -801,7 +777,7 @@                          -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObjectMatchingUnion m f (JS.Object obj) p   | [(k, r)] <- HMap.toList obj-  = do x  <- Map.lookup (fromFieldKey k) m ?! (JSONError UnexpectedField, InField k : p)+  = do x  <- Map.lookup (FieldName k) m ?! (JSONError UnexpectedField, InField k : p)        r' <- f x r (InField k : p)        return $ JS.Object $ HMap.singleton k r' withObjectMatchingUnion _ _ _ p = Left (JSONError $ SyntaxError "Not singleton", p)@@ -823,38 +799,9 @@ withString alter (JS.String s) p = JS.String <$> alter s p withString _     v             p = Left (JSONError $ expectedString v, p) -fieldKey :: FieldName -> T.Text-fieldKey (FieldName fname) = T.pack fname -fromFieldKey :: T.Text -> FieldName-fromFieldKey = FieldName . T.unpack- compatibleDefaultValue :: NormAPI -> APIType -> DefaultValue -> Bool-compatibleDefaultValue _   (TyList  _) DefValList  = True-compatibleDefaultValue _   (TyMaybe _) DefValMaybe = True-compatibleDefaultValue api (TyMaybe ty)    defval  = compatibleDefaultValue api ty defval-compatibleDefaultValue _   (TyBasic bt)    defval  =-    compatibleBasicDefaultValue bt defval-compatibleDefaultValue _   TyJSON          _       = True-compatibleDefaultValue env (TyName tname)  defval  =-    case Map.lookup tname env of-      Just (NTypeSynonym t) -> compatibleDefaultValue env t defval-      Just (NNewtype    bt) -> compatibleBasicDefaultValue bt defval-      Just (NEnumType vals) -> case defval of-                                 DefValString s -> fromFieldKey s `Set.member` vals-                                 _              -> False-      _                     -> False-compatibleDefaultValue _ _ _ = False--compatibleBasicDefaultValue :: BasicType -> DefaultValue -> Bool-compatibleBasicDefaultValue BTstring (DefValString _) = True-compatibleBasicDefaultValue BTbinary (DefValString v) = case B64.decode (B.pack (T.unpack v)) of-                                                           Left _  -> False-                                                           Right _ -> True-compatibleBasicDefaultValue BTbool   (DefValBool _)   = True-compatibleBasicDefaultValue BTint    (DefValInt _)    = True-compatibleBasicDefaultValue BTutc    (DefValUtc _)    = True-compatibleBasicDefaultValue _         _                = False+compatibleDefaultValue api ty dv = isJust (fromDefaultValue api ty dv)  -- | Check if there is a "default" default value for a field of the -- given type: list and maybe have @[]@ and @nothing@ respectively.@@ -883,7 +830,7 @@     declMatches (NRecordType flds) = withObjectMatchingFields flds valueMatches     declMatches (NUnionType alts)  = withObjectMatchingUnion  alts valueMatches     declMatches (NEnumType vals)   = withString $ \ s p ->-        if fromFieldKey s `Set.member` vals+        if FieldName s `Set.member` vals            then return s            else Left (JSONError UnexpectedField, InField s : p)     declMatches (NTypeSynonym t)   = valueMatches t@@ -913,182 +860,8 @@  type Decode t = JS.Value -> Either [(JSONError, Position)] t ----------------------------------------- Utils for merging and diffing maps--- -data MergeResult a b = OnlyInLeft a | InBoth a b | OnlyInRight b-  deriving (Eq, Show)--mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)-mergeMaps m1 m2 = Map.unionWith (\(OnlyInLeft a) (OnlyInRight b) -> InBoth a b)-                      (fmap OnlyInLeft m1) (fmap OnlyInRight m2)--diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)-diffMaps m1 m2 = Map.filter different $ mergeMaps m1 m2-  where-    different (InBoth a b) = a /= b-    different _            = True---- Attempts to match the keys of the maps to produce a map from keys--- to pairs.-matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))-matchMaps m1 m2 = Map.traverseWithKey win $ mergeMaps m1 m2-  where-    win _ (InBoth x y)    = return (x, y)-    win k (OnlyInLeft x)  = Left (k, Left x)-    win k (OnlyInRight x) = Left (k, Right x)-- ---------------------------------------- Pretty-printing-----prettyMigrateFailure :: MigrateFailure -> String-prettyMigrateFailure = unlines . ppLines--prettyValidateFailure :: ValidateFailure -> String-prettyValidateFailure = unlines . ppLines--prettyValueError :: ValueError -> String-prettyValueError = unlines . ppLines--prettyValueErrorPosition :: (ValueError, Position) -> String-prettyValueErrorPosition = unlines . ppLines---instance PP TypeKind where-  pp TKRecord      = "record"-  pp TKUnion       = "union"-  pp TKEnum        = "enum"-  pp TKNewtype     = "newtype"-  pp TKTypeSynonym = "type"--ppATypeKind :: TypeKind -> String-ppATypeKind TKRecord      = "a record"-ppATypeKind TKUnion       = "a union"-ppATypeKind TKEnum        = "an enum"-ppATypeKind TKNewtype     = "a newtype"-ppATypeKind TKTypeSynonym = "a type synonym"--ppMemberWord :: TypeKind -> String-ppMemberWord TKRecord      = "field"-ppMemberWord TKUnion       = "alternative"-ppMemberWord TKEnum        = "value"-ppMemberWord TKNewtype     = "member"-ppMemberWord TKTypeSynonym = "member"---instance PPLines APIChange where-  ppLines (ChAddType t d)           = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d-  ppLines (ChDeleteType t)          = ["removed " ++ pp t]-  ppLines (ChRenameType t t')       = ["renamed " ++ pp t ++ " to " ++ pp t']-  ppLines (ChAddField t f ty mb_v)  = [ "changed record " ++ pp t-                                      , "  field added " ++ pp f ++ " :: " ++ pp ty-                                        ++ maybe "" (\ v -> " default " ++ pp v) mb_v]-  ppLines (ChDeleteField t f)       = ["changed record " ++ pp t, "  field removed " ++ pp f]-  ppLines (ChRenameField t f f')    = [ "changed record " ++ pp t-                                      , "  field renamed " ++ pp f ++ " to " ++ pp f']-  ppLines (ChChangeField t f ty c)  = [ "changed record " ++ pp t-                                      , "  field changed " ++ pp f ++ " :: " ++ pp ty-                                        ++ " migration " ++ pp c]-  ppLines (ChAddUnionAlt t f ty)    = [ "changed union " ++ pp t-                                      , "  alternative added " ++ pp f ++ " :: " ++ pp ty]-  ppLines (ChDeleteUnionAlt t f)    = [ "changed union " ++ pp t-                                      , "  alternative removed " ++ pp f]-  ppLines (ChRenameUnionAlt t f f') = [ "changed union " ++ pp t-                                      , "  alternative renamed " ++ pp f ++ " to " ++ pp f']-  ppLines (ChAddEnumVal t f)        = [ "changed enum " ++ pp t-                                      , "  alternative added " ++ pp f]-  ppLines (ChDeleteEnumVal t f)     = [ "changed enum " ++ pp t-                                      , "  alternative removed " ++ pp f]-  ppLines (ChRenameEnumVal t f f')  = [ "changed enum " ++ pp t-                                      , "  alternative renamed " ++ pp f ++ " to " ++ pp f']-  ppLines (ChCustomType t c)        = ["migration record " ++ pp t ++ " " ++ pp c]-  ppLines (ChCustomAll c)           = ["migration " ++ pp c]--instance PPLines MigrateFailure where-  ppLines (ValidateFailure x) = ppLines x-  ppLines (ValueError x ps)   = ppLines x ++ map prettyStep ps--instance PPLines ValidateFailure where-  ppLines (ChangelogOutOfOrder later earlier) =-      ["Changelog out of order: version " ++ pp later-           ++ " appears after version " ++ pp earlier]-  ppLines (CannotDowngrade from to) =-      ["Cannot downgrade from version " ++ pp from-           ++ " to version " ++ pp to]-  ppLines (ApiInvalid ver missing) =-      ["Missing declarations in API version " ++ pp ver ++ ": " ++ pp missing]-  ppLines (ChangelogEntryInvalid succs change af) =-      ppLines af ++ ("when applying the change" : indent (ppLines change))-          ++ if not (null succs)-             then "after successfully applying the changes:"-                  : indent (ppLines succs)-             else []-  ppLines (ChangelogIncomplete ver ver' diffs) =-      ("Changelog incomplete! Differences between log version ("-           ++ showVersionExtra ver ++ ") and latest version (" ++ showVersionExtra ver' ++ "):")-      : indent (concatMap (uncurry ppDiff) $ Map.toList diffs)--instance PPLines APITableChange where-  ppLines (APIChange c _)  = ppLines c-  ppLines (ValidateData _) = []--ppDiff :: TypeName -> MergeResult NormTypeDecl NormTypeDecl -> [String]-ppDiff t (OnlyInLeft _)  = ["removed " ++ pp t]-ppDiff t (OnlyInRight d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d-ppDiff t (InBoth (NRecordType flds) (NRecordType flds')) =-    ("changed record " ++ pp t)-    : (concatMap (uncurry (ppDiffFields "field")) $ Map.toList $ diffMaps flds flds')-ppDiff t (InBoth (NUnionType alts) (NUnionType alts')) =-    ("changed union " ++ pp t)-    : (concatMap (uncurry (ppDiffFields "alternative")) $ Map.toList $ diffMaps alts alts')-ppDiff t (InBoth (NEnumType vals) (NEnumType vals')) =-    ("changed enum " ++ pp t)-    :  (map (\ x -> "  alternative removed " ++ pp x) $ Set.toList $ vals  Set.\\ vals')-    ++ (map (\ x -> "  alternative added " ++ pp x)   $ Set.toList $ vals' Set.\\ vals)-ppDiff t (InBoth _ _) = ["incompatible definitions of " ++ pp t]--ppDiffFields :: String -> FieldName -> MergeResult APIType APIType -> [String]-ppDiffFields s f (OnlyInLeft _)   = ["  " ++ s ++ " removed " ++ pp f]-ppDiffFields s f (OnlyInRight ty) = ["  " ++ s ++ " added " ++ pp f ++ " :: " ++ pp ty]-ppDiffFields s f (InBoth ty ty')   = [ "  incompatible types for " ++ s ++ " " ++ pp f-                                     , "    changelog type:      " ++ pp ty-                                     , "    latest version type: " ++ pp ty' ]---instance PPLines ApplyFailure where-  ppLines (TypeExists t)                  = ["Type " ++ pp t ++ " already exists"]-  ppLines (TypeDoesNotExist t)            = ["Type " ++ pp t ++ " does not exist"]-  ppLines (TypeWrongKind t k)             = ["Type " ++ pp t ++ " is not " ++ ppATypeKind k]-  ppLines (TypeInUse t)                   = ["Type " ++ pp t ++ " is in use, so it cannot be modified"]-  ppLines (TypeMalformed ty xs)           = ["Type " ++ pp ty-                                             ++ " is malformed, missing declarations:"-                                            , "  " ++ pp xs]-  ppLines (DeclMalformed t _ xs)          = [ "Declaration of " ++ pp t-                                              ++ " is malformed, missing declarations:"-                                            , "  " ++ pp xs]-  ppLines (FieldExists t k f)             = ["Type " ++ pp t ++ " already has the "-                                             ++ ppMemberWord k ++ " " ++ pp f]-  ppLines (FieldDoesNotExist t k f)       = ["Type " ++ pp t ++ " does not have the "-                                             ++ ppMemberWord k ++ " " ++ pp f]-  ppLines (FieldBadDefaultValue _ _ ty v) = ["Default value " ++ pp v-                                             ++ " is not compatible with the type " ++ pp ty]-  ppLines (DefaultMissing t f)            = ["Field " ++ pp f ++ " does not have a default value, but "-                                             ++ pp t ++ " occurs in the database"]-  ppLines (TableChangeError s)            = ["Error when detecting changed tables:", "  " ++ s]---instance PPLines ValueError where-  ppLines (JSONError e)              = [prettyJSONError e]-  ppLines (CustomMigrationError e v) = [ "Custom migration error:", "  " ++ e-                                       , "when migrating value"] ++ indent (ppLines v)-  ppLines (InvalidAPI af)            = "Invalid API detected during value migration:"-                                       : indent (ppLines af)---------------------------------------- -- Template Haskell -- @@ -1100,9 +873,9 @@     guardNoDups (all_tags `Set.intersection` fld_tags)     guardNoDups (rec_tags `Set.intersection` fld_tags) -    return [ DataD [] (mkName all_nm) [] (cons all_nm all_tags) derivs-           , DataD [] (mkName rec_nm) [] (cons rec_nm rec_tags) derivs-           , DataD [] (mkName fld_nm) [] (cons fld_nm fld_tags) derivs ]+    return [ mkDataD [] (mkName all_nm) [] (cons all_nm all_tags) derivs+           , mkDataD [] (mkName rec_nm) [] (cons rec_nm rec_tags) derivs+           , mkDataD [] (mkName fld_nm) [] (cons fld_nm fld_tags) derivs ]   where     (all_tags, rec_tags, fld_tags) = changelogTags changes 
+ src/Data/API/Changes/Types.hs view
@@ -0,0 +1,145 @@+{-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE DeriveFunctor              #-}+{-# LANGUAGE OverloadedStrings          #-}+{-# LANGUAGE TemplateHaskell            #-}++module Data.API.Changes.Types+    ( -- * Changelog representation+      APIWithChangelog+    , APIChangelog(..)+    , APIChange(..)+    , MigrationTag+    , VersionExtra(..)+    , showVersionExtra++    , UpdateTypePos(..)+    , UpdateDeclPos(..)+    , APITableChange(..)+    ) where++import           Data.API.PP+import           Data.API.NormalForm+import           Data.API.Types++import           Data.Map ( Map )+import           Data.Version+++------------------+-- The key types+--++type APIWithChangelog = (API, APIChangelog)++-- | An API changelog, consisting of a list of versions with the+-- changes from one version to the next.  The versions must be in+-- descending order (according to the 'Ord' 'Version' instance).+data APIChangelog =+     -- | The changes from the previous version up to this version.+     ChangesUpTo VersionExtra [APIChange] APIChangelog+     -- | The initial version+   | ChangesStart Version+    deriving (Eq, Show)++-- | A single change within a changelog+data APIChange+    = ChAddType       TypeName NormTypeDecl+    | ChDeleteType    TypeName+    | ChRenameType    TypeName TypeName++      -- Specific changes for record types+    | ChAddField      TypeName FieldName APIType (Maybe DefaultValue)+    | ChDeleteField   TypeName FieldName+    | ChRenameField   TypeName FieldName FieldName+    | ChChangeField   TypeName FieldName APIType MigrationTag++      -- Changes for union types+    | ChAddUnionAlt    TypeName FieldName APIType+    | ChDeleteUnionAlt TypeName FieldName+    | ChRenameUnionAlt TypeName FieldName FieldName++      -- Changes for enum types+    | ChAddEnumVal    TypeName FieldName+    | ChDeleteEnumVal TypeName FieldName+    | ChRenameEnumVal TypeName FieldName FieldName++      -- Custom migrations+    | ChCustomType    TypeName MigrationTag+    | ChCustomAll     MigrationTag+    deriving (Eq, Show)++instance PPLines APIChange where+  ppLines (ChAddType t d)           = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d+  ppLines (ChDeleteType t)          = ["removed " ++ pp t]+  ppLines (ChRenameType t t')       = ["renamed " ++ pp t ++ " to " ++ pp t']+  ppLines (ChAddField t f ty mb_v)  = [ "changed record " ++ pp t+                                      , "  field added " ++ pp f ++ " :: " ++ pp ty+                                        ++ maybe "" (\ v -> " default " ++ pp v) mb_v]+  ppLines (ChDeleteField t f)       = ["changed record " ++ pp t, "  field removed " ++ pp f]+  ppLines (ChRenameField t f f')    = [ "changed record " ++ pp t+                                      , "  field renamed " ++ pp f ++ " to " ++ pp f']+  ppLines (ChChangeField t f ty c)  = [ "changed record " ++ pp t+                                      , "  field changed " ++ pp f ++ " :: " ++ pp ty+                                        ++ " migration " ++ pp c]+  ppLines (ChAddUnionAlt t f ty)    = [ "changed union " ++ pp t+                                      , "  alternative added " ++ pp f ++ " :: " ++ pp ty]+  ppLines (ChDeleteUnionAlt t f)    = [ "changed union " ++ pp t+                                      , "  alternative removed " ++ pp f]+  ppLines (ChRenameUnionAlt t f f') = [ "changed union " ++ pp t+                                      , "  alternative renamed " ++ pp f ++ " to " ++ pp f']+  ppLines (ChAddEnumVal t f)        = [ "changed enum " ++ pp t+                                      , "  alternative added " ++ pp f]+  ppLines (ChDeleteEnumVal t f)     = [ "changed enum " ++ pp t+                                      , "  alternative removed " ++ pp f]+  ppLines (ChRenameEnumVal t f f')  = [ "changed enum " ++ pp t+                                      , "  alternative renamed " ++ pp f ++ " to " ++ pp f']+  ppLines (ChCustomType t c)        = ["migration record " ++ pp t ++ " " ++ pp c]+  ppLines (ChCustomAll c)           = ["migration " ++ pp c]++-- | Within the changelog, custom migrations are represented as+-- strings, so we have less type-safety.+type MigrationTag = String++-- | Represents either a released version (with a version number) or+-- the version under development, which is newer than any release+data VersionExtra = Release Version+                  | DevVersion+  deriving (Eq, Ord, Show)++showVersionExtra :: VersionExtra -> String+showVersionExtra (Release v) = showVersion v+showVersionExtra DevVersion  = "development"++instance PP VersionExtra where+  pp = showVersionExtra+++------------------------+-- Representing updates+--++-- | Represents the positions in a declaration to apply an update+data UpdateDeclPos+    = UpdateHere   (Maybe UpdateDeclPos)+    | UpdateRecord (Map FieldName (Maybe UpdateTypePos))+    | UpdateUnion  (Map FieldName (Maybe UpdateTypePos))+    | UpdateType   UpdateTypePos+    deriving (Eq, Show)++-- | Represents the positions in a type to apply an update+data UpdateTypePos+    = UpdateList UpdateTypePos+    | UpdateMaybe UpdateTypePos+    | UpdateNamed TypeName+    deriving (Eq, Show)++data APITableChange+      -- | An initial API, an APIChange and the positions in which to apply it+    = APIChange NormAPI APIChange (Map TypeName UpdateDeclPos)+      -- | Request to validate the dataset against the given API+    | ValidateData NormAPI+    deriving (Eq, Show)++instance PPLines APITableChange where+  ppLines (APIChange _ c _)  = ppLines c+  ppLines (ValidateData _) = []
src/Data/API/Doc/Types.hs view
@@ -21,6 +21,7 @@ import           Data.API.PP import           Data.API.Types +import qualified Data.Text                      as T import           Text.Printf  type URL        = String@@ -103,7 +104,7 @@ renderAPIType :: DocInfo -> APIType -> String renderAPIType di (TyList  ty  ) = "[" ++ renderAPIType di ty ++ "]" renderAPIType di (TyMaybe ty  ) = "?" ++ renderAPIType di ty-renderAPIType di (TyName  tn  ) = mk_link (doc_info_type_url di tn) (_TypeName tn)+renderAPIType di (TyName  tn  ) = mk_link (doc_info_type_url di tn) (T.unpack (_TypeName tn)) renderAPIType _  (TyBasic bt  ) = pp bt renderAPIType _  TyJSON         = "json" 
+ src/Data/API/Error.hs view
@@ -0,0 +1,372 @@+{-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE DeriveFunctor              #-}+{-# LANGUAGE OverloadedStrings          #-}+{-# LANGUAGE TemplateHaskell            #-}++module Data.API.Error+    ( -- * Representation of JSON parsing errors+      JSONError(..)+    , JSONWarning+    , Expected(..)+    , FormatExpected(..)+    , Position+    , Step(..)+    , inField+    , prettyJSONErrorPositions+    , prettyJSONError+    , prettyStep++      -- * JSON parse error construction+    , expectedArray+    , expectedBool+    , expectedInt+    , expectedObject+    , expectedString+    , badFormat++      -- * Validation and migration errors+    , ValueError(..)+    , ValidateFailure(..)+    , ValidateWarning+    , ApplyFailure(..)+    , TypeKind(..)+    , MigrateFailure(..)+    , MigrateWarning+    , prettyMigrateFailure+    , prettyValidateFailure+    , prettyValueError+    , prettyValueErrorPosition+    ) where++import           Data.API.Changes.Types+import           Data.API.PP+import           Data.API.NormalForm+import           Data.API.Types+import           Data.API.Utils++import qualified Data.Aeson                     as JS+import           Data.Aeson.TH+import qualified Data.Graph                     as Graph+import           Data.List+import           Data.Map ( Map )+import qualified Data.Map                       as Map+import qualified Data.SafeCopy                  as SC+import           Data.Set ( Set )+import qualified Data.Set                       as Set+import qualified Data.Text                      as T+import           Data.Time+++----------------------------------------------------------+-- Representation of JSON parsing errors and positions+--++-- | Represents an error that can be encountered while parsing+data JSONError = Expected  Expected       String JS.Value+               | BadFormat FormatExpected String T.Text+               | MissingField+               | MissingAlt [String]+               | UnexpectedField+               | UnexpectedEnumVal [T.Text] T.Text+               | IntRangeError String Int IntRange+               | UTCRangeError String UTCTime UTCRange+               | RegexError String T.Text RegEx+               | SyntaxError String+  deriving (Eq, Show)++-- | At present, we do not distinguish between errors and warnings+type JSONWarning = JSONError++-- | JSON type expected at a particular position, when a value of a+-- different type was encountered+data Expected = ExpArray+              | ExpBool+              | ExpInt+              | ExpObject+              | ExpString+  deriving (Eq, Show)++-- | Special format expected of a string+data FormatExpected = FmtBinary+                    | FmtUTC+                    | FmtOther+  deriving (Eq, Show)++expectedArray, expectedBool, expectedInt, expectedObject, expectedString+  :: JS.Value -> JSONError+expectedArray  = Expected ExpArray    "Array"+expectedBool   = Expected ExpBool     "Bool"+expectedInt    = Expected ExpInt      "Int"+expectedObject = Expected ExpObject   "Object"+expectedString = Expected ExpString   "String"++badFormat :: String -> T.Text -> JSONError+badFormat = BadFormat FmtOther++-- | Human-readable description of a JSON parse error+prettyJSONError :: JSONError -> String+prettyJSONError (Expected _ s v)      = "When expecting " ++ s ++ ", encountered "+                                        ++ x ++ " instead"+  where+    x = case v of+          JS.Object _ -> "Object"+          JS.Array _  -> "Array"+          JS.String _ -> "String"+          JS.Number _ -> "Number"+          JS.Bool _   -> "Boolean"+          JS.Null     -> "Null"+prettyJSONError (BadFormat _ s t)     = "Could not parse as " ++ s ++ " the string " ++ show t+prettyJSONError MissingField          = "Field missing from Object"+prettyJSONError (MissingAlt xs)       = "Missing alternative, expecting one of: "+                                          ++ intercalate ", " xs+prettyJSONError UnexpectedField       = "Unexpected field in Object"+prettyJSONError (UnexpectedEnumVal xs t) = "Unexpected enum value " ++ show t+                                           ++ ", expecting one of: "+                                           ++ T.unpack (T.intercalate ", " xs)+prettyJSONError (IntRangeError s i r) = s ++ ": " ++ show i ++ " not in range " ++ show r+prettyJSONError (UTCRangeError s u r) = s ++ ": " ++ show u ++ " not in range " ++ show r+prettyJSONError (RegexError s _ t)    = s ++ ": failed to match RE: " ++ show t+prettyJSONError (SyntaxError e)       = "JSON syntax error: " ++ e++-- | A position inside a JSON value is a list of steps, ordered+-- innermost first (so going inside an object prepends a step).+type Position = [Step]++-- | Each step may be into a field of an object, or a specific element+-- of an array.+data Step = InField T.Text | InElem Int+  deriving (Eq, Show)++inField :: FieldName -> Step+inField fn = InField (_FieldName fn)++-- | Human-readable description of a single step in a position+prettyStep :: Step -> String+prettyStep (InField f) = "  in the field " ++ show f+prettyStep (InElem i)  = "  in array index " ++ show i++instance PPLines Step where+  ppLines s = [prettyStep s]++-- | Human-readable presentation of a list of parse errors with their+-- positions+prettyJSONErrorPositions :: [(JSONError, Position)] -> String+prettyJSONErrorPositions xs = unlines $ concatMap help xs+  where+    help (e, pos) = prettyJSONError e : map prettyStep pos++++----------------------------------------------------------+-- Validation and data migration errors+--++-- | Errors that can be discovered when migrating data values+data ValueError+    = JSONError JSONError                  -- ^ Data doesn't match schema+    | CustomMigrationError String JS.Value -- ^ Error generated during custom migration+    | InvalidAPI ApplyFailure              -- ^ An API change was invalid+    deriving (Eq, Show)++-- | Errors that may be discovered when validating a changelog+data ValidateFailure+        -- | the changelog must be in descending order of versions+    = ChangelogOutOfOrder { vfLaterVersion   :: VersionExtra+                          , vfEarlierVersion :: VersionExtra }+        -- | forbid migrating from one version to an earlier version+    | CannotDowngrade { vfFromVersion :: VersionExtra+                      , vfToVersion   :: VersionExtra }+        -- | an API uses types that are not declared+    | ApiInvalid { vfInvalidVersion      :: VersionExtra+                 , vfMissingDeclarations :: Set TypeName }+        -- | changelog entry does not apply+    | ChangelogEntryInvalid { vfSuccessfullyApplied :: [APITableChange]+                            , vfFailedToApply       :: APIChange+                            , vfApplyFailure        :: ApplyFailure }+        -- | changelog is incomplete+        --   (ie all entries apply ok but result isn't the target api)+    | ChangelogIncomplete { vfChangelogVersion :: VersionExtra+                          , vfTargetVersion    :: VersionExtra+                          , vfDifferences      :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) }+  deriving (Eq, Show)++data ValidateWarning = ValidateWarning -- add warnings about bits we cannot check (opaque custom)+  deriving Show++-- | Errors that may occur applying a single API change+data ApplyFailure+    = TypeExists           { afExistingType  :: TypeName }     -- ^ for adding or renaming type+    | TypeDoesNotExist     { afMissingType   :: TypeName }     -- ^ for deleting or renaming a type+    | TypeWrongKind        { afTypeName      :: TypeName+                           , afExpectedKind  :: TypeKind }     -- ^ e.g. it's not a record type+    | TypeInUse            { afTypeName      :: TypeName }     -- ^ cannot delete/modify types that are still used+    | TypeMalformed        { afType          :: APIType+                           , afMissingTypes  :: Set TypeName } -- ^ type refers to a non-existent type+    | DeclMalformed        { afTypeName      :: TypeName+                           , afDecl          :: NormTypeDecl+                           , afMissingTypes  :: Set TypeName } -- ^ decl refers to a non-existent type+    | FieldExists          { afTypeName      :: TypeName+                           , afTypeKind      :: TypeKind+                           , afExistingField :: FieldName }    -- ^ for adding or renaming a field+    | FieldDoesNotExist    { afTypeName      :: TypeName+                           , afTypeKind      :: TypeKind+                           , afMissingField  :: FieldName }    -- ^ for deleting or renaming a field+    | FieldBadDefaultValue { afTypeName      :: TypeName+                           , afFieldName     :: FieldName+                           , afFieldType     :: APIType+                           , afBadDefault    :: DefaultValue } -- ^ for adding a field, must be a default+                                                               --   value compatible with the type+    | DefaultMissing       { afTypeName      :: TypeName+                           , afFieldName     :: FieldName }    -- ^ for adding a field to a table+    | TableChangeError     { afCustomMessage :: String }       -- ^ custom error in tableChange+  deriving (Eq, Show)++data TypeKind = TKRecord | TKUnion | TKEnum | TKNewtype | TKTypeSynonym+  deriving (Eq, Show)+++data MigrateFailure+    = ValidateFailure ValidateFailure+    | ValueError ValueError Position+    deriving (Eq, Show)++type MigrateWarning = ValidateWarning+++-------------------------------------+-- Pretty-printing+--++prettyMigrateFailure :: MigrateFailure -> String+prettyMigrateFailure = unlines . ppLines++prettyValidateFailure :: ValidateFailure -> String+prettyValidateFailure = unlines . ppLines++prettyValueError :: ValueError -> String+prettyValueError = unlines . ppLines++prettyValueErrorPosition :: (ValueError, Position) -> String+prettyValueErrorPosition = unlines . ppLines+++instance PP TypeKind where+  pp TKRecord      = "record"+  pp TKUnion       = "union"+  pp TKEnum        = "enum"+  pp TKNewtype     = "newtype"+  pp TKTypeSynonym = "type"++ppATypeKind :: TypeKind -> String+ppATypeKind TKRecord      = "a record"+ppATypeKind TKUnion       = "a union"+ppATypeKind TKEnum        = "an enum"+ppATypeKind TKNewtype     = "a newtype"+ppATypeKind TKTypeSynonym = "a type synonym"++ppMemberWord :: TypeKind -> String+ppMemberWord TKRecord      = "field"+ppMemberWord TKUnion       = "alternative"+ppMemberWord TKEnum        = "value"+ppMemberWord TKNewtype     = "member"+ppMemberWord TKTypeSynonym = "member"+++instance PPLines MigrateFailure where+  ppLines (ValidateFailure x) = ppLines x+  ppLines (ValueError x ps)   = ppLines x ++ map prettyStep ps++instance PPLines ValidateFailure where+  ppLines (ChangelogOutOfOrder later earlier) =+      ["Changelog out of order: version " ++ pp later+           ++ " appears after version " ++ pp earlier]+  ppLines (CannotDowngrade from to) =+      ["Cannot downgrade from version " ++ pp from+           ++ " to version " ++ pp to]+  ppLines (ApiInvalid ver missing) =+      ["Missing declarations in API version " ++ pp ver ++ ": " ++ pp missing]+  ppLines (ChangelogEntryInvalid succs change af) =+      ppLines af ++ ("when applying the change" : indent (ppLines change))+          ++ if not (null succs)+             then "after successfully applying the changes:"+                  : indent (ppLines succs)+             else []+  ppLines (ChangelogIncomplete ver ver' diffs) =+      ("Changelog incomplete! Differences between log version ("+           ++ showVersionExtra ver ++ ") and latest version (" ++ showVersionExtra ver' ++ "):")+      : indent (ppDiffs diffs)+++ppDiffs :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) -> [String]+ppDiffs  = concatMap (uncurry ppDiff) . sortDiffs . Map.toList++-- | Perform a topological sort of the differences, so that the+-- pretty-printed form can be copied directly into the changelog.+sortDiffs :: [(TypeName, MergeResult NormTypeDecl NormTypeDecl)]+          -> [(TypeName, MergeResult NormTypeDecl NormTypeDecl)]+sortDiffs = reverse . Graph.flattenSCCs . Graph.stronglyConnComp . map f+  where+    f (tn, mr) = ((tn, mr), tn, Set.toList (mergeResultFreeVars mr))++mergeResultFreeVars :: MergeResult NormTypeDecl NormTypeDecl -> Set TypeName+mergeResultFreeVars (OnlyInLeft  x) = typeDeclFreeVars x+mergeResultFreeVars (OnlyInRight x) = typeDeclFreeVars x+mergeResultFreeVars (InBoth x y)    = typeDeclFreeVars x `Set.union` typeDeclFreeVars y++ppDiff :: TypeName -> MergeResult NormTypeDecl NormTypeDecl -> [String]+ppDiff t (OnlyInLeft _)  = ["removed " ++ pp t]+ppDiff t (OnlyInRight d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d+ppDiff t (InBoth (NRecordType flds) (NRecordType flds')) =+    ("changed record " ++ pp t)+    : (concatMap (uncurry (ppDiffFields "field")) $ Map.toList $ diffMaps flds flds')+ppDiff t (InBoth (NUnionType alts) (NUnionType alts')) =+    ("changed union " ++ pp t)+    : (concatMap (uncurry (ppDiffFields "alternative")) $ Map.toList $ diffMaps alts alts')+ppDiff t (InBoth (NEnumType vals) (NEnumType vals')) =+    ("changed enum " ++ pp t)+    :  (map (\ x -> "  alternative removed " ++ pp x) $ Set.toList $ vals  Set.\\ vals')+    ++ (map (\ x -> "  alternative added " ++ pp x)   $ Set.toList $ vals' Set.\\ vals)+ppDiff t (InBoth _ _) = ["incompatible definitions of " ++ pp t]++ppDiffFields :: String -> FieldName -> MergeResult APIType APIType -> [String]+ppDiffFields s f (OnlyInLeft _)   = ["  " ++ s ++ " removed " ++ pp f]+ppDiffFields s f (OnlyInRight ty) = ["  " ++ s ++ " added " ++ pp f ++ " :: " ++ pp ty]+ppDiffFields s f (InBoth ty ty')   = [ "  incompatible types for " ++ s ++ " " ++ pp f+                                     , "    changelog type:      " ++ pp ty+                                     , "    latest version type: " ++ pp ty' ]++instance PPLines ApplyFailure where+  ppLines (TypeExists t)                  = ["Type " ++ pp t ++ " already exists"]+  ppLines (TypeDoesNotExist t)            = ["Type " ++ pp t ++ " does not exist"]+  ppLines (TypeWrongKind t k)             = ["Type " ++ pp t ++ " is not " ++ ppATypeKind k]+  ppLines (TypeInUse t)                   = ["Type " ++ pp t ++ " is in use, so it cannot be modified"]+  ppLines (TypeMalformed ty xs)           = ["Type " ++ pp ty+                                             ++ " is malformed, missing declarations:"+                                            , "  " ++ pp xs]+  ppLines (DeclMalformed t _ xs)          = [ "Declaration of " ++ pp t+                                              ++ " is malformed, missing declarations:"+                                            , "  " ++ pp xs]+  ppLines (FieldExists t k f)             = ["Type " ++ pp t ++ " already has the "+                                             ++ ppMemberWord k ++ " " ++ pp f]+  ppLines (FieldDoesNotExist t k f)       = ["Type " ++ pp t ++ " does not have the "+                                             ++ ppMemberWord k ++ " " ++ pp f]+  ppLines (FieldBadDefaultValue _ _ ty v) = ["Default value " ++ pp v+                                             ++ " is not compatible with the type " ++ pp ty]+  ppLines (DefaultMissing t f)            = ["Field " ++ pp f ++ " does not have a default value, but "+                                             ++ pp t ++ " occurs in the database"]+  ppLines (TableChangeError s)            = ["Error when detecting changed tables:", "  " ++ s]+++instance PPLines ValueError where+  ppLines (JSONError e)              = [prettyJSONError e]+  ppLines (CustomMigrationError e v) = [ "Custom migration error:", "  " ++ e+                                       , "when migrating value"] ++ indent (ppLines v)+  ppLines (InvalidAPI af)            = "Invalid API detected during value migration:"+                                       : indent (ppLines af)+++$(deriveJSON defaultOptions ''JSONError)+$(deriveJSON defaultOptions ''Expected)+$(deriveJSON defaultOptions ''FormatExpected)+$(deriveJSON defaultOptions ''Step)+$(SC.deriveSafeCopy 1 'SC.base ''Step)
src/Data/API/JSON.hs view
@@ -9,19 +9,8 @@ -- independent errors rather than stopping on the first one -- encountered. module Data.API.JSON-    ( -- * Representation of JSON parsing errors-      JSONError(..)-    , JSONWarning-    , Expected(..)-    , FormatExpected(..)-    , Position-    , Step(..)-    , prettyJSONErrorPositions-    , prettyJSONError-    , prettyStep--      -- * Parser with multiple error support-    , ParserWithErrs+    ( -- * Parser with multiple error support+      ParserWithErrs     , ParseFlags(useDefaults, enforceReadOnlyFields, enforceFilters)     , defaultParseFlags     , runParserWithErrsTop@@ -37,13 +26,6 @@        -- * ParserWithErrs combinators     , withParseFlags-    , failWith-    , expectedArray-    , expectedBool-    , expectedInt-    , expectedObject-    , expectedString-    , badFormat     , withInt     , withIntRange     , withBinary@@ -58,8 +40,29 @@     , (.:.)     , (.::)     , withUnion++      -- * Representation of JSON parsing errors+    , JSONError(..)+    , JSONWarning+    , Expected(..)+    , FormatExpected(..)+    , Position+    , Step(..)+    , prettyJSONErrorPositions+    , prettyJSONError+    , prettyStep++      -- * Error construction+    , failWith+    , expectedArray+    , expectedBool+    , expectedInt+    , expectedObject+    , expectedString+    , badFormat     ) where +import           Data.API.Error import           Data.API.Types import           Data.API.Utils @@ -67,15 +70,12 @@ import qualified Data.Aeson                     as JS import qualified Data.Aeson.Parser              as JS import qualified Data.Aeson.Types               as JS-import           Data.Aeson.TH import           Data.Attoparsec.ByteString import qualified Data.ByteString.Char8          as B import qualified Data.ByteString.Base64         as B64 import qualified Data.ByteString.Lazy           as BL import qualified Data.HashMap.Strict            as HMap-import           Data.List import           Data.Maybe-import qualified Data.SafeCopy                  as SC import qualified Data.Text                      as T import qualified Data.Text.Encoding             as T import           Data.Time@@ -84,98 +84,7 @@ import           Data.Version import           Distribution.Text import           Text.Regex--------------------------------------------------------------- Representation of JSON parsing errors and positions------- | Represents an error that can be encountered while parsing-data JSONError = Expected  Expected       String JS.Value-               | BadFormat FormatExpected String T.Text-               | MissingField-               | MissingAlt [String]-               | UnexpectedField-               | UnexpectedEnumVal [T.Text] T.Text-               | IntRangeError String Int IntRange-               | UTCRangeError String UTCTime UTCRange-               | RegexError String T.Text RegEx-               | SyntaxError String-  deriving (Eq, Show)---- | At present, we do not distinguish between errors and warnings-type JSONWarning = JSONError---- | JSON type expected at a particular position, when a value of a--- different type was encountered-data Expected = ExpArray-              | ExpBool-              | ExpInt-              | ExpObject-              | ExpString-  deriving (Eq, Show)---- | Special format expected of a string-data FormatExpected = FmtBinary-                    | FmtUTC-                    | FmtOther-  deriving (Eq, Show)--expectedArray, expectedBool, expectedInt, expectedObject, expectedString-  :: JS.Value -> JSONError-expectedArray  = Expected ExpArray    "Array"-expectedBool   = Expected ExpBool     "Bool"-expectedInt    = Expected ExpInt      "Int"-expectedObject = Expected ExpObject   "Object"-expectedString = Expected ExpString   "String"--badFormat :: String -> T.Text -> JSONError-badFormat = BadFormat FmtOther---- | Human-readable description of a JSON parse error-prettyJSONError :: JSONError -> String-prettyJSONError (Expected _ s v)      = "When expecting " ++ s ++ ", encountered "-                                        ++ x ++ " instead"-  where-    x = case v of-          JS.Object _ -> "Object"-          JS.Array _  -> "Array"-          JS.String _ -> "String"-          JS.Number _ -> "Number"-          JS.Bool _   -> "Boolean"-          JS.Null     -> "Null"-prettyJSONError (BadFormat _ s t)     = "Could not parse as " ++ s ++ " the string " ++ show t-prettyJSONError MissingField          = "Field missing from Object"-prettyJSONError (MissingAlt xs)       = "Missing alternative, expecting one of: "-                                          ++ intercalate ", " xs-prettyJSONError UnexpectedField       = "Unexpected field in Object"-prettyJSONError (UnexpectedEnumVal xs t) = "Unexpected enum value " ++ show t-                                           ++ ", expecting one of: "-                                           ++ T.unpack (T.intercalate ", " xs)-prettyJSONError (IntRangeError s i r) = s ++ ": " ++ show i ++ " not in range " ++ show r-prettyJSONError (UTCRangeError s u r) = s ++ ": " ++ show u ++ " not in range " ++ show r-prettyJSONError (RegexError s _ t)    = s ++ ": failed to match RE: " ++ show t-prettyJSONError (SyntaxError e)       = "JSON syntax error: " ++ e---- | A position inside a JSON value is a list of steps, ordered--- innermost first (so going inside an object prepends a step).-type Position = [Step]---- | Each step may be into a field of an object, or a specific element--- of an array.-data Step = InField T.Text | InElem Int-  deriving (Eq, Show)---- | Human-readable description of a single step in a position-prettyStep :: Step -> String-prettyStep (InField f) = "  in the field " ++ show f-prettyStep (InElem i)  = "  in array index " ++ show i---- | Human-readable presentation of a list of parse errors with their--- positions-prettyJSONErrorPositions :: [(JSONError, Position)] -> String-prettyJSONErrorPositions xs = unlines $ concatMap help xs-  where-    help (e, pos) = prettyJSONError e : map prettyStep pos+import           Prelude   ----------------------------------------@@ -387,18 +296,17 @@                                                                                else warning err >> m  --- It's contrary to my principles, but I'll accept a string containing--- a number instead of an actual number...+-- | It's contrary to my principles, but I'll accept a string containing+-- a number instead of an actual number, and will silently truncate+-- floating point numbers to integers... withInt :: String -> (Int -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a withInt = withNum -withNum :: JS.FromJSON n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a-withNum s f v = case JS.fromJSON v of-  JS.Success i -> f i-  JS.Error _ | JS.String t  <- v-             , Right v'     <- parseOnly (JS.value <* endOfInput) (T.encodeUtf8 t)-             , JS.Success i <- JS.fromJSON v' -> f i-             | otherwise                      -> failWith $ Expected ExpInt s v+withNum :: Integral n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a+withNum _ f (JS.Number n) = f (truncate n)+withNum s f (JS.String t)+  | Right v' <- parseOnly (JS.value <* endOfInput) (T.encodeUtf8 t) = withNum s f v'+withNum s _ v = failWith $ Expected ExpInt s v  withIntRange :: IntRange -> String -> (Int -> ParserWithErrs a)              -> JS.Value -> ParserWithErrs a@@ -500,10 +408,3 @@       []       -> failWith $ MissingAlt $ map (T.unpack . fst) xs       _:_:_    -> failWith UnexpectedField withUnion _ val = failWith $ Expected ExpObject "Union" val---deriveJSON defaultOptions ''JSONError-deriveJSON defaultOptions ''Expected-deriveJSON defaultOptions ''FormatExpected-deriveJSON defaultOptions ''Step-$(SC.deriveSafeCopy 1 'SC.base ''Step)
+ src/Data/API/JSONToCBOR.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE BangPatterns #-}+module Data.API.JSONToCBOR+    ( serialiseJSONWithSchema+    , jsonToCBORWithSchema+    , deserialiseJSONWithSchema+    , postprocessJSON+    ) where++import           Data.API.Changes+import           Data.API.JSON+import           Data.API.Types+import           Data.API.Utils++import           Control.Applicative+import           Data.Aeson hiding (encode)+import qualified Data.ByteString.Base64         as B64+import qualified Data.ByteString.Lazy           as LBS+import qualified Data.HashMap.Strict            as HMap+import qualified Data.Map                       as Map+import           Data.Traversable+import qualified Data.Vector                    as Vec+import           Codec.Serialise     as CBOR+import           Data.Binary.Serialise.CBOR.JSON (cborToJson, jsonToCbor)+import           Codec.CBOR.Term+import           Data.Fixed (Pico)+import           Data.Maybe (fromMaybe)+import           Data.Scientific+import qualified Data.Text                      as T+import qualified Data.Text.Encoding             as TE+import           Data.Time.Clock.POSIX+import           Data.Time (UTCTime(UTCTime))+import           Prelude+++-- | Serialise a JSON value as a CBOR term in a generic but+-- schema-dependent fashion.  This is necessary because the JSON+-- representation carries less information than we need in CBOR+-- (e.g. it lacks a distinction between bytestrings and text).+serialiseJSONWithSchema :: API -> TypeName -> Value -> LBS.ByteString+serialiseJSONWithSchema api tn v = serialise $ jsonToCBORWithSchema api tn v++-- | Convert a JSON value into a CBOR term in a generic but+-- schema-dependent fashion.+jsonToCBORWithSchema :: API -> TypeName -> Value -> Term+jsonToCBORWithSchema = jsonToCBORTypeName . apiNormalForm++jsonToCBORTypeName :: NormAPI -> TypeName -> Value -> Term+jsonToCBORTypeName napi tn v =+    case Map.lookup tn napi of+      Just (NRecordType nrt) -> jsonToCBORRecord napi nrt v+      Just (NUnionType  nut) -> jsonToCBORUnion  napi nut v+      Just (NEnumType   net) -> jsonToCBOREnum   napi net v+      Just (NTypeSynonym ty) -> jsonToCBORType   napi ty  v+      Just (NNewtype     bt) -> jsonToCBORBasic       bt  v+      Nothing                -> error $ "serialiseJSONWithSchema: missing definition for type "+                                          ++ T.unpack (_TypeName tn)++jsonToCBORType :: NormAPI -> APIType -> Value -> Term+jsonToCBORType napi ty0 v = case (ty0, v) of+    (TyList  ty, Array arr) | Vec.null arr -> TList []+                            | otherwise    -> TListI $ map (jsonToCBORType napi ty) (Vec.toList arr)+    (TyList  _ , _)         -> error "serialiseJSONWithSchema: expected array"+    (TyMaybe _ , Null)      -> TList []+    (TyMaybe ty, _)         -> TList [jsonToCBORType napi ty v]+    (TyName  tn, _)         -> jsonToCBORTypeName napi tn v+    (TyBasic bt, _)         -> jsonToCBORBasic bt v+    (TyJSON    , _)         -> jsonToCbor v++-- | Encode a record as a map from field names to values.  Crucially,+-- the fields are in ascending order by field name.+jsonToCBORRecord :: NormAPI -> NormRecordType -> Value -> Term+jsonToCBORRecord napi nrt v = case v of+    Object hm -> TMap $ map (f hm) $ Map.toAscList nrt+    _         -> error "serialiseJSONWithSchema: expected object"+  where+    f hm (fn, ty) = case HMap.lookup (_FieldName fn) hm of+                      Nothing -> error $ "serialiseJSONWithSchema: missing field " ++ T.unpack (_FieldName fn)+                      Just v' -> (TString (_FieldName fn), jsonToCBORType napi ty v')++-- | Encode a union as a single-element map from the field name to the value.+jsonToCBORUnion :: NormAPI -> NormUnionType -> Value -> Term+jsonToCBORUnion napi nut v = case v of+    Object hm | [(k, r)] <- HMap.toList hm -> case Map.lookup (FieldName k) nut of+       Just ty -> TMap [(TString k, jsonToCBORType napi ty r)]+       Nothing -> error "serialiseJSONWithSchema: unexpected alternative in union"+    _ -> error "serialiseJSONWithSchema: expected single-field object"++-- | Encode an enumerated value as its name; we do not check that it+-- actually belongs to the type here.+jsonToCBOREnum :: NormAPI -> NormEnumType -> Value -> Term+jsonToCBOREnum _ _ v = case v of+                         String t -> TString t+                         _        -> error "serialiseJSONWithSchema: expected string"++jsonToCBORBasic :: BasicType -> Value -> Term+jsonToCBORBasic bt v = case (bt, v) of+    (BTstring, String t) -> TString t+    (BTstring, _)        -> error "serialiseJSONWithSchema: expected string"+    (BTbinary, String t) -> case B64.decode $ TE.encodeUtf8 t of+                              Left  err-> error $ "serialiseJSONWithSchema: base64-decoding failed: " ++ err+                              Right bs -> TBytes bs+    (BTbinary, _)        -> error "serialiseJSONWithSchema: expected string"+    (BTbool  , Bool b)   -> TBool b+    (BTbool  , _)        -> error "serialiseJSONWithSchema: expected bool"+    (BTint   , Number n) | Right i <- (floatingOrInteger n :: Either Double Int) -> TInt i+    (BTint   , _)        -> error "serialiseJSONWithSchema: expected integer"+    (BTutc   , String t) ->+      TTagged 1000 (TMap [ (TInt 1, TInt secs)+                         , (TInt (-12), TInt psecs) ])+        where  -- taken from @Codec.Serialise.Class@:+          (secs, frac) = case properFraction $ utcTimeToPOSIXSeconds utc of+                           -- fractional part must be positive+                           (secs', frac')+                             | frac' < 0  -> (secs' - 1, frac' + 1)+                             | otherwise -> (secs', frac')+          psecs = round $ frac * 1000000000000+          utc = fromMaybe (error $ "jsonToCBORBasic: " ++ T.unpack t) $+                  parseUTC' t+    (BTutc   , _)        -> error "serialiseJSONWithSchema: expected string"+++-- | When a JSON value has been deserialised from CBOR, the+-- representation may need some modifications in order to match the+-- result of 'toJSON' on a Haskell datatype.  In particular, Aeson's+-- representation of 'Maybe' does not round-trip (because 'Nothing' is+-- encoded as 'Null' and @'Just' x@ as @'toJSON' x@), so CBOR uses a+-- different representation (as an empty or 1-element list).+deserialiseJSONWithSchema :: API -> TypeName -> LBS.ByteString -> Value+deserialiseJSONWithSchema api tn bs = case postprocessJSON api tn (cborToJson (deserialise bs)) of+    Right v  -> v+    Left err -> error $ "deserialiseJSONWithSchema could not post-process: " ++ prettyValueError err++postprocessJSON :: API -> TypeName -> Value -> Either ValueError Value+postprocessJSON api = postprocessJSONTypeName (apiNormalForm api)++postprocessJSONTypeName :: NormAPI -> TypeName -> Value -> Either ValueError Value+postprocessJSONTypeName napi tn v = do+    t <- Map.lookup tn napi ?! InvalidAPI (TypeDoesNotExist tn)+    case t of+      NRecordType nrt -> postprocessJSONRecord napi nrt v+      NUnionType  nut -> postprocessJSONUnion  napi nut v+      NEnumType    _  -> pure v+      NTypeSynonym ty -> postprocessJSONType   napi ty  v+      NNewtype     bt -> postprocessJSONType   napi (TyBasic bt) v++postprocessJSONType :: NormAPI -> APIType -> Value -> Either ValueError Value+postprocessJSONType napi ty0 v = case ty0 of+    TyList ty  -> case v of+                   Array arr -> Array <$> traverse (postprocessJSONType napi ty) arr+                   _         -> Left $ JSONError $ expectedArray v+    TyMaybe ty -> case v of+                    Array arr -> case Vec.toList arr of+                                   []    -> pure Null+                                   [v1]  -> postprocessJSONType napi ty v1+                                   _:_:_ -> Left $ JSONError $ SyntaxError "over-long array when converting Maybe value"+                    _         -> Left $ JSONError $ expectedArray v+    TyName tn  -> postprocessJSONTypeName napi tn v+    TyBasic BTutc -> case v of+      Object obj -> case HMap.toList obj of+        [(k1, Number v0), (km12, Number v1)]+          | T.unpack k1 == "1" && T.unpack km12 == "-12" ->+          -- Taken from @Codec.Serialise.Class@:+          let psecs :: Pico+              psecs = realToFrac v1 / 1000000000000++              dt :: POSIXTime+              dt = realToFrac v0 + realToFrac psecs++          in pure $! String $! mkUTC' $! forceUTCTime (posixSecondsToUTCTime dt)+        _ -> Left $ JSONError UnexpectedField+      String t -> case parseUTC' t of+        Nothing -> Left $ JSONError $ SyntaxError $+                     "UTC time in wrong format: " ++ T.unpack t+        Just utcTime -> pure $! String $! mkUTC' $! forceUTCTime utcTime+      _ -> Left $ JSONError $ expectedObject v+    TyBasic _  -> pure v+    TyJSON     -> pure v++-- | Force the unnecessarily lazy @'UTCTime'@ representation.+forceUTCTime :: UTCTime -> UTCTime+forceUTCTime t@(UTCTime !_day !_daytime) = t++postprocessJSONRecord :: NormAPI -> NormRecordType -> Value -> Either ValueError Value+postprocessJSONRecord napi nrt v = case v of+    Object hm -> Object <$> HMap.traverseWithKey f hm+    _         -> Left $ JSONError $ expectedObject v+  where+    f t v' = do ty <- Map.lookup (FieldName t) nrt ?! JSONError UnexpectedField+                postprocessJSONType napi ty v'++postprocessJSONUnion :: NormAPI -> NormUnionType -> Value -> Either ValueError Value+postprocessJSONUnion napi nut v = case v of+    Object hm | [(k, r)] <- HMap.toList hm+              , Just ty <- Map.lookup (FieldName k) nut+              -> Object . HMap.singleton k <$> postprocessJSONType napi ty r+    _ -> Left $ JSONError $ expectedObject v
src/Data/API/Markdown.hs view
@@ -3,7 +3,7 @@ -- | This module generates Markdown-formatted documentation for an -- API, like this: ----- > ###Foo+-- > ### Foo -- > -- > a test defn -- >@@ -26,6 +26,7 @@  import qualified Data.CaseInsensitive       as CI import           Data.Char+import qualified Data.Text                  as T import           Text.Printf import           Control.Applicative import           Control.Lens@@ -42,7 +43,7 @@ defaultMarkdownMethods :: MarkdownMethods defaultMarkdownMethods =     MDM { mdmSummaryPostfix = const ""-        , mdmLink           = _TypeName+        , mdmLink           = T.unpack . _TypeName         , mdmPp             = (++)         , mdmFieldDefault   = \ _ _ -> Nothing         }@@ -64,7 +65,7 @@  header :: MarkdownMethods -> APINode -> MDComment -> MDComment header mdm an tl_md =-                                printf "###%s\n\n%s\n\n%s" nm_md (mdmPp mdm cm_md "") tl_md+                                printf "### %s\n\n%s\n\n%s" nm_md (mdmPp mdm cm_md "") tl_md   where     nm_md = type_name_md an     cm_md = comment_md   an@@ -107,13 +108,13 @@      dhs          = (replicate lnx '-',replicate 7 '-') -    lnx          = maximum $ 0 : map (length . _FieldName . fst) seAlts+    lnx          = maximum $ 0 : map (T.length . _FieldName . fst) seAlts      rws          = map fmt seAlts      hdr          = ("Enumeration","Comment") -    fmt (fn0,ct) = (_FieldName fn0,mdmPp mdm "" $ cln ct)+    fmt (fn0,ct) = (T.unpack (_FieldName fn0), mdmPp mdm "" $ cln ct)      cln ct       = reverse $ dropWhile isSpace $ reverse $ map tr ct       where@@ -143,7 +144,7 @@      fmt (fn0,fty) = ( fn, type_md mdm ty, flg_md, mdmPp mdm "" $ cleanComment ct )       where-        fn  = _FieldName fn0+        fn  = T.unpack (_FieldName fn0)         ty  = ftType fty         ct  = ftComment fty @@ -174,7 +175,7 @@      fmt (fn0,(ty,ct)) = ("_" ++ fn ++ "_",type_md mdm ty,mdmPp mdm "" $ cleanComment ct)       where-        fn  = _FieldName fn0+        fn  = T.unpack (_FieldName fn0)  cleanComment :: MDComment -> MDComment cleanComment ct = reverse $ dropWhile isSpace $ reverse $ map tr ct@@ -220,7 +221,7 @@       BTutc    -> "utc"  type_name_md, prefix_md, comment_md :: APINode -> MDComment-type_name_md = _TypeName   . anName+type_name_md = T.unpack . _TypeName . anName prefix_md    = CI.original . anPrefix comment_md   =               anComment 
src/Data/API/NormalForm.hs view
@@ -36,6 +36,7 @@ import           Data.API.PP import           Data.API.Types +import           Control.DeepSeq import           Data.Map (Map) import qualified Data.Map as Map import           Data.Set (Set)@@ -64,6 +65,13 @@     | NTypeSynonym APIType     | NNewtype     BasicType   deriving (Eq, Show)++instance NFData NormTypeDecl where+  rnf (NRecordType  x) = rnf x+  rnf (NUnionType   x) = rnf x+  rnf (NEnumType    x) = rnf x+  rnf (NTypeSynonym x) = rnf x+  rnf (NNewtype     x) = rnf x  -- | The canonical form of a record type is a map from fields to -- values...
src/Data/API/PP.hs view
@@ -8,7 +8,7 @@     , indent     ) where -import           Data.API.JSON+import           Data.API.Scan (keywords) import           Data.API.Types  import qualified Data.Aeson                     as JS@@ -52,10 +52,13 @@   ppLines v = lines $ BL.unpack $ JS.encodePretty v  instance PP TypeName where-  pp = _TypeName+  pp = T.unpack . _TypeName  instance PP FieldName where-  pp = _FieldName+  pp (FieldName fn_t) | fn `elem` keywords = "'" ++ fn ++ "'"+                      | otherwise          = fn+    where+      fn = T.unpack fn_t  instance PP APIType where   pp (TyList  ty) = "[" ++ pp ty ++ "]"@@ -86,6 +89,3 @@  instance (PPLines s, PPLines t) => PPLines (s, t) where   ppLines (s, t) = ppLines s ++ ppLines t--instance PPLines Step where-  ppLines s = [prettyStep s]
src/Data/API/Parse.y view
@@ -98,8 +98,8 @@  Node :: { APINode } Node-    : Prefix '::' typeiden Comments '=' Spec With-                                        { APINode (TypeName $3) $4 $1 $6 $7 }+    : Prefix '::' TypeName Comments '=' Spec With+                                        { APINode $3 $4 $1 $6 $7 }  Spec :: { Spec } Spec@@ -188,7 +188,7 @@ Type     : '?' Type                          { TyMaybe            $2             }     | '[' Type ']'                      { TyList             $2             }-    | typeiden                          { TyName   (TypeName $1)            }+    | TypeName                          { TyName             $1             }     | BasicType                         { TyBasic            $1             }     | json                              { TyJSON                            } @@ -206,7 +206,7 @@  FieldName :: { FieldName } FieldName-    : VarIdentifier                     { FieldName $1                      }+    : VarIdentifier                     { FieldName (T.pack $1)             }  VarIdentifier :: { String }     : variden                           { $1                                }@@ -216,7 +216,7 @@     | to                                { "to"                              }  TypeName :: { TypeName }-    : typeiden                          { TypeName $1                       }+    : typeiden                          { TypeName (T.pack $1)              }  APIChangelog :: { APIChangelog } APIChangelog
src/Data/API/Scan.x view
@@ -6,6 +6,7 @@     , PToken     , AlexPosn(..)     , Token(..)+    , keywords     ) where  import           Data.API.Types@@ -41,8 +42,8 @@     ">="                                { simple    GtEq            }     "?"                                 { simple    Query           }     ","                                 { simple    Comma           }-    version                             { simple    Version         }-    with                                { simple    With            }    +    version                             { simple    Version         } -- N.B. extend the 'keywords list below+    with                                { simple    With            } -- when adding new keywords!     integer                             { simple    Integer         }     boolean                             { simple    Boolean         }     utc                                 { simple    UTC             }@@ -78,6 +79,14 @@     "(*"(\n|[^\*]|\*[^\)])*"*)"         { block_comment             }  {++keywords :: [String]+keywords = [ "version", "with", "integer", "boolean", "utc", "string"+           , "binary", "json", "record", "union", "enum", "basic", "changes"+           , "added", "removed", "renamed", "changed", "default", "field"+           , "alternative", "migration", "to", "nothing", "true", "false"+           , "read-only"+           ]  type PToken = (AlexPosn,Token) 
src/Data/API/TH.hs view
@@ -9,14 +9,21 @@     , funSigD     , simpleD     , simpleSigD+    , mkNameText+    , fieldNameE+    , fieldNameVarE+    , typeNameE     ) where +import           Data.API.TH.Compat import           Data.API.Tools.Combinators+import           Data.API.Types  import           Control.Applicative import           Control.Monad+import qualified Data.Text                      as T import           Language.Haskell.TH-+import           Prelude  -- | Construct an idiomatic expression (an expression in an -- Applicative context), i.e.@@ -45,7 +52,7 @@     exists <- isInstance c ts     if exists then do when (warnOnOmittedInstance stgs) $ reportWarning $ msg ts                       return []-              else return [InstanceD [] (foldl AppT (ConT c) ts) ds]+              else return [mkInstanceD [] (foldl AppT (ConT c) ts) ds]   where     msg ts = "instance " ++ pprint c ++ " " ++ pprint ts ++ " already exists, so it was not generated" @@ -61,3 +68,19 @@ -- | Construct a simple TH definition with a type signature simpleSigD :: Name -> TypeQ -> ExpQ -> Q [Dec] simpleSigD n t e = funSigD n t [clause [] (normalB e) []]+++mkNameText :: T.Text -> Name+mkNameText = mkName . T.unpack+++-- | Field name as a string expression+fieldNameE :: FieldName -> ExpQ+fieldNameE = stringE . T.unpack . _FieldName++-- | Field name as a variable+fieldNameVarE :: FieldName -> ExpQ+fieldNameVarE = varE . mkNameText . _FieldName++typeNameE :: TypeName -> ExpQ+typeNameE = stringE . T.unpack . _TypeName
+ src/Data/API/TH/Compat.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}+module Data.API.TH.Compat where++import Language.Haskell.TH++mkDataD :: Cxt -> Name -> [TyVarBndr] -> [Con] -> [Name] -> Dec+mkDataD cxt1 name tyVarBndrs cons drvs =+#if MIN_VERSION_template_haskell(2,11,0)+  DataD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)+#else+  DataD cxt1 name tyVarBndrs cons drvs+#endif++mkInstanceD :: Cxt -> Type -> [Dec] -> Dec+mkInstanceD =+#if MIN_VERSION_template_haskell(2,11,0)+  InstanceD Nothing+#else+  InstanceD+#endif++mkNewtypeD :: Cxt -> Name -> [TyVarBndr] -> Con -> [Name] -> Dec+mkNewtypeD cxt1 name tyVarBndrs cons drvs =+#if MIN_VERSION_template_haskell(2,11,0)+  NewtypeD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)+#else+  NewtypeD cxt1 name tyVarBndrs cons drvs+#endif++----------------------------------------++type Strictness =+#if MIN_VERSION_template_haskell(2,11,0)+  Bang+#else+  Strict+#endif++annIsStrict :: Strictness+annIsStrict =+#if MIN_VERSION_template_haskell(2,11,0)+  Bang NoSourceUnpackedness SourceStrict+#else+  IsStrict+#endif++annNotStrict :: Strictness+annNotStrict =+#if MIN_VERSION_template_haskell(2,11,0)+  Bang NoSourceUnpackedness NoSourceStrictness+#else+  NotStrict+#endif
src/Data/API/Tools.hs view
@@ -27,7 +27,13 @@     , deepSeqTool     , jsonTool     , jsonTool'+    , cborTool     , jsonTestsTool+    , cborTestsTool+    , cborToJSONTestsTool+    , jsonToCBORTestsTool+    , jsonGenericValueTestsTool+    , cborGenericValueTestsTool     , lensTool     , quickCheckTool     , safeCopyTool@@ -39,6 +45,7 @@ import           Data.API.Tools.DeepSeq import           Data.API.Tools.Enum import           Data.API.Tools.Example+import           Data.API.Tools.CBOR import           Data.API.Tools.JSON import           Data.API.Tools.JSONTests import           Data.API.Tools.Lens@@ -46,7 +53,7 @@ import           Data.API.Tools.SafeCopy import           Data.API.Types -import           Data.Monoid+import qualified Data.Monoid                    as Monoid import           Language.Haskell.TH  @@ -70,4 +77,4 @@ -- | Apply a list of tools to an 'API', generating TH declarations. -- This form allows the 'ToolSettings' to be overridden. generateAPIToolsWith :: ToolSettings -> API -> [APITool] -> Q [Dec]-generateAPIToolsWith ts api tools = runTool (mconcat tools) ts api+generateAPIToolsWith ts api tools = runTool (Monoid.mconcat tools) ts api
+ src/Data/API/Tools/CBOR.hs view
@@ -0,0 +1,200 @@+{-# LANGUAGE CPP                        #-}+{-# LANGUAGE TemplateHaskell            #-}++module Data.API.Tools.CBOR+    ( cborTool+    ) where++import           Data.API.TH+import           Data.API.Tools.Combinators+import           Data.API.Tools.Datatypes+import           Data.API.Tools.Enum+import           Data.API.Types++import           Control.Applicative+import           Codec.Serialise.Class+import           Codec.Serialise.Decoding+import           Codec.Serialise.Encoding+import           Data.Binary.Serialise.CBOR.Extra+import           Data.List (foldl', sortBy)+import qualified Data.Map                       as Map+import           Data.Monoid+import           Data.Ord (comparing)+import qualified Data.Text                      as T+import           Language.Haskell.TH+import           Prelude++-- | Tool to generate 'Serialise' instances for types generated by+-- 'datatypesTool'. This depends on 'enumTool'.+cborTool :: APITool+cborTool = apiNodeTool $+             apiSpecTool gen_sn_to gen_sr_to gen_su_to gen_se_to mempty+             <> gen_pr++{-+instance Serialise JobId where+    encode = encode . _JobId+    decode = JobId <$> decode++In this version we don't check the @snFilter@, for simplicity and speed.+This is safe, since the CBOR code is used only internally as a data+representation format, not as a communication format with clients+that could potentially send faulty data.+-}++gen_sn_to :: Tool (APINode, SpecNewtype)+gen_sn_to = mkTool $ \ ts (an, sn) -> optionalInstanceD ts ''Serialise [nodeRepT an]+                                          [ simpleD 'encode (bdy_in an sn)+                                          , simpleD 'decode (bdy_out ts an sn)]+  where+    bdy_in an sn = [e| $(ine sn) . $(newtypeProjectionE an) |]+    bdy_out ts an sn = [e| $(nodeNewtypeConE ts an sn) <$> $(oute sn) |]++    ine sn = case snType sn of+            BTstring -> [e| encodeString |]+            BTbinary -> [e| encode |]+            BTbool   -> [e| encodeBool |]+            BTint    -> [e| encodeInt |]+            BTutc    -> [e| encode |]+++    oute sn =+        case snType sn of+            BTstring -> [e| decodeString |]+            BTbinary -> [e| decode |]+            BTbool   -> [e| decodeBool |]+            BTint    -> [e| decodeInt |]+            BTutc    -> [e| decode |]++++{-+instance Serialise JobSpecId where+     encode = \ x ->+        encodeMapLen 4 >>+        encodeRecordFields+            [ encodeString "Id"         <> encode (jsiId         x)+            , encodeString "Input"      <> encode (jsiInput      x)+            , encodeString "Output"     <> encode (jsiOutput     x)+            , encodeString "PipelineId" <> encode (jsiPipelineId x)+            ]+     decode (Record v) =+        decodeMapLen >>+        JobSpecId <$> (decodeString >> decode)+                  <*> (decodeString >> decode)+                  <*> (decodeString >> decode)+                  <*> (decodeString >> decode)++Note that fields are stored alphabetically ordered by field name, so+that we are insensitive to changes in field order in the schema.+-}++gen_sr_to :: Tool (APINode, SpecRecord)+gen_sr_to = mkTool $ \ ts (an, sr) -> do+    x <- newName "x"+    optionalInstanceD ts ''Serialise [nodeRepT an] [ simpleD 'encode (bdy_in an sr x)+                                                   , simpleD 'decode (cl an sr)+                                                   ]+  where+    bdy_in an sr x =+        let fields = sortFields sr+            len = fromIntegral (length fields)  -- to Integer+            lenE = varE 'fromIntegral  -- to Word+                     `appE` (sigE (litE (integerL len))+                                  (conT ''Integer))+            -- Micro-optimization: we use the statically known @len@ value+            -- instead of creating a list of thunks from the argument of+            -- @encodeRecordFields@ and dynamically calculating+            -- it's length, long before the list is fully forced.+            writeRecordHeader = varE 'encodeMapLen `appE` lenE+            encFields =+                varE 'encodeRecordFields `appE`+                    listE [ [e| encodeString $(fieldNameE fn)+                                <> encode ($(nodeFieldE an fn) $(varE x)) |]+                            | (fn, _fty) <- fields ]+        in lamE [varP x] $+               varE '(<>)+                 `appE` writeRecordHeader+                 `appE` encFields++    cl an sr    = varE '(>>)+                    `appE` (varE 'decodeMapLen)  -- TODO (extra check): check len with srFields+                    `appE` bdy+      where+        sorted_fields   = map fst $ sortFields sr+        original_fields = map fst $ srFields sr+        bdy = applicativeE dataCon $ map project sorted_fields+        project _fn = [e| decodeString >> decode |]+          -- TODO (correctness): check that $(fieldNameE fn) matches the decoded name+          -- and if not, use the default value, etc.++        -- If the fields are sorted, just use the data constructor,+        -- but if not, generate a reordering function like+        --   \ _foo_a _foo_b -> Con _foo_b _foo_a+        dataCon | sorted_fields == original_fields = nodeConE an+                | otherwise = lamE (map (nodeFieldP an) sorted_fields)+                                   (foldl' appE (nodeConE an) (map (nodeFieldE an) original_fields))++    sortFields sr = sortBy (comparing fst) $ srFields sr++{-+instance Serialise Foo where+    encode (Bar x) = encodeUnion "x" x+    encode (Baz x) = object [ "y" .= x ]+    decode = decodeUnion [ ("x", fmap Bar . decode)+                         , ("y", fmap Baz . decode) ]++-}++gen_su_to :: Tool (APINode, SpecUnion)+gen_su_to = mkTool $ \ ts (an, su) -> optionalInstanceD ts ''Serialise [nodeRepT an]+                                        [ funD    'encode (cls an su)+                                        , simpleD 'decode (bdy_out an su)+                                        ]+  where+    cls an su = map (cl an) (suFields su)++    cl an (fn, (_ty, _)) = do+      x <- newName "x"+      clause [nodeAltConP an fn [varP x]] (bdy fn x) []++    bdy fn x = normalB [e| encodeUnion $(fieldNameE fn) (encode $(varE x)) |]+++    bdy_out an su = varE 'decodeUnion `appE` listE (map (alt an) (suFields su))++    alt an (fn, _) = [e| ( $(fieldNameE fn) , fmap $(nodeAltConE an fn) decode ) |]+++{-+instance Serialise FrameRate where+    encode = encodeString . _text_FrameRate+    decode = decodeString >>= cborStrMap_p _map_FrameRate+-}++gen_se_to :: Tool (APINode, SpecEnum)+gen_se_to = mkTool $ \ ts (an, _se) -> optionalInstanceD ts ''Serialise [nodeRepT an]+                                         [ simpleD 'encode (bdy_in an)+                                         , simpleD 'decode (bdy_out an)+                                         ]+  where+    bdy_in an = [e| encodeString . $(varE (text_enum_nm an)) |]++    bdy_out an = [e| decodeString >>= cborStrMap_p $(varE (map_enum_nm an)) |]++-- In a monad, to @fail@ instead of crashing with @error@.+cborStrMap_p :: (Monad m, Ord a) => Map.Map T.Text a -> T.Text -> m a+cborStrMap_p mp t = case Map.lookup t mp of+  Nothing -> fail "Unexpected enumeration key in CBOR"+  Just r -> return r+++gen_pr :: Tool APINode+gen_pr = mkTool $ \ ts an -> case anConvert an of+  Nothing               -> return []+  Just (inj_fn, prj_fn) -> optionalInstanceD ts ''Serialise [nodeT an] [ simpleD 'encode bdy_in+                                                                       , simpleD 'decode bdy_out+                                                                       ]+   where+    bdy_in  = [e| encode . $(fieldNameVarE prj_fn) |]+    bdy_out = [e| decode >>= $(fieldNameVarE inj_fn) |]
src/Data/API/Tools/Combinators.hs view
@@ -28,6 +28,7 @@ import           Control.Applicative import           Data.Monoid import           Language.Haskell.TH+import           Prelude   -- | Settings to control the behaviour of API tools.  This record may
src/Data/API/Tools/Datatypes.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE TemplateHaskell            #-} module Data.API.Tools.Datatypes     ( datatypesTool+    , datatypesTool'+    , defaultDerivedClasses     , type_nm     , rep_type_nm     , nodeT@@ -8,12 +10,14 @@     , nodeConE     , nodeNewtypeConE     , nodeFieldE+    , nodeFieldP     , nodeAltConE     , nodeAltConP     , newtypeProjectionE     ) where  import           Data.API.TH+import           Data.API.TH.Compat import           Data.API.Tools.Combinators import           Data.API.Types @@ -28,20 +32,26 @@ import           Data.Typeable import           Language.Haskell.TH import           Text.Regex+import           Prelude   -- | Tool to generate datatypes and type synonyms corresponding to an API datatypesTool :: APITool-datatypesTool = apiNodeTool $ apiSpecTool (mkTool     $ uncurry . gen_sn_dt)-                                          (simpleTool $ uncurry gen_sr_dt)-                                          (simpleTool $ uncurry gen_su_dt)-                                          (simpleTool $ uncurry gen_se_dt)-                                          (simpleTool $ uncurry gen_sy)+datatypesTool = datatypesTool' defaultDerivedClasses +-- | Tool to generate datatypes and type synonyms corresponding to an+-- API, where the function specifies the derived classes for each datatype.+datatypesTool' :: (APINode -> [Name]) -> APITool+datatypesTool' deriv = apiNodeTool $ apiSpecTool (mkTool     (gen_sn_dt deriv))+                                                 (simpleTool (gen_sr_dt deriv))+                                                 (simpleTool (gen_su_dt deriv))+                                                 (simpleTool (gen_se_dt deriv))+                                                 (simpleTool gen_sy) + -- | Generate a type synonym definition-gen_sy :: APINode -> APIType -> Q [Dec]-gen_sy as ty = return [TySynD (type_nm as) [] $ mk_type ty]+gen_sy :: (APINode, APIType) -> Q [Dec]+gen_sy (as, ty) = return [TySynD (type_nm as) [] $ mk_type ty]   -- | Generate a newtype definition, like this:@@ -57,22 +67,15 @@ -- > mkEmailAddress :: T.Text -> Maybe EmailAddress -- > mkEmailAddress t = ... -- check filter -gen_sn_dt :: ToolSettings -> APINode -> SpecNewtype -> Q [Dec]-gen_sn_dt ts as sn = (nd :) <$> if smart then sc else return []+gen_sn_dt :: (APINode -> [Name]) -> ToolSettings -> (APINode, SpecNewtype) -> Q [Dec]+gen_sn_dt deriv ts (as, sn) = (nd :) <$> if smart then sc else return []   where-    nd  = NewtypeD [] nm [] c $ derive_leaf_nms ++ iss-    c   = RecC (newtype_con_nm smart as) [(newtype_prj_nm as,NotStrict,wrapped_ty)]+    nd  = mkNewtypeD [] nm [] c (deriv as)+    c   = RecC (newtype_con_nm smart as) [(newtype_prj_nm as,annNotStrict,wrapped_ty)]     wrapped_ty = mk_type $ TyBasic (snType sn)      nm  = rep_type_nm as -    iss = case snType sn of-            BTstring -> [''IsString]-            BTbinary -> []-            BTbool   -> []-            BTint    -> []-            BTutc    -> []-     smart = newtypeSmartConstructors ts && isJust (snFilter sn)      sc  = simpleSigD (newtype_smart_con_nm as) [t| $(return wrapped_ty) -> Maybe $(nodeRepT as) |] $@@ -98,12 +101,11 @@ -- >         } -- >     deriving (Show,Eq,Typeable) -gen_sr_dt :: APINode -> SpecRecord -> Q [Dec]-gen_sr_dt as sr = return [DataD [] nm [] cs derive_node_nms] -- [show_nm,eq_nm]+gen_sr_dt :: (APINode -> [Name]) -> (APINode, SpecRecord) -> Q [Dec]+gen_sr_dt deriv (as, sr) = return [mkDataD [] nm [] cs (deriv as)]   where-    cs = [RecC nm [(pref_field_nm as fnm,IsStrict,mk_type (ftType fty)) |+    cs = [RecC nm [(pref_field_nm as fnm,annIsStrict,mk_type (ftType fty)) |                                                 (fnm,fty)<-srFields sr]]-     nm = rep_type_nm as  @@ -112,12 +114,11 @@ -- > data Foo = F_Bar Int | F_Baz Bool -- >     deriving (Show,Typeable) -gen_su_dt :: APINode -> SpecUnion -> Q [Dec]-gen_su_dt as su = return [DataD [] nm [] cs derive_node_nms] -- [show_nm,eq_nm]+gen_su_dt :: (APINode -> [Name]) -> (APINode, SpecUnion) -> Q [Dec]+gen_su_dt deriv (as, su) = return [mkDataD [] nm [] cs (deriv as)]   where-    cs = [NormalC (pref_con_nm as fnm) [(IsStrict,mk_type ty)] |+    cs = [NormalC (pref_con_nm as fnm) [(annIsStrict,mk_type ty)] |                                             (fnm,(ty,_))<-suFields su]-     nm = rep_type_nm as  @@ -135,11 +136,10 @@ -- >     | FR_60 -- >     deriving (Show,Eq,Ord,Bounded,Enum,Typeable) -gen_se_dt :: APINode -> SpecEnum -> Q [Dec]-gen_se_dt as se = return [DataD [] nm [] cs $ derive_leaf_nms ++ [''Bounded, ''Enum]]+gen_se_dt :: (APINode -> [Name]) -> (APINode, SpecEnum) -> Q [Dec]+gen_se_dt deriv (as, se) = return [mkDataD [] nm [] cs (deriv as)]   where     cs = [NormalC (pref_con_nm as fnm) [] | (fnm,_) <- seAlts se ]-     nm = rep_type_nm as  @@ -148,7 +148,7 @@     case ty of       TyList  ty'  -> AppT ListT  $ mk_type ty'       TyMaybe ty'  -> AppT (ConT ''Maybe) $ mk_type ty'-      TyName  nm   -> ConT  $ mkName $ _TypeName nm+      TyName  nm   -> ConT  $ mkNameText $ _TypeName nm       TyBasic bt   -> basic_type bt       TyJSON       -> ConT ''Value @@ -162,6 +162,21 @@       BTutc    -> ConT ''UTCTime  +-- | Default names of classes for which to derive instances, depending+-- on the type of API node.+defaultDerivedClasses :: APINode -> [Name]+defaultDerivedClasses an = case anSpec an of+    SpNewtype sn -> case snType sn of+                      BTstring -> ''IsString : derive_leaf_nms+                      BTbinary -> derive_leaf_nms+                      BTbool   -> derive_leaf_nms+                      BTint    -> derive_leaf_nms+                      BTutc    -> derive_leaf_nms+    SpRecord  _  -> derive_node_nms+    SpUnion   _  -> derive_node_nms+    SpEnum    _  -> derive_leaf_nms ++ [''Bounded, ''Enum]+    SpSynonym _  -> []+ derive_leaf_nms :: [Name] derive_leaf_nms = [''Show,''Eq,''Ord,''Typeable] @@ -171,7 +186,7 @@  -- | Name of the type corresponding to the API node, e.g. @JobId@ type_nm :: APINode -> Name-type_nm an = mkName $ _TypeName $ anName an+type_nm an = mkName $ T.unpack $ _TypeName $ anName an  -- | Name of the representation type corresponding to the API node, -- which differs from the 'type_nm' only if custom conversion@@ -197,21 +212,21 @@ newtype_smart_con_nm an = mkName $ "mk" ++ rep_type_s an  rep_type_s :: APINode -> String-rep_type_s an = f $ _TypeName $ anName an+rep_type_s an = f $ T.unpack $ _TypeName $ anName an   where     f s = maybe s (const ("REP__"++s)) $ anConvert an  -- | Construct the name of a record field by attaching the -- type-specific prefix, in lowercase, e.g. @_jsi_id@ pref_field_nm :: APINode -> FieldName -> Name-pref_field_nm as fnm = mkName $ pre ++ _FieldName fnm+pref_field_nm as fnm = mkName $ pre ++ T.unpack (_FieldName fnm)   where     pre = "_" ++ map toLower (CI.original $ anPrefix as) ++ "_"  -- | Construct the name of a union or enum constructor by attaching -- the type-specific prefix, in uppercase, e.g. @FR_auto@ pref_con_nm :: APINode -> FieldName -> Name-pref_con_nm as fnm = mkName $ pre ++ _FieldName fnm+pref_con_nm as fnm = mkName $ pre ++ T.unpack (_FieldName fnm)   where     pre = map toUpper (CI.original $ anPrefix as) ++ "_" @@ -235,6 +250,10 @@ -- | A record field in an API node, as an expression nodeFieldE :: APINode -> FieldName -> ExpQ nodeFieldE an fnm = varE $ pref_field_nm an fnm++-- | A record field in an API node, as a pattern+nodeFieldP :: APINode -> FieldName -> PatQ+nodeFieldP an fnm = varP $ pref_field_nm an fnm  -- | A prefixed constructor for a union or enum, as an expression nodeAltConE :: APINode -> FieldName -> ExpQ
src/Data/API/Tools/DeepSeq.hs view
@@ -12,6 +12,7 @@ import           Control.DeepSeq import           Data.Monoid import           Language.Haskell.TH+import           Prelude   -- | Tool to generate 'NFData' instances for generated types.@@ -46,4 +47,6 @@         f (fn,_) = match (nodeAltConP an fn [varP y]) (normalB [e|rnf $(varE y)|]) []  gen_se :: Tool (APINode, SpecEnum)-gen_se = mkTool $ \ ts (an, _) -> optionalInstanceD ts ''NFData [nodeRepT an] []+gen_se = mkTool $ \ ts (an, _) ->+    optionalInstanceD ts ''NFData [nodeRepT an]+        [simpleD 'rnf [e| \ x -> seq x () |] ]
src/Data/API/Tools/Enum.hs view
@@ -45,7 +45,7 @@ -- >             FR60      -> "60"  text_enum_nm :: APINode -> Name-text_enum_nm an = mkName $ "_text_" ++ (_TypeName $ anName an)+text_enum_nm an = mkName $ "_text_" ++ T.unpack (_TypeName $ anName an)  gen_se_tx :: APINode -> SpecEnum -> Q [Dec] gen_se_tx as se = simpleSigD (text_enum_nm as)@@ -59,7 +59,7 @@      pt fnm = nodeAltConP as fnm [] -    bd fnm = normalB $ stringE $ _FieldName fnm+    bd fnm = normalB $ stringE $ T.unpack $ _FieldName fnm   @@ -70,7 +70,7 @@ -- > _map_FrameRate = genTextMap _text_FrameRate  map_enum_nm :: APINode -> Name-map_enum_nm  an = mkName $ "_map_"  ++ (_TypeName $ anName an)+map_enum_nm  an = mkName $ "_map_"  ++ T.unpack (_TypeName $ anName an)  gen_se_mp :: APINode -> Q [Dec] gen_se_mp as = simpleSigD (map_enum_nm as)
src/Data/API/Tools/Example.hs view
@@ -24,6 +24,7 @@ import           Safe import           Test.QuickCheck                as QC import qualified Data.Text                      as T+import           Prelude   -- | The Example class is used to generate a documentation-friendly@@ -79,7 +80,7 @@     gen_sample :: APINode -> ExpQ     gen_sample an = [e| ($str, fmap toJSON (example :: Gen $(nodeT an))) |]       where-        str = stringE $ _TypeName $ anName an+        str = stringE $ T.unpack $ _TypeName $ anName an   -- | Tool to generate 'Example' instances for types generated by
src/Data/API/Tools/JSON.hs view
@@ -24,6 +24,7 @@ import           Data.Monoid import qualified Data.Text                      as T import           Language.Haskell.TH+import           Prelude   -- | Tool to generate 'ToJSON' and 'FromJSONWithErrs' instances for@@ -220,7 +221,7 @@    where     bdy = do x <- newName "x"              lamE [varP x] [e| parseJSONWithErrs $(varE x) >>= $inj |]-    inj = varE $ mkName $ _FieldName inj_fn+    inj = fieldNameVarE inj_fn   gen_pr :: Tool APINode@@ -229,7 +230,7 @@   Just (_, prj_fn) -> optionalInstanceD ts ''ToJSON [nodeT an] [simpleD 'toJSON bdy]    where     bdy = [e| toJSON . $prj |]-    prj = varE $ mkName $ _FieldName prj_fn+    prj = fieldNameVarE prj_fn   -- | Generate 'FromJSON' instances like this:@@ -260,10 +261,3 @@ json_string_p xs p (String t) | Just val <- p t = pure val                               | otherwise       = failWith $ UnexpectedEnumVal xs t json_string_p _  _ v                            = failWith $ expectedString v---fieldNameE :: FieldName -> ExpQ-fieldNameE = stringE . _FieldName--typeNameE :: TypeName -> ExpQ-typeNameE = stringE . _TypeName
src/Data/API/Tools/JSONTests.hs view
@@ -1,44 +1,112 @@ {-# LANGUAGE ScopedTypeVariables  #-} {-# LANGUAGE TemplateHaskell      #-} {-# LANGUAGE QuasiQuotes          #-}+{-# LANGUAGE BangPatterns #-}  -- Here we use Template Haskell to generate a test suite for the Aeson wrappers -- from the DSL description of same.  module Data.API.Tools.JSONTests-    ( jsonTestsTool+    ( -- * Tools+      jsonTestsTool+    , cborTestsTool+    , cborToJSONTestsTool+    , jsonToCBORTestsTool+    , jsonGenericValueTestsTool+    , cborGenericValueTestsTool++      -- * Properties     , prop_decodesTo     , prop_decodesTo'     , prop_resultsMatchRoundtrip+    , prop_cborRoundtrip+    , prop_cborToJSON+    , prop_jsonToCBOR     ) where  import           Data.API.JSON+import           Data.API.JSONToCBOR import           Data.API.Tools.Combinators import           Data.API.Tools.Datatypes import           Data.API.TH import           Data.API.Types+import           Data.API.Value  import qualified Data.Aeson                     as JS+import           Codec.Serialise+import           Data.Binary.Serialise.CBOR.JSON () import           Language.Haskell.TH import           Test.QuickCheck+import           Test.QuickCheck.Property       as QCProperty+import           Prelude  --- | Tool to generate a list of tests of type @[('String', 'Property')]@--- with the given name.  This depends on 'jsonTool' and 'quickCheckTool'.+-- | Tool to generate a list of JSON round-trip tests of type+-- @[('String', 'Property')]@ with the given name.  This depends on+-- 'jsonTool' and 'quickCheckTool'. jsonTestsTool :: Name -> APITool-jsonTestsTool nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api)+jsonTestsTool = testsTool 'prop_resultsMatchRoundtrip++-- | Tool to generate a list of CBOR round-trip tests of type+-- @[('String', 'Property')]@ with the given name.  This depends on+-- 'cborTool' and 'quickCheckTool'.+cborTestsTool :: Name -> APITool+cborTestsTool = testsTool 'prop_cborRoundtrip++-- | Tool to generate a list of tests of type @[('String', 'Property')]@+-- based on instantiating the first argument at type @A -> Bool@ for each+-- type @A@ in the API.  The second argument is the name of the declaration+-- that should be produced.+testsTool :: Name -> Name -> APITool+testsTool prop_nm nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api)   where-    props api = listE $ map generateProp [ an | ThNode an <- api ]+    props api = listE $ map (generateProp prop_nm) [ an | ThNode an <- api ]  -- | For an APINode, generate a (String, Property) pair giving the--- type name and an appropriate instance of the--- prop_resultsMatchRoundtrip property-generateProp :: APINode -> ExpQ-generateProp an = [e| ($ty, property (prop_resultsMatchRoundtrip :: $(nodeT an) -> Bool)) |]+-- type name and an appropriate instance of the property+generateProp :: Name -> APINode -> ExpQ+generateProp prop_nm an = [e| ($ty, property ($(varE prop_nm) :: $(nodeT an) -> Bool)) |]   where-    ty = stringE $ _TypeName $ anName an+    ty = typeNameE $ anName an  +-- | Tool to generate a list of CBOR-to-JSON conversion tests of type+-- @[('String', 'Property')]@.  The first name must be the 'API' being+-- tested, and the second should be the name of the declaration to be+-- produced.  This depends on 'cborTool', 'jsonTool' and 'quickCheckTool'.+cborToJSONTestsTool :: Name -> Name -> APITool+cborToJSONTestsTool = schemaTestsTool 'prop_cborToJSON++-- | Tool to generate a list of JSON-to-CBOR conversion tests of type+-- @[('String', 'Property')]@.  The first name must be the 'API' being+-- tested, and the second should be the name of the declaration to be+-- produced.  This depends on 'cborTool', 'jsonTool' and 'quickCheckTool'.+jsonToCBORTestsTool :: Name -> Name -> APITool+jsonToCBORTestsTool = schemaTestsTool 'prop_jsonToCBOR++-- | Tool to generate a list of tests that the 'JS.Value' generic+-- representation agrees with the type-specific JSON representation.+jsonGenericValueTestsTool :: Name -> Name -> APITool+jsonGenericValueTestsTool = schemaTestsTool 'prop_jsonGeneric++-- | Tool to generate a list of tests that the 'Value' generic+-- representation agrees with the type-specific CBOR representation.+cborGenericValueTestsTool :: Name -> Name -> APITool+cborGenericValueTestsTool = schemaTestsTool 'prop_cborGeneric++-- | Tool to generate a list of tests of properties that take the API+-- and the type name as arguments, and return a 'QCProperty.Result'.+schemaTestsTool :: Name -> Name -> Name -> APITool+schemaTestsTool prop_nm api_nm nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api)+  where+    props api = listE $ map genProp [ an | ThNode an <- api ]++    genProp an = [e| ($ty, property ($(varE prop_nm) $(varE api_nm) tn :: $(nodeT an) -> QCProperty.Result)) |]+      where+        tn = anName an+        ty = typeNameE $ anName an++ -- | QuickCheck property that a 'Value' decodes to an expected Haskell -- value, using 'fromJSONWithErrs' prop_decodesTo :: forall a . (Eq a, FromJSONWithErrs a)@@ -61,3 +129,40 @@ prop_resultsMatchRoundtrip :: forall a . (Eq a, JS.ToJSON a, FromJSONWithErrs a )                            => a -> Bool prop_resultsMatchRoundtrip x = prop_decodesTo (JS.toJSON x) x++-- | QuickCheck property that CBOR decoding is a left inverse for encoding+prop_cborRoundtrip :: forall a . (Eq a, Serialise a)+                   => a -> Bool+prop_cborRoundtrip x = deserialise (serialise x) == x++-- | QuickCheck property that 'toJSON' agrees with encoding to CBOR+-- directly and then decoding using the schema-aware generic decoder.+-- From this and 'prop_resultsMatchRoundtrip' it follows that+--+-- > fromJSONWithErrs . deserialiseJSONWithSchema . serialise == id+prop_cborToJSON :: forall a . (Eq a, Serialise a, JS.ToJSON a)+                   => API -> TypeName -> a -> QCProperty.Result+prop_cborToJSON api tn x+  | v1 == v2  = succeeded+  | otherwise = failed { QCProperty.reason = "Post-processed: " ++ show v1+                                        ++ "\nDirect JSON:    " ++ show v2 }+  where+    v1 = deserialiseJSONWithSchema api tn (serialise x)+    v2 = JS.toJSON x++-- | QuickCheck property that direct encoding to CBOR agrees with+-- conversion to JSON followed by the schema-aware generic encoder.+-- From this and 'prop_cborRoundtrip' it follows that+--+-- > deserialise . serialiseJSONWithSchema . toJSON == id+prop_jsonToCBOR :: forall a . (Eq a, Serialise a, JS.ToJSON a)+                => API -> TypeName -> a -> QCProperty.Result+prop_jsonToCBOR api tn x+  | e1 == e2  = succeeded+  | otherwise = failed { QCProperty.reason = "Failed with JSON:      " ++ show v+                                        ++ "\nGeneric serialisation: " ++ show e1+                                        ++ "\nDirect serialisation:  " ++ show e2 }+  where+    v  = JS.toJSON x+    e1 = serialiseJSONWithSchema api tn v+    e2 = serialise x
src/Data/API/Tools/QuickCheck.hs view
@@ -18,6 +18,7 @@ import           Language.Haskell.TH import           Safe import           Test.QuickCheck                as QC+import           Prelude   -- | Tool to generate 'Arbitrary' instances for generated types.@@ -110,6 +111,7 @@ arbitraryUTCRange (UTCRange Nothing   Nothing  ) = QC.arbitrary  -- TODO: use a more arbitrary instance (quickcheck-instances?)+-- (in particular, there are no subsecond-resolution times here) instance QC.Arbitrary UTCTime where     arbitrary = QC.elements         [ mk "2010-01-01T00:00:00Z"@@ -119,6 +121,8 @@         , mk "2009-11-12T20:57:54Z"         , mk "2000-10-28T21:03:24Z"         , mk "1965-03-10T09:23:01Z"+        -- , mk "1965-03-10T09:23:01.001Z"+        -- , mk "1965-03-10T09:23:01.000001Z"         ]       where         mk  = fromJustNote lab . parseUTC'
src/Data/API/Tools/SafeCopy.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE TemplateHaskell            #-}-{-# OPTIONS_GHC -fno-warn-orphans       #-}  module Data.API.Tools.SafeCopy     ( safeCopyTool@@ -7,7 +6,6 @@  import           Data.API.Tools.Combinators import           Data.API.Tools.Datatypes-import           Data.API.Types  import           Data.SafeCopy @@ -16,5 +14,3 @@ -- present, this derives only base version instances. safeCopyTool :: APITool safeCopyTool = apiDataTypeTool $ simpleTool $ deriveSafeCopy 0 'base . rep_type_nm--$(deriveSafeCopy 0 'base ''Binary)
src/Data/API/Tools/Traversal.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedStrings          #-} {-# LANGUAGE RankNTypes                 #-} {-# LANGUAGE TemplateHaskell            #-} @@ -16,8 +17,10 @@ import           Data.Maybe import           Data.Monoid import qualified Data.Set                       as Set+import qualified Data.Text                      as T import           Data.Traversable import           Language.Haskell.TH+import           Prelude   -- | Build a traversal of the root type (first argument) that updates@@ -53,14 +56,14 @@ -- | @traversalName x tn@ is the name of the function that traverses -- @x@ values inside @tn@ traversalName :: TypeName -> TypeName -> Name-traversalName x tn = mkName $ "traverse" ++ _TypeName x ++ _TypeName tn+traversalName x tn = mkNameText $ "traverse" <> _TypeName x <> _TypeName tn  -- | @traversalType x an@ is the type of the function that traverses -- @x@ values inside @an@ traversalType :: TypeName -> APINode -> TypeQ traversalType x an = [t| forall f . Applicative f => ($x' -> f $x') -> $ty -> f $ty |]   where-    x' = conT $ mkName $ _TypeName x+    x' = conT $ mkNameText $ _TypeName x     ty = nodeT an  @@ -77,7 +80,7 @@   | tn == x   = Just [e| id |]   | not (tn `Set.member` targets) = Nothing   | otherwise = case Map.lookup tn napi of-                           Nothing                -> error $ "missing API type declaration: " ++ _TypeName tn+                           Nothing                -> error $ "missing API type declaration: " ++ T.unpack (_TypeName tn)                            Just (NTypeSynonym ty) -> traverser' napi targets x ty                            Just (NRecordType  _)  -> Just $ varE $ traversalName x tn                            Just (NUnionType   _)  -> Just $ varE $ traversalName x tn
src/Data/API/Tutorial.hs view
@@ -6,12 +6,18 @@     -- * The api DSL     -- $api -    -- ** Generating types for an API+    -- * Generating types for an API     -- $generate +    -- ** Custom representation types+    -- $with+     -- * Generating tools for an API     -- $tools +    -- ** Custom API tools+    -- $custom-tools+     -- * Data migration     -- $migration @@ -29,6 +35,7 @@ import Data.API.JSON import Data.API.Parse import Data.API.Tools+import Data.API.Tools.Combinators import Data.API.Types  import Data.Text@@ -128,6 +135,38 @@  -} +{- $with++For some types, it may be desirable to use a different datatype in the+Haskell code, rather than relying on the generated datatype.  For+example, this allows collection types (such as sets) to be used in+place of lists, or allows additional invariants to be enforced.  The+JSON serialization agrees with the schema (so the difference is+invisible to non-Haskell clients).  This is possible using a @with@+clause in the schema DSL, which follows the type declaration and gives+the names of a pair of conversion functions, like this:++> i :: IDSet+>     = record+>         ids :: [ID]+>     with inj_IDSet, prj_IDSet++When a @with@ clause is used, the usual generated type (the+representation type) will be given a @REP__@ prefix, so in this case+'generate' will produce:++> data REP__IDSet = REP__IDSet { _i_ids :: [ID] }++The Haskell code accompanying the call to 'generate' should define a+type called @IDSet@, and functions+@inj_IDSet :: 'Monad' m => REP__IDSet -> m IDSet@ and+@prj_IDSet :: IDSet -> REP__IDSet@, which will be used when converting+to and from JSON.  The monadic type allows parsing to 'fail' if+the representation type uses a value that is not permitted, but+converting back must be a pure function.++-}+ {- $tools  Once the Haskell datatypes have been created by 'generate', additional@@ -159,6 +198,26 @@  will lead to errors about undefined symbols @_text_MyEnum@ and @_map_MyEnum@ in the generated code.++-}++{- $custom-tools++An 'APITool' is essentially just a function that consumes an 'API' and+produces some Template Haskell declarations.  More generally, a+@'Tool' a@ consumes a value of type @a@ and generates some+declarations.  The utilities in "Data.API.Tools.Combinators" make it+slightly more convenient to construct such things.  In particular, you+can use @'apiNodeTool' ('apiSpecTool' n r u e t)@ to build a tool that+consumes an 'API' out of tools that explain what to do for newtypes,+records, unions, enumerations and type synonyms respectively.++Typically, tools generate declarations or class instances based on+each different node in the API. These generated declarations work with+the datatypes generated by 'datatypesTool'.  The module+"Data.API.Tools.Datatypes" provides functions to turn 'APINode's and+their components into Template Haskell references to the generated+datatypes.  -} 
src/Data/API/Types.hs view
@@ -1,10 +1,9 @@+{-# LANGUAGE BangPatterns               #-} {-# LANGUAGE RecordWildCards            #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings          #-} {-# LANGUAGE TemplateHaskell            #-}-{-# OPTIONS_GHC -fno-warn-orphans       #-} - module Data.API.Types     ( API     , Thing(..)@@ -32,6 +31,7 @@     , mkRegEx     , inIntRange     , inUTCRange+    , base64ToBinary     ) where  import           Data.API.Utils@@ -43,7 +43,9 @@ import           Data.Aeson import           Data.Aeson.Types import           Data.Aeson.TH+import qualified Codec.Serialise     as CBOR import           Data.Maybe+import           Data.SafeCopy import qualified Data.Text                      as T import qualified Data.Text.Encoding             as T import qualified Data.ByteString.Char8          as B@@ -53,6 +55,7 @@ import           Language.Haskell.TH import           Language.Haskell.TH.Syntax import           Text.Regex+import           Prelude   -- | an API spec is made up of a list of type/element specs, each@@ -63,8 +66,12 @@ data Thing     = ThComment MDComment     | ThNode    APINode-    deriving (Show)+    deriving (Eq,Show) +instance NFData Thing where+  rnf (ThComment x) = rnf x+  rnf (ThNode    x) = rnf x+ -- | Specifies an individual element/type of the API  data APINode@@ -75,20 +82,21 @@         , anSpec    :: Spec             -- ^ the type specification         , anConvert :: Conversion       -- ^ optional conversion functions         }-    deriving (Show)+    deriving (Eq,Show) --- | TypeName must contain a valid Haskell type constructor+instance NFData APINode where+  rnf (APINode a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e -newtype TypeName = TypeName { _TypeName :: String }-    deriving (Eq, Ord,Show, IsString)+-- | TypeName must contain a valid Haskell type constructor+newtype TypeName = TypeName { _TypeName :: T.Text }+    deriving (Eq, Ord, Show, NFData, IsString)  -- | FieldName identifies recod fields and union alternatives --   must contain a valid identifier valid in Haskell and --   any API client wrappers (e.g., if Ruby wrappers are to be --   generated the names should easily map into Ruby)--newtype FieldName = FieldName { _FieldName :: String }-    deriving (Show,Eq,Ord,IsString)+newtype FieldName = FieldName { _FieldName :: T.Text }+    deriving (Eq, Ord, Show, NFData, IsString)  -- | Markdown comments are represented by strings @@ -112,8 +120,15 @@     | SpUnion   SpecUnion     | SpEnum    SpecEnum     | SpSynonym APIType-    deriving (Show)+    deriving (Eq,Show) +instance NFData Spec where+  rnf (SpNewtype x) = rnf x+  rnf (SpRecord  x) = rnf x+  rnf (SpUnion   x) = rnf x+  rnf (SpEnum    x) = rnf x+  rnf (SpSynonym x) = rnf x+ -- | SpecNewtype elements are isomorphisms of string, inetgers or booleans  data SpecNewtype =@@ -121,14 +136,22 @@         { snType   :: BasicType         , snFilter :: Maybe Filter         }-    deriving (Show)+    deriving (Eq,Show) +instance NFData SpecNewtype where+  rnf (SpecNewtype x y) = rnf x `seq` rnf y+ data Filter     = FtrStrg RegEx     | FtrIntg IntRange     | FtrUTC  UTCRange-    deriving (Show)+    deriving (Eq,Show) +instance NFData Filter where+  rnf (FtrStrg x) = rnf x+  rnf (FtrIntg x) = rnf x+  rnf (FtrUTC  x) = rnf x+ data IntRange     = IntRange         { ir_lo :: Maybe Int@@ -136,8 +159,8 @@         }     deriving (Eq, Show) -instance Lift IntRange where-    lift (IntRange lo hi) = [e| IntRange lo hi |]+instance NFData IntRange where+  rnf (IntRange x y) = rnf x `seq` rnf y  inIntRange :: Int -> IntRange -> Bool _ `inIntRange` IntRange Nothing   Nothing   = True@@ -152,15 +175,8 @@         }     deriving (Eq, Show) -instance Lift UTCRange where-    lift (UTCRange lo hi) = [e| UTCRange $(liftMaybeUTCTime lo) $(liftMaybeUTCTime hi) |]--liftUTC :: UTCTime -> ExpQ-liftUTC u = [e| fromMaybe (error "liftUTC") (parseUTC_ $(stringE (mkUTC_ u))) |]--liftMaybeUTCTime :: Maybe UTCTime -> ExpQ-liftMaybeUTCTime Nothing  = [e| Nothing |]-liftMaybeUTCTime (Just u) = [e| Just $(liftUTC u) |]+instance NFData UTCRange where+  rnf (UTCRange x y) = rnf x `seq` rnf y  inUTCRange :: UTCTime -> UTCRange -> Bool _ `inUTCRange` UTCRange Nothing   Nothing   = True@@ -178,6 +194,9 @@ mkRegEx :: T.Text -> RegEx mkRegEx txt = RegEx txt $ mkRegexWithOpts (T.unpack txt) False True +instance NFData RegEx where+  rnf (RegEx x !_) = rnf x+ instance ToJSON RegEx where     toJSON RegEx{..} = String re_text @@ -190,16 +209,16 @@ instance Show RegEx where     show = T.unpack . re_text -instance Lift RegEx where-    lift re = [e| mkRegEx $(stringE (T.unpack (re_text re))) |]- -- | SpecRecord is your classsic product type.  data SpecRecord = SpecRecord     { srFields :: [(FieldName, FieldType)]     }-    deriving (Show)+    deriving (Eq,Show) +instance NFData SpecRecord where+  rnf (SpecRecord x) = rnf x+ -- | In addition to the type and comment, record fields may carry a -- flag indicating that they are read-only, and may have a default -- value, which must be of a compatible type.@@ -210,24 +229,34 @@     , ftDefault  :: Maybe DefaultValue     , ftComment  :: MDComment     }-    deriving (Show)+    deriving (Eq,Show) +instance NFData FieldType where+  rnf (FieldType a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d+ -- | SpecUnion is your classsic union type  data SpecUnion = SpecUnion     { suFields :: [(FieldName,(APIType,MDComment))]     }-    deriving (Show)+    deriving (Eq,Show) +instance NFData SpecUnion where+  rnf (SpecUnion x) = rnf x+ -- | SpecEnum is your classic enumerated type  data SpecEnum = SpecEnum     { seAlts :: [(FieldName,MDComment)]     }-    deriving (Show)+    deriving (Eq,Show) --- Conversion possibly converts to an internal representation+instance NFData SpecEnum where+  rnf (SpecEnum x) = rnf x +-- | Conversion possibly converts to an internal representation.  If+-- specified, a conversion is a pair of an injection function name and+-- a projection function name. type Conversion = Maybe (FieldName,FieldName)  -- | Type is either a list, Maybe, a named element of the API or a basic type@@ -243,6 +272,13 @@ instance IsString APIType where   fromString = TyName . fromString +instance NFData APIType where+  rnf (TyList  ty) = rnf ty+  rnf (TyMaybe ty) = rnf ty+  rnf (TyName  tn) = rnf tn+  rnf (TyBasic bt) = rnf bt+  rnf TyJSON       = ()+ -- | the basic JSON types (N.B., no floating point numbers, yet) data BasicType     = BTstring -- ^ a JSON UTF-8 string@@ -252,6 +288,9 @@     | BTutc    -- ^ a JSON UTC string     deriving (Eq, Show) +instance NFData BasicType where+  rnf !_ = ()+ -- | A default value for a field data DefaultValue     = DefValList@@ -262,13 +301,13 @@     | DefValUtc    UTCTime     deriving (Eq, Show) -instance Lift DefaultValue where-  lift DefValList       = [e| DefValList     |]-  lift DefValMaybe      = [e| DefValMaybe    |]-  lift (DefValString s) = [e| DefValString (T.pack $(lift (T.unpack s))) |]-  lift (DefValBool   b) = [e| DefValBool b   |]-  lift (DefValInt    i) = [e| DefValInt i    |]-  lift (DefValUtc    u) = [e| DefValUtc $(liftUTC u) |]+instance NFData DefaultValue where+  rnf DefValList       = ()+  rnf DefValMaybe      = ()+  rnf (DefValString t) = rnf t+  rnf (DefValBool   b) = rnf b+  rnf (DefValInt    i) = rnf i+  rnf (DefValUtc    u) = rnf u  -- | Convert a default value to an Aeson 'Value'.  This differs from -- 'toJSON' as it will not round-trip with 'fromJSON': UTC default@@ -285,7 +324,7 @@ -- | Binary data is represented in JSON format as a base64-encoded -- string newtype Binary = Binary { _Binary :: B.ByteString }-    deriving (Show,Eq,Ord,NFData)+    deriving (Show,Eq,Ord,NFData,CBOR.Serialise)  instance ToJSON Binary where     toJSON = String . T.decodeLatin1 . B64.encode . _Binary@@ -303,11 +342,15 @@ withBinary lab f = withText lab g   where     g t =-        case B64.decode $ T.encodeUtf8 t of+        case base64ToBinary t of           Left  _  -> typeMismatch lab (String t)-          Right bs -> f $ Binary bs+          Right bs -> f bs +base64ToBinary :: T.Text -> Either String Binary+base64ToBinary t = Binary <$> B64.decode (T.encodeUtf8 t) +$(deriveSafeCopy 0 'base ''Binary)+ deriveJSON defaultOptions ''Thing deriveJSON defaultOptions ''APINode deriveJSON defaultOptions ''TypeName@@ -325,3 +368,85 @@ deriveJSON defaultOptions ''UTCRange deriveJSON defaultOptions ''BasicType deriveJSON defaultOptions ''CI.CI+++instance Lift Thing where+  lift (ThComment c) = [e| ThComment c |]+  lift (ThNode    n) = [e| ThNode    n |]++instance Lift APINode where+  lift (APINode a b c d e) = [e| APINode a b $(liftPrefix c) d e |]++liftPrefix :: Prefix -> ExpQ+liftPrefix ci = let s = CI.original ci in [e| CI.mk s |]++instance Lift TypeName where+  lift (TypeName s) = [e| TypeName $(litE (stringL (T.unpack s))) |]++instance Lift FieldName where+  lift (FieldName s) = [e| FieldName $(litE (stringL (T.unpack s))) |]++instance Lift Spec where+  lift (SpNewtype s) = [e| SpNewtype s |]+  lift (SpRecord  s) = [e| SpRecord  s |]+  lift (SpUnion   s) = [e| SpUnion   s |]+  lift (SpEnum    s) = [e| SpEnum    s |]+  lift (SpSynonym s) = [e| SpSynonym s |]++instance Lift SpecNewtype where+  lift (SpecNewtype a b) = [e| SpecNewtype a b |]++instance Lift Filter where+  lift (FtrStrg re) = [e| FtrStrg re |]+  lift (FtrIntg ir) = [e| FtrIntg ir |]+  lift (FtrUTC  ur) = [e| FtrUTC  ur |]++instance Lift IntRange where+    lift (IntRange lo hi) = [e| IntRange lo hi |]++instance Lift UTCRange where+    lift (UTCRange lo hi) = [e| UTCRange $(liftMaybeUTCTime lo) $(liftMaybeUTCTime hi) |]++liftUTC :: UTCTime -> ExpQ+liftUTC u = [e| fromMaybe (error "liftUTC") (parseUTC_ $(stringE (mkUTC_ u))) |]++liftMaybeUTCTime :: Maybe UTCTime -> ExpQ+liftMaybeUTCTime Nothing  = [e| Nothing |]+liftMaybeUTCTime (Just u) = [e| Just $(liftUTC u) |]++instance Lift RegEx where+    lift re = [e| mkRegEx $(stringE (T.unpack (re_text re))) |]++instance Lift SpecRecord where+  lift (SpecRecord s) = [e| SpecRecord s |]++instance Lift FieldType where+  lift (FieldType a b c d) = [e| FieldType a b c d |]++instance Lift SpecUnion where+  lift (SpecUnion s) = [e| SpecUnion s |]++instance Lift SpecEnum where+  lift (SpecEnum s) = [e| SpecEnum s |]++instance Lift APIType where+  lift (TyList  t) = [e| TyList  t |]+  lift (TyMaybe t) = [e| TyMaybe t |]+  lift (TyName  t) = [e| TyName  t |]+  lift (TyBasic t) = [e| TyBasic t |]+  lift TyJSON      = [e| TyJSON    |]++instance Lift BasicType where+  lift BTstring = [e| BTstring |]+  lift BTbinary = [e| BTbinary |]+  lift BTbool   = [e| BTbool   |]+  lift BTint    = [e| BTint    |]+  lift BTutc    = [e| BTutc    |]++instance Lift DefaultValue where+  lift DefValList       = [e| DefValList     |]+  lift DefValMaybe      = [e| DefValMaybe    |]+  lift (DefValString s) = [e| DefValString (T.pack $(lift (T.unpack s))) |]+  lift (DefValBool   b) = [e| DefValBool b   |]+  lift (DefValInt    i) = [e| DefValInt i    |]+  lift (DefValUtc    u) = [e| DefValUtc $(liftUTC u) |]
src/Data/API/Utils.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} module Data.API.Utils     ( mkUTC     , mkUTC'@@ -6,15 +7,26 @@     , parseUTC_     , (?!)     , (?!?)+      -- * Utils for merging and diffing maps+    , MergeResult(..)+    , mergeMaps+    , diffMaps+    , matchMaps     ) where  import           Data.Aeson+import           Data.Map ( Map )+import qualified Data.Map                       as Map import           Data.Maybe import qualified Data.Text                      as T import           Data.Time-import           System.Locale +#if MIN_VERSION_time(1,5,0)+#else+import           System.Locale (defaultTimeLocale)+#endif + mkUTC :: UTCTime -> Value mkUTC = String . mkUTC' @@ -53,3 +65,30 @@ (?!?) :: Either e a -> (e -> e') -> Either e' a Left  e ?!? f = Left  (f e) Right x ?!? _ = Right x+++-------------------------------------+-- Utils for merging and diffing maps+--++data MergeResult a b = OnlyInLeft a | InBoth a b | OnlyInRight b+  deriving (Eq, Show)++mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)+mergeMaps m1 m2 = Map.unionWith (\(OnlyInLeft a) (OnlyInRight b) -> InBoth a b)+                      (fmap OnlyInLeft m1) (fmap OnlyInRight m2)++diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)+diffMaps m1 m2 = Map.filter different $ mergeMaps m1 m2+  where+    different (InBoth a b) = a /= b+    different _            = True++-- | Attempts to match the keys of the maps to produce a map from keys+-- to pairs.+matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))+matchMaps m1 m2 = Map.traverseWithKey win $ mergeMaps m1 m2+  where+    win _ (InBoth x y)    = return (x, y)+    win k (OnlyInLeft x)  = Left (k, Left x)+    win k (OnlyInRight x) = Left (k, Right x)
+ src/Data/API/Value.hs view
@@ -0,0 +1,532 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}++-- | This module defines a generic representation of values belonging+-- to a schema, for use during data migration.+module Data.API.Value+    ( -- * Types+      Value(..)+    , Record+    , Field(..)++      -- * Converting to and from generic values+    , fromDefaultValue+    , fromJSON+    , parseJSON+    , encode+    , decode++      -- * Data validation+    , matchesNormAPI+    , expectRecord+    , expectEnum+    , expectUnion+    , expectList+    , expectMaybe+    , lookupType++      -- * Manipulating records+    , recordToMap+    , mapToRecord+    , insertField+    , renameField+    , deleteField+    , findField+    , joinRecords++      -- * QuickCheck test infrastructure+    , arbitrary+    , arbitraryOfType+    , arbitraryJSONValue+    , prop_jsonRoundTrip+    , prop_jsonGeneric+    , prop_cborRoundTrip+    , prop_cborGeneric+    ) where++import           Data.API.Error+import           Data.API.JSON+import           Data.API.NormalForm+import           Data.API.Types+import           Data.API.Utils++import           Control.Applicative+import           Control.Monad+import           Control.DeepSeq+import qualified Data.Aeson                     as JS+import qualified Codec.Serialise          as CBOR+import qualified Codec.Serialise.Decoding as CBOR+import qualified Codec.Serialise.Encoding as CBOR+import           Data.Binary.Serialise.CBOR.Extra+import qualified Codec.CBOR.FlatTerm as CBOR+import           Data.Binary.Serialise.CBOR.JSON+import qualified Data.HashMap.Strict            as HMap+import           Data.List (sortBy)+import qualified Data.Map.Strict                as Map+import           Data.Monoid+import           Data.Ord+import qualified Data.Set                       as Set+import qualified Data.Text                      as T+import           Data.Traversable+import           Data.Time (NominalDiffTime, UTCTime)+import           Data.Time.Clock.POSIX (posixSecondsToUTCTime)+import qualified Data.Vector                    as V+import qualified Test.QuickCheck                as QC+import qualified Test.QuickCheck.Property       as QCP+import           Prelude+++-- | Generic representation of a data value belonging to a schema+-- type.  This representation has the following properties:+--+--  * it is straightforward to convert into either CBOR or JSON;+--+--  * decoding CBOR or parsing JSON requires the schema, and takes+--    advantage of it by introducing type distinctions and interning+--    field names;+--+--  * decoding CBOR is relatively efficient.+data Value = String  !T.Text+           | UTCTime !UTCTime+           | Bytes   !Binary+           | Bool    !Bool+           | Int     !Int+           | List    ![Value]+           | Maybe   !(Maybe Value)+           | Union   !FieldName !Value+           | Enum    !FieldName+           | Record  !Record+           | JSON    !JS.Value+    deriving (Eq, Show)++-- | A record is represented as a list of (field name, value) pairs.+--+-- Invariant: these are in ascending order by field name, and there+-- are no duplicates.+--+-- TODO: consider if it would be worth using 'Map.Map' instead.+type Record = [Field]++data Field = Field { fieldName  :: FieldName+                   , fieldValue :: Value+                   }+    deriving (Eq, Show)++instance NFData Value where+  rnf (String t)   = rnf t+  rnf (UTCTime t)  = rnf t+  rnf (Bytes b)    = rnf b+  rnf (Bool b)     = rnf b+  rnf (Int i)      = rnf i+  rnf (List xs)    = rnf xs+  rnf (Maybe mb)   = rnf mb+  rnf (Union fn v) = rnf fn `seq` rnf v+  rnf (Enum fn)    = rnf fn+  rnf (Record xs)  = rnf xs+  rnf (JSON v)     = rnf v++instance NFData Field where+  rnf (Field x y) = rnf x `seq` rnf y+++-- | Convert a 'DefaultValue' into a generic 'Value', failing if the+-- type is not compatible.  This requires type information so that it+-- can introduce type distinctions absent in 'DefaultValue', e.g. when+-- 'DefValList' is used at type @'TyMaybe' ('TyList' t)@.+fromDefaultValue :: NormAPI -> APIType -> DefaultValue -> Maybe Value+fromDefaultValue api ty0 dv = case (ty0, dv) of+    (TyList  _, DefValList)    -> pure (List [])+    (TyMaybe _, DefValMaybe)   -> pure (Maybe Nothing)+    (TyMaybe ty, _)            -> Maybe . Just <$> fromDefaultValue api ty dv+    (TyBasic bt, _)            -> fromDefaultValueBasic bt dv+    (TyJSON,    _)             -> pure (JSON (defaultValueAsJsValue dv))+    (TyName tname, _)          -> do d <- Map.lookup tname api+                                     case d of+                                       NTypeSynonym ty -> fromDefaultValue api ty dv+                                       NNewtype bt     -> fromDefaultValueBasic bt dv+                                       NEnumType vals | DefValString s <- dv+                                                      , FieldName s `Set.member` vals+                                                      -> pure (Enum (FieldName s))+                                       _ -> Nothing+    _ -> Nothing++fromDefaultValueBasic :: BasicType -> DefaultValue -> Maybe Value+fromDefaultValueBasic bt dv = case (bt, dv) of+    (BTstring, DefValString s) -> Just (String s)+    (BTbinary, DefValString s) -> case base64ToBinary s of+                                    Right b -> Just (Bytes b)+                                    Left  _ -> Nothing+    (BTbool, DefValBool b)     -> Just (Bool b)+    (BTint, DefValInt i)       -> Just (Int i)+    (BTutc, DefValUtc u)       -> Just (UTCTime u)+    _                          -> Nothing++++instance JS.ToJSON Value where+  toJSON v0 = case v0 of+                String t       -> JS.String t+                UTCTime t      -> JS.String (mkUTC' t)+                Bytes b        -> JS.toJSON b+                Bool b         -> JS.Bool b+                Int i          -> JS.toJSON i+                List vs        -> JS.toJSON vs+                Maybe Nothing  -> JS.Null+                Maybe (Just v) -> JS.toJSON v+                Union fn v     -> JS.object [_FieldName fn JS..= v]+                Enum fn        -> JS.String (_FieldName fn)+                Record xs      -> JS.object $ map (\ (Field fn v) -> _FieldName fn JS..= v) xs+                JSON js        -> js++-- | Parse a generic 'Value' from a JSON 'JS.Value', given the schema+-- and expected type.  This is not particularly optimized.  For the+-- other direction, use 'JS.toJSON'.+fromJSON :: NormAPI -> APIType -> JS.Value -> Either [(JSONError, Position)] (Value, [(JSONWarning, Position)])+fromJSON api ty v = runParserWithErrsTop defaultParseFlags (parseJSON api ty v)++parseJSON :: NormAPI -> APIType -> JS.Value -> ParserWithErrs Value+parseJSON api ty0 v = case ty0 of+    TyName tn  -> parseJSONDecl api tn (lookupTyName api tn) v+    TyList ty  -> case v of+                    JS.Array arr -> List <$> traverse (parseJSON api ty) (V.toList arr)+                    _            -> failWith (expectedArray v)+    TyMaybe ty -> case v of+                    JS.Null -> pure (Maybe Nothing)+                    _       -> Maybe . Just <$> parseJSON api ty v+    TyJSON     -> pure (JSON v)+    TyBasic bt -> parseJSONBasic bt v++parseJSONBasic :: BasicType -> JS.Value -> ParserWithErrs Value+parseJSONBasic bt = case bt of+    BTstring -> withText   "String"  (pure . String)+    BTbinary -> withBinary "Bytes"   (pure . Bytes)+    BTbool   -> withBool   "Bool"    (pure . Bool)+    BTint    -> withInt    "Int"     (pure . Int)+    BTutc    -> withUTC    "UTCTime" (pure . UTCTime)++parseJSONDecl :: NormAPI -> TypeName -> NormTypeDecl -> JS.Value -> ParserWithErrs Value+parseJSONDecl api tn d = case d of+    NRecordType nrt -> \ v -> case v of+                                JS.Object hm -> Record <$> traverse (parseField hm) (Map.toList nrt)+                                _            -> failWith (expectedObject v)+    NUnionType  nut -> withUnion (map (\ (fn, ty) -> (_FieldName fn, fmap (Union fn) . parseJSON api ty)) (Map.toList nut))+    NEnumType   net -> withText (T.unpack (_TypeName tn)) $ \ k ->+                           case lookupSet (FieldName k) net of+                             Just fn -> pure (Enum fn)+                             Nothing -> failWith (UnexpectedEnumVal (map _FieldName (Set.toList net)) k)+    NTypeSynonym ty -> parseJSON api ty+    NNewtype     bt -> parseJSONBasic bt+  where+    parseField hm (fn, ty) = Field fn <$> withField (_FieldName fn) (parseJSON api ty) hm++++-- | Efficiently encode a generic 'Value' in CBOR format.+encode :: Value -> CBOR.Encoding+encode v0 = case v0 of+    String t   -> CBOR.encodeString t+    UTCTime t  -> CBOR.encode t+    Bytes b    -> CBOR.encode b+    Bool b     -> CBOR.encode b+    Int i      -> CBOR.encode i+    List vs    -> encodeListWith encode vs+    Maybe mb_v -> encodeMaybeWith encode mb_v+    Union fn v -> encodeUnion (_FieldName fn) (encode v)+    Enum fn    -> CBOR.encode (_FieldName fn)+    Record xs  -> CBOR.encodeMapLen (fromIntegral (length xs))+                  <> encodeRecordFields (map (\ (Field fn v) -> CBOR.encode (_FieldName fn)+                                                                    <> encode v) xs)+    JSON js    -> encodeJSON js+++-- | Efficiently decode CBOR as a generic 'Value', given the schema+-- and expected type.+decode :: NormAPI -> APIType -> CBOR.Decoder s Value+decode api ty0 = case ty0 of+    TyName tn  -> decodeDecl api (lookupTyName api tn)+    TyList ty  -> List  <$!> decodeListWith (decode api ty)+    TyMaybe ty -> Maybe <$!> decodeMaybeWith (decode api ty)+    TyJSON     -> JSON  <$!> decodeJSON+    TyBasic bt -> decodeBasic bt++decodeBasic :: BasicType -> CBOR.Decoder s Value+decodeBasic bt = case bt of+    BTstring -> String <$!> CBOR.decode+    BTbinary -> Bytes  <$!> CBOR.decode+    BTbool   -> Bool   <$!> CBOR.decode+    BTint    -> Int    <$!> CBOR.decode+    BTutc    -> UTCTime <$!> CBOR.decode++decodeDecl :: NormAPI -> NormTypeDecl -> CBOR.Decoder s Value+decodeDecl api d = case d of+    NRecordType nrt -> do _ <- CBOR.decodeMapLen+                          go [] (Map.toList nrt)+    NUnionType  nut -> do _ <- CBOR.decodeMapLen+                          k <- CBOR.decodeString+                          case lookupMap (FieldName k) nut of+                            Just (fn, ty) -> Union fn <$!> decode api ty+                            Nothing       -> fail $ "unexpected union alternative: " ++ T.unpack k+    NEnumType   net -> do k <- CBOR.decodeString+                          case lookupSet (FieldName k) net of+                            Just fn -> pure (Enum fn)+                            Nothing -> fail $ "unexpected enum alternative: " ++ T.unpack k+    NTypeSynonym ty -> decode api ty+    NNewtype     bt -> decodeBasic bt+  where+    go xs []            = pure (Record (reverse xs))+    go xs ((fn, ty):ys) = do _  <- CBOR.decodeString+                             !v <- decode api ty+                             go (Field fn v:xs) ys+++-- | Check that the value is of the given type in the schema,+-- reporting the first error encountered if it does not conform.+matchesNormAPI :: NormAPI -> APIType -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPI api ty0 v0 p = case ty0 of+    TyName tn  -> do d <- lookupType tn api ?!? (\ f -> (InvalidAPI f, p))+                     matchesNormAPIDecl api d v0 p+    TyList ty  -> case v0 of+                    List vs -> mapM_ (\ (i, v) -> matchesNormAPI api ty v (InElem i : p)) (zip [0..] vs)+                    _       -> Left (JSONError (expectedArray js_v), p)+    TyMaybe ty -> case v0 of+                    Maybe Nothing -> return ()+                    Maybe (Just v) -> matchesNormAPI api ty v p+                    _              -> Left (JSONError (Expected ExpObject "Maybe" js_v), p)+    TyJSON     -> case v0 of+                    JSON _ -> return ()+                    _      -> Left (JSONError (Expected ExpObject "JSON" js_v), p)+    TyBasic bt -> matchesNormAPIBasic bt v0 p+  where+    js_v = JS.toJSON v0++matchesNormAPIBasic :: BasicType -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPIBasic bt v p = case (bt, v) of+    (BTstring, String _) -> return ()+    (BTstring, _)        -> Left (JSONError (expectedString js_v), p)+    (BTbinary, Bytes _)  -> return ()+    (BTbinary, _)        -> Left (JSONError (expectedString js_v), p)+    (BTbool, Bool _)     -> return ()+    (BTbool, _)          -> Left (JSONError (expectedBool js_v), p)+    (BTint, Int _)       -> return ()+    (BTint, _)           -> Left (JSONError (expectedInt js_v), p)+    (BTutc, UTCTime _)   -> return ()+    (BTutc, _)           -> Left (JSONError (Expected ExpString "UTCTime" js_v), p)+  where+    js_v = JS.toJSON v++matchesNormAPIDecl :: NormAPI -> NormTypeDecl -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPIDecl api d v0 p = case d of+    NRecordType nrt -> do xs <- expectRecord v0 p+                          case compare (length xs) (Map.size nrt) of+                            LT -> Left (JSONError MissingField, p)+                            EQ -> mapM_ matchesNormAPIField (zip (Map.toList nrt) xs)+                            GT -> Left (JSONError UnexpectedField, p)+    NUnionType  nut -> do (fn, v) <- expectUnion v0 p+                          case Map.lookup fn nut of+                            Just ty -> matchesNormAPI api ty v (inField fn : p)+                            Nothing -> Left (JSONError UnexpectedField, inField fn : p)+    NEnumType   net -> do fn <- expectEnum v0 p+                          unless (Set.member fn net) $ Left (JSONError (UnexpectedEnumVal (map _FieldName (Set.toList net)) (_FieldName fn)), p)+    NTypeSynonym ty -> matchesNormAPI api ty v0 p+    NNewtype     bt -> matchesNormAPIBasic bt v0 p+  where+    matchesNormAPIField ((fn, ty), Field fn' v)+        | fn == fn' = matchesNormAPI api ty v (inField fn : p)+        | otherwise = Left (JSONError (SyntaxError (unlines ["record out of order: ", show fn, show fn', show d, show v0])), p)++expectRecord :: Value -> Position -> Either (ValueError, Position) Record+expectRecord (Record xs) _ = pure xs+expectRecord v           p = Left (JSONError (Expected ExpObject "Record" (JS.toJSON v)), p)++expectEnum :: Value -> Position -> Either (ValueError, Position) FieldName+expectEnum (Enum s) _ = pure s+expectEnum v        p = Left (JSONError (Expected ExpString "Enum" (JS.toJSON v)), p)++expectUnion :: Value -> Position -> Either (ValueError, Position) (FieldName, Value)+expectUnion (Union fname v) _ = pure (fname, v)+expectUnion v               p = Left (JSONError (Expected ExpObject "Union" (JS.toJSON v)), p)++expectList :: Value -> Position -> Either (ValueError, Position) [Value]+expectList (List xs) _ = pure xs+expectList v         p = Left (JSONError (Expected ExpArray "List" (JS.toJSON v)), p)++expectMaybe :: Value -> Position -> Either (ValueError, Position) (Maybe Value)+expectMaybe (Maybe v) _ = pure v+expectMaybe v         p = Left (JSONError (Expected ExpArray "Maybe" (JS.toJSON v)), p)++lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl+lookupType tname api = Map.lookup tname api ?! TypeDoesNotExist tname+++-- | Given a schema, generate an arbitrary type corresponding to the+-- schema and an arbitrary value of that type.+arbitrary :: NormAPI -> QC.Gen (APIType, Value)+arbitrary api = do tn <- QC.elements (Map.keys api)+                   v  <- arbitraryOfType api (TyName tn)+                   return (TyName tn, v)++-- | Given a schema and a type, generate an arbitrary value of that+-- type.+arbitraryOfType :: NormAPI -> APIType -> QC.Gen Value+arbitraryOfType api ty0 = case ty0 of+    TyName  tn -> arbitraryOfDecl api (lookupTyName api tn)+    TyList  ty -> List  <$> QC.listOf (arbitraryOfType api ty)+    TyMaybe ty -> Maybe <$> QC.oneof [pure Nothing, Just <$> arbitraryOfType api ty]+    TyJSON     -> JSON  <$> arbitraryJSONValue+    TyBasic bt -> arbitraryOfBasicType bt++arbitraryOfBasicType :: BasicType -> QC.Gen Value+arbitraryOfBasicType bt = case bt of+    BTstring -> String  <$> QC.arbitrary+    BTbinary -> Bytes   <$> QC.arbitrary+    BTbool   -> Bool    <$> QC.arbitrary+    BTint    -> Int     <$> QC.arbitrary+    BTutc    -> UTCTime+                . posixSecondsToUTCTime+                . (realToFrac :: Int -> NominalDiffTime)+                <$> QC.arbitrary++arbitraryOfDecl :: NormAPI -> NormTypeDecl -> QC.Gen Value+arbitraryOfDecl api d = case d of+    NRecordType nrt -> Record <$> traverse (\ (fn, ty) -> Field fn <$> arbitraryOfType api ty) (Map.toList nrt)+    NUnionType  nut -> do (fn, ty) <- QC.elements (Map.toList nut)+                          Union fn <$> arbitraryOfType api ty+    NEnumType   net -> Enum <$> QC.elements (Set.toList net)+    NTypeSynonym ty -> arbitraryOfType api ty+    NNewtype     bt -> arbitraryOfBasicType bt++-- | A reasonably varied generator for JSON 'JS.Value's.+--+-- Hack alert: we do not generate 'JS.Null', because Aeson fails to+-- round-trip @'Just' 'JS.Null' :: 'Maybe' 'JS.Value'@.+arbitraryJSONValue :: QC.Gen JS.Value+arbitraryJSONValue =+    QC.sized $ \ size ->+        QC.oneof [ JS.Object . HMap.fromList <$> QC.resize (size `div` 2) (QC.listOf ((,) <$> QC.arbitrary <*> arbitraryJSONValue))+                 , JS.Array . V.fromList <$> QC.resize (size `div` 2) (QC.listOf arbitraryJSONValue)+                 , JS.String <$> QC.arbitrary+                 , JS.Number . fromInteger <$> QC.arbitrary+                 , JS.Bool <$> QC.arbitrary+                 -- , pure JS.Null+                 ]++++-- | QuickCheck property that converting a 'Value' to and from JSON+-- gives back the original value.+prop_jsonRoundTrip :: NormAPI -> QC.Property+prop_jsonRoundTrip api+  = QC.forAll (arbitrary api) $ \ (ty, v) ->+        case fromJSON api ty (JS.toJSON v) of+          Right (y, ws) | v /= y        -> QCP.failed { QCP.reason = "Expected " ++ show v+                                                                       ++ " but got " ++ show y }+                        | not (null ws) -> QCP.failed { QCP.reason = "Unexpected warnings: " ++ show ws }+                        | otherwise     -> QCP.succeeded+          Left err                      -> QCP.failed { QCP.reason = "Parse error: " ++ prettyJSONErrorPositions err }++-- | QuickCheck property that the type-specific JSON serialisation+-- agrees with deserialising as generic JSON and then serialising again.+prop_jsonGeneric :: JS.ToJSON a => API -> TypeName -> a -> QCP.Result+prop_jsonGeneric api tn x = case fromJSON napi (TyName tn) js_v of+    Right (v, ws) | JS.toJSON v /= js_v -> QCP.failed { QCP.reason = "Expected " ++ show js_v+                                                                       ++ " but got " ++ show (JS.toJSON v) }+                  | not (null ws)       -> QCP.failed { QCP.reason = "Unexpected warnings: " ++ show ws }+                  | otherwise           -> QCP.succeeded+    Left err                            -> QCP.failed { QCP.reason = "Parse error: " ++ prettyJSONErrorPositions err }+  where+    napi = apiNormalForm api+    js_v = JS.toJSON x++-- | QuickCheck property that converting a 'Value' to and from CBOR+-- gives back the original value.+prop_cborRoundTrip :: NormAPI -> QC.Property+prop_cborRoundTrip api+  = QC.forAll (arbitrary api) $ \ (ty, v) ->+       case CBOR.fromFlatTerm (decode api ty) (CBOR.toFlatTerm (encode v)) of+         Right v' | v /= v'   -> QCP.failed { QCP.reason = "Expected " ++ show v+                                                             ++ " but got " ++ show v' }+                  | otherwise -> QCP.succeeded+         Left err             -> QCP.failed { QCP.reason = "Parse error: " ++ err }++-- | QuickCheck property that the type-specific CBOR serialisation+-- agrees with deserialising as generic CBOR and then serialising again.+prop_cborGeneric :: CBOR.Serialise a => API -> TypeName -> a -> QCP.Result+prop_cborGeneric api tn x+  | not (CBOR.validFlatTerm bs) = QCP.failed { QCP.reason = "Invalid CBOR: " ++ show bs }+  | otherwise = case CBOR.fromFlatTerm (decode napi (TyName tn)) bs of+    Right v | bs' <- CBOR.toFlatTerm (encode v)+            , bs' /= bs -> QCP.failed { QCP.reason = "Expected " ++ show bs ++ " but got " ++ show bs' }+            | otherwise      -> QCP.succeeded+    Left err                 -> QCP.failed { QCP.reason = "Decode error: " ++ err }+  where+    napi = apiNormalForm api+    bs = CBOR.toFlatTerm (CBOR.encode x)+++-- | Look up a type in a schema, failing with an error if it is missing.+lookupTyName :: NormAPI -> TypeName -> NormTypeDecl+lookupTyName api tn = case Map.lookup tn api of+                        Just d  -> d+                        Nothing -> error $ "lookupTyName: missing declaration for "+                                               ++ T.unpack (_TypeName tn)++-- | Look up a key in a set, returning a pointer to the set's copy of+-- the key.  This is useful during deserialisation because it means we+-- can share a single key, avoiding retaining deserialised copies.+lookupSet :: Ord a => a -> Set.Set a -> Maybe a+#if MIN_VERSION_containers(0,5,2)+lookupSet k s = flip Set.elemAt s <$> Set.lookupIndex k s+#else+-- alternative implementation for containers versions without lookupIndex/elemAt+lookupSet k s = case Set.lookupLE k s of+                  Just k' | k == k' -> Just k'+                  _                 -> Nothing+#endif++-- | Look up a key in a map, returning both the value and the map's+-- copy of the key.  This is useful during deserialisation because it+-- means we can share a single key, avoiding retaining deserialised+-- copies.+lookupMap :: Ord k => k -> Map.Map k a -> Maybe (k, a)+lookupMap k m = flip Map.elemAt m <$> Map.lookupIndex k m+++recordToMap :: Record -> Map.Map FieldName Value+recordToMap = Map.fromList . map (\ (Field fn v) -> (fn, v))++mapToRecord :: Map.Map FieldName Value -> Record+mapToRecord = map (uncurry Field) . Map.toList++-- | Insert a (field, value) pair into a record, replacing the+-- existing field if it is present and preserving the ordering+-- invariant.+insertField :: FieldName -> Value -> Record -> Record+insertField fname v []                      = [Field fname v]+insertField fname v xxs@(x@(Field fn _):xs) = case compare fname fn of+                                                GT -> x : insertField fname v xs+                                                EQ -> Field fname v : xs+                                                LT -> Field fname v : xxs++-- | Delete a field from a record, trivially preserving the ordering+-- invariant.+deleteField :: FieldName -> Record -> Record+deleteField fname = filter ((fname /=) . fieldName)++-- | Rename a field in a record, preserving the ordering invariant.+renameField :: FieldName -> FieldName -> Record -> Record+renameField fname fname' = sortBy (comparing fieldName) . map f+  where+    f x@(Field fn v) | fn == fname = Field fname' v+                     | otherwise   = x++-- | Split a record at a given field, returning the preceding fields,+-- value and succeeding fields.  Fails if the field is absent.+findField :: FieldName -> Record -> Maybe (Record, Value, Record)+findField fname xs = case break ((fname ==) . fieldName) xs of+                       (ys, (Field _ v):zs) -> Just (ys, v, zs)+                       (_, [])              -> Nothing++-- | Join together two records with a (field, value) pair in between.+-- The ordering invariant is not checked!+joinRecords :: Record -> FieldName -> Value -> Record -> Record+joinRecords ys fname v zs = ys ++ Field fname v : zs
+ src/Data/Binary/Serialise/CBOR/Extra.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+module Data.Binary.Serialise.CBOR.Extra+    ( encodeListWith+    , encodeMaybeWith+    , encodeRecordFields+    , encodeUnion+    , decodeUnion+    , decodeListWith+    , decodeMaybeWith+    , (<$!>)+    ) where++import           Codec.Serialise.Decoding+import           Codec.Serialise.Encoding+import           Data.List (foldl1')+import           Data.Monoid+import qualified Data.Text                      as T++#if MIN_VERSION_base(4,8,0)+import           Control.Monad ((<$!>))+#else+-- | Strict version of '<$>', which is available in base >= 4.8.0+(<$!>) :: Monad m => (a -> b) -> m a -> m b+{-# INLINE (<$!>) #-}+f <$!> m = do+  x <- m+  let z = f x+  z `seq` return z+infixl 4 <$!>+#endif++encodeListWith :: (a -> Encoding) -> [a] -> Encoding+encodeListWith _ [] = encodeListLen 0+encodeListWith f xs = encodeListLenIndef+                        <> foldr (\x r -> f x <> r) encodeBreak xs++encodeMaybeWith :: (a -> Encoding) -> Maybe a -> Encoding+encodeMaybeWith _ Nothing  = encodeListLen 0+encodeMaybeWith f (Just x) = encodeListLen 1 <> f x++-- We can assume the record has at least 1 field.+encodeRecordFields :: [Encoding] -> Encoding+encodeRecordFields l = foldl1' (<>) l++-- | Encode an element of a union as single-element map from a field+-- name to a value.+encodeUnion :: T.Text -> Encoding -> Encoding+encodeUnion t e = encodeMapLen 1 <> encodeString t <> e++decodeUnion :: [(T.Text, Decoder s a)] -> Decoder s a+decodeUnion ds = do+    _   <- decodeMapLen -- should always be 1+    dfn <- decodeString+    case lookup dfn ds of+      Nothing -> fail "Unexpected field in union in CBOR"+      Just d -> d++decodeListWith :: Decoder s a -> Decoder s [a]+decodeListWith dec = do+    mn <- decodeListLenOrIndef+    case mn of+      Nothing -> decodeSequenceLenIndef (flip (:)) [] reverse   dec+      Just n  -> decodeSequenceLenN     (flip (:)) [] reverse n dec++decodeMaybeWith :: Decoder s a -> Decoder s (Maybe a)+decodeMaybeWith dec = do+    n <- decodeListLen+    case n of+      0 -> return Nothing+      1 -> do !x <- dec+              return (Just x)+      _ -> fail "unknown tag"
+ src/Data/Binary/Serialise/CBOR/JSON.hs view
@@ -0,0 +1,184 @@+{-# LANGUAGE BangPatterns #-}+module Data.Binary.Serialise.CBOR.JSON (+    cborToJson,+    jsonToCbor,+    encodeJSON,+    decodeJSON,+  ) where++import qualified Data.Aeson          as JSON+import qualified Data.Scientific     as Scientific+import qualified Data.Vector         as Vec+import qualified Data.HashMap.Strict as HashMap++import           Data.Text (Text)+import qualified Data.Text                       as Text+import qualified Data.Text.Encoding              as Text+import qualified Data.Text.Lazy                  as Text.Lazy+import           Data.ByteString (ByteString)+import qualified Data.ByteString.Lazy            as LBS+import qualified Data.ByteString.Base64          as Base64+-- import qualified Data.ByteString.Base64.URL      as Base64url+import qualified Data.ByteString.Base16          as Base16++import Codec.Serialise.Decoding+import Codec.Serialise.Encoding+import Codec.CBOR.Term as CBOR+import Codec.Serialise++import Control.Applicative+import Prelude+++instance Serialise JSON.Value where+  encode = encodeJSON+  decode = decodeJSON++encodeJSON :: JSON.Value -> Encoding+encodeJSON = encode . jsonToCbor++decodeJSON :: Decoder s JSON.Value+decodeJSON = cborToJson <$> decode++-- Most of the types in CBOR have direct analogs in JSON.  However, some+-- do not, and someone implementing a CBOR-to-JSON converter has to+-- consider what to do in those cases.  The following non-normative+-- advice deals with these by converting them to a single substitute+-- value, such as a JSON null.++cborToJson :: CBOR.Term -> JSON.Value++-- o  An integer (major type 0 or 1) becomes a JSON number.++-- We modify this advice by only converting numbers in the range -2^53 .. 2^53+-- and otherwise handling them like big nums++cborToJson (CBOR.TInt n) = cborToJson (CBOR.TInteger (fromIntegral n))++-- o  A byte string (major type 2) that is not embedded in a tag that+--    specifies a proposed encoding is encoded in base64url without+--    padding and becomes a JSON string.++cborToJson (CBOR.TBytes  bs) = JSON.String (base64url bs)+cborToJson (CBOR.TBytesI bs) = JSON.String (base64url (LBS.toStrict bs))++-- o  A UTF-8 string (major type 3) becomes a JSON string.  Note that+--    JSON requires escaping certain characters (RFC 4627, Section 2.5):+--    quotation mark (U+0022), reverse solidus (U+005C), and the "C0+--    control characters" (U+0000 through U+001F).  All other characters+--    are copied unchanged into the JSON UTF-8 string.++cborToJson (CBOR.TString  s) = JSON.String s -- aeson will escape correctly+cborToJson (CBOR.TStringI s) = JSON.String (Text.Lazy.toStrict s)++-- o  An array (major type 4) becomes a JSON array.++cborToJson (TList  vs) = JSON.Array (Vec.fromList (map cborToJson vs))++-- o  A map (major type 5) becomes a JSON object.  This is possible+--    directly only if all keys are UTF-8 strings.  A converter might+--    also convert other keys into UTF-8 strings (such as by converting+--    integers into strings containing their decimal representation);+--    however, doing so introduces a danger of key collision.++cborToJson (TMap  kvs) = JSON.object [ (cborToJsonString k, cborToJson v)+                                     | (k, v) <- kvs ]++-- o  False (major type 7, additional information 20) becomes a JSON false.++-- o  True (major type 7, additional information 21) becomes a JSON true.+--+-- o  Null (major type 7, additional information 22) becomes a JSON null.++cborToJson (TBool b) = JSON.Bool b+cborToJson  TNull    = JSON.Null++-- o  A floating-point value (major type 7, additional information 25+--    through 27) becomes a JSON number if it is finite (that is, it can+--    be represented in a JSON number); if the value is non-finite (NaN,+--    or positive or negative Infinity), it is represented by the+--    substitute value.++cborToJson (THalf f)+  | isNaN f || isInfinite f = JSON.Null+  | otherwise               = JSON.Number (Scientific.fromFloatDigits f)+cborToJson (TFloat f)+  | isNaN f || isInfinite f = JSON.Null+  | otherwise               = JSON.Number (Scientific.fromFloatDigits f)+cborToJson (TDouble f)+  | isNaN f || isInfinite f = JSON.Null+  | otherwise               = JSON.Number (Scientific.fromFloatDigits f)++-- o  Any other simple value (major type 7, any additional information+--    value not yet discussed) is represented by the substitute value.++cborToJson (TSimple _) = JSON.Null++-- o  A bignum (major type 6, tag value 2 or 3) is represented by+--    encoding its byte string in base64url without padding and becomes+--    a JSON string.  For tag value 3 (negative bignum), a "~" (ASCII+--    tilde) is inserted before the base-encoded value.  (The conversion+--    to a binary blob instead of a number is to prevent a likely+--    numeric overflow for the JSON decoder.)++-- NOTE We ignore this advice and just use 'JSON.Number'.++cborToJson (TInteger n) = JSON.Number (fromInteger n)++-- o  A byte string with an encoding hint (major type 6, tag value 21+--    through 23) is encoded as described and becomes a JSON string.++cborToJson (TTagged 21 (CBOR.TBytes bs)) = JSON.String (base64url bs)+cborToJson (TTagged 22 (CBOR.TBytes bs)) = JSON.String (base64 bs)+cborToJson (TTagged 23 (CBOR.TBytes bs)) = JSON.String (base16 bs)++--   o  For all other tags (major type 6, any other tag value), the+--      embedded CBOR item is represented as a JSON value; the tag value+--      is ignored.++cborToJson (TTagged _tag term) = cborToJson term++-- o  Indefinite-length items are made definite before conversion.++cborToJson (TListI kvs) = cborToJson (TList kvs)+cborToJson (TMapI  kvs) = cborToJson (TMap kvs)+++-- used just for converting CBOR terms to JSON map keys+-- TODO: partial+cborToJsonString :: CBOR.Term -> Text.Text+cborToJsonString (TInt     n) = Text.pack (show n)+cborToJsonString (TInteger n) = Text.pack (show n)+cborToJsonString (TString  s) = s+cborToJsonString (TStringI s) = Text.Lazy.toStrict s++cborToJsonString (TBytes  bs) = base64url bs+cborToJsonString (TBytesI bs) = base64url (LBS.toStrict bs)++-- TODO not strictly following the spec - this uses padding, spec says+-- we shouldn't+-- TODO moreover, api-tools uses base64 rather than base64url!+base64url :: ByteString -> Text+base64url = base64 -- Text.decodeLatin1 . Base64url.encode++base64 :: ByteString -> Text+base64 = Text.decodeLatin1 . Base64.encode++base16 :: ByteString -> Text+base16 = Text.decodeLatin1 . Base16.encode+++jsonToCbor :: JSON.Value -> CBOR.Term+jsonToCbor (JSON.Object kvs) = CBOR.TMap [ (CBOR.TString k, jsonToCbor v)+                                         | (k, v) <- HashMap.toList kvs ]+jsonToCbor (JSON.Array  vs)  = CBOR.TList [ jsonToCbor v | v <- Vec.toList vs ]+jsonToCbor (JSON.String str) = CBOR.TString str+jsonToCbor (JSON.Number n)   = case Scientific.floatingOrInteger n of+                                 Left  d -> CBOR.TDouble d+                                 Right i+                                   | i >= fromIntegral (minBound :: Int) &&+                                     i <= fromIntegral (maxBound :: Int)+                                               -> CBOR.TInt (fromIntegral i)+                                   | otherwise -> CBOR.TInteger i+jsonToCbor (JSON.Bool   b)   = CBOR.TBool b+jsonToCbor  JSON.Null        = CBOR.TNull
tests/Data/API/Test/DSL.hs view
@@ -52,8 +52,12 @@     // A simple test example     = record         x :: integer-        y :: Foo+        y :: Faa +faa :: Faa+    = record+        f :: Flag+ c :: Coord     // A simple test example     = record@@ -86,7 +90,7 @@ uv :: MyUTC     = utc -urec :: URec+urec :: URecord     = record         foo :: utc @@ -99,4 +103,25 @@  fu :: FilteredUTC     = basic utc | >= 2014-10-13T15:20:11Z++bb :: BasicBinary+    = basic binary++j :: JSON+    = json++nr :: NewRec+    = record+        bb :: BasicBinary+        j  :: JSON+        k  :: ? MaybeThing++mt :: MaybeThing+    = record+        thing :: ? JSON++nu :: NewUnion+    = union+      | bb :: BasicBinary+      | j  :: JSON |]
tests/Data/API/Test/Gen.hs view
@@ -1,32 +1,49 @@+{-# LANGUAGE DeriveGeneric              #-} {-# LANGUAGE TemplateHaskell            #-} {-# LANGUAGE OverloadedStrings          #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DeriveDataTypeable         #-}+{-# OPTIONS_GHC -fno-warn-orphans       #-}  module Data.API.Test.Gen where -import           Data.API.JSON import           Data.API.Test.DSL hiding (example) import qualified Data.API.Test.DSL as DSL import           Data.API.Tools+import           Data.API.Tools.Datatypes import           Data.API.Tools.Example+import           Data.API.Value ( arbitraryJSONValue )+ import           Control.Applicative+import qualified Data.Aeson                     as JS+import           Data.SafeCopy+import           GHC.Generics import           Language.Haskell.TH import           Test.QuickCheck                ( Arbitrary(..) )+import           Prelude + $(generate         DSL.example) $(generateAPITools DSL.example                    [ enumTool                    , jsonTool'+                   , cborTool                    , quickCheckTool                    , lensTool                    , safeCopyTool                    , exampleTool+                   , deepSeqTool                    , samplesTool   (mkName "exampleSamples")-                   , jsonTestsTool (mkName "exampleSimpleTests")+                   , jsonTestsTool (mkName "exampleTestsJSON")+                   , cborTestsTool (mkName "exampleTestsCBOR")+                   , cborToJSONTestsTool 'DSL.example (mkName "exampleTestsCBORToJSON")+                   , jsonToCBORTestsTool 'DSL.example (mkName "exampleTestsJSONToCBOR")+                   , jsonGenericValueTestsTool 'DSL.example (mkName "exampleJSONGenericValueTests")+                   , cborGenericValueTestsTool 'DSL.example (mkName "exampleCBORGenericValueTests")                    ]) -$(generateWith (defaultToolSettings { newtypeSmartConstructors = True }) example2)+$(generateAPIToolsWith (defaultToolSettings { newtypeSmartConstructors = True }) example2+                       [ datatypesTool' ((''Generic :) . defaultDerivedClasses) ])  data Coord = Coord Int Int     deriving (Eq,Show)@@ -36,13 +53,12 @@  instance Example Coord -inj_coord :: REP__Coord -> ParserWithErrs Coord+inj_coord :: Applicative p => REP__Coord -> p Coord inj_coord (REP__Coord x y) = pure $ Coord x y -prj_coord :: Coord -> REP__Coord +prj_coord :: Coord -> REP__Coord prj_coord (Coord x y) = REP__Coord x y - newtype Ssn = Ssn { _Ssn :: Integer }     deriving(Eq,Show) @@ -51,7 +67,7 @@  instance Example Ssn -inj_ssn :: REP__Ssn -> ParserWithErrs Ssn+inj_ssn :: Monad m => REP__Ssn -> m Ssn inj_ssn = return . Ssn . fromIntegral . _REP__Ssn  prj_ssn :: Ssn -> REP__Ssn@@ -66,9 +82,9 @@  instance Example CHOICE -inj_chc :: REP__CHOICE -> ParserWithErrs CHOICE+inj_chc :: Monad m => REP__CHOICE -> m CHOICE inj_chc (CHC_a i) = return $ CHOICE i-inj_chc (CHC_b _) = empty+inj_chc (CHC_b _) = fail "no choice"  prj_chc :: CHOICE -> REP__CHOICE prj_chc (CHOICE i) = CHC_a i@@ -81,7 +97,7 @@  instance Example ENUM -inj_enum :: REP__ENUM -> ParserWithErrs ENUM+inj_enum :: Monad m => REP__ENUM -> m ENUM inj_enum ENM_e1 = return $ ENUM False inj_enum ENM_e2 = return $ ENUM True @@ -95,13 +111,31 @@  instance Example FilteredString ++-- | These instances are required by the generated code, but we don't+-- really want to force them on clients of the library, so just define+-- orphans here.+instance Arbitrary JS.Value where+    arbitrary = arbitraryJSONValue++instance SafeCopy JS.Value where+  getCopy = error "Not implemented"+  putCopy = error "Not implemented"+ $(generateAPIToolsWith (defaultToolSettings { newtypeSmartConstructors = True }) example2                    [ enumTool                    , jsonTool'+                   , cborTool                    , quickCheckTool                    , lensTool                    , safeCopyTool                    , exampleTool+                   , deepSeqTool                    , samplesTool   (mkName "example2Samples")-                   , jsonTestsTool (mkName "example2SimpleTests")+                   , jsonTestsTool (mkName "example2TestsJSON")+                   , cborTestsTool (mkName "example2TestsCBOR")+                   , cborToJSONTestsTool 'example2 (mkName "example2TestsCBORToJSON")+                   , jsonToCBORTestsTool 'example2 (mkName "example2TestsJSONToCBOR")+                   , jsonGenericValueTestsTool 'example2 (mkName "example2JSONGenericValueTests")+                   , cborGenericValueTestsTool 'example2 (mkName "example2CBORGenericValueTests")                    ])
tests/Data/API/Test/JSON.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP                        #-} {-# LANGUAGE OverloadedStrings          #-} {-# LANGUAGE TemplateHaskell            #-} {-# LANGUAGE DeriveDataTypeable         #-}@@ -6,14 +7,17 @@     ( jsonTests     ) where -import           Data.API.API.Gen ( apiAPISimpleTests )+import           Data.API.API.Gen ( apiAPITestsJSON, apiAPITestsCBOR, apiAPITestsCBORToJSON, apiAPITestsJSONToCBOR ) import           Data.API.JSON+import           Data.API.NormalForm import           Data.API.Tools import           Data.API.Tools.JSONTests+import           Data.API.Test.DSL import           Data.API.Test.Gen hiding ( Foo ) import           Data.API.Test.MigrationData import           Data.API.Types import           Data.API.Utils+import qualified Data.API.Value           as Value  import qualified Data.Aeson               as JS import qualified Data.HashMap.Strict      as HMap@@ -39,6 +43,8 @@                                , help (JS.String "0")   (0 :: Int)  True                                , help (JS.String "-9")  (-9 :: Int) True                                , help (JS.String "1a")  (1 :: Int)  False+                               , help (JS.Number 1.1)   (1 :: Int)  True+                               , help (JS.Number 1.9)   (1 :: Int)  True                                , help (JS.Number 0)     False       True                                , help (JS.Number 1)     True        True                                , help (JS.Number 2)     True        False@@ -62,7 +68,11 @@ -- | Test that the correct errors are generated for bad JSON data errorDecoding :: [TestTree] errorDecoding = [ help "not enough input" ""         (proxy :: Int)+#if MIN_VERSION_aeson(0,10,0)+                      [(SyntaxError "Error in $: not enough input", [])]+#else                       [(SyntaxError "not enough input", [])]+#endif                 , help "object for int"   "{}"       (proxy :: Int)                       [(Expected ExpInt "Int" (JS.Object HMap.empty), [])]                 , help "missing alt"      "{}"       (proxy :: AUnion)@@ -113,8 +123,34 @@   , testGroup "Decoding invalid data" errorDecoding   , testGroup "Smart constructors"    smartConstructors   , testGroup "Round-trip tests"-      [ testGroup "example"  $ map (uncurry QC.testProperty) exampleSimpleTests-      , testGroup "example2" $ map (uncurry QC.testProperty) example2SimpleTests-      , testGroup "api"      $ map (uncurry QC.testProperty) apiAPISimpleTests+      [ testGroup "example JSON"   $ map (uncurry QC.testProperty) exampleTestsJSON+      , testGroup "example CBOR"   $ map (uncurry QC.testProperty) exampleTestsCBOR+      , testGroup "example CBOR to JSON" $ map (uncurry QC.testProperty) exampleTestsCBORToJSON+      , testGroup "example JSON to CBOR" $ map (uncurry QC.testProperty) exampleTestsJSONToCBOR+      , testGroup "example2 JSON"  $ map (uncurry QC.testProperty) example2TestsCBOR+      , testGroup "example2 CBOR"  $ map (uncurry QC.testProperty) example2TestsCBOR+      , testGroup "example2 CBOR to JSON" $ map (uncurry QC.testProperty) example2TestsCBORToJSON+      , testGroup "example2 JSON to CBOR" $ map (uncurry QC.testProperty) example2TestsJSONToCBOR+      , testGroup "api JSON"       $ map (uncurry QC.testProperty) apiAPITestsJSON+      , testGroup "api CBOR"       $ map (uncurry QC.testProperty) apiAPITestsCBOR+      , testGroup "api CBOR to JSON" $ map (uncurry QC.testProperty) apiAPITestsCBORToJSON+      , testGroup "api JSON to CBOR" $ map (uncurry QC.testProperty) apiAPITestsJSONToCBOR+      , QC.testProperty "Aeson Value to CBOR" (prop_cborRoundtrip :: JS.Value -> Bool)       ]+  , testGroup "Generic values"+    [ QC.testProperty "example JSON round-trip" (Value.prop_jsonRoundTrip exampleNF)+    , QC.testProperty "example2 JSON round-trip" (Value.prop_jsonRoundTrip example2NF)+    , QC.testProperty "example CBOR round-trip" (Value.prop_cborRoundTrip exampleNF)+    , QC.testProperty "example2 CBOR round-trip" (Value.prop_cborRoundTrip example2NF)+    , testGroup "example agreement with ToJSON" $ map (uncurry QC.testProperty) exampleJSONGenericValueTests+    , testGroup "example2 agreement with ToJSON" $ map (uncurry QC.testProperty) example2JSONGenericValueTests+    , testGroup "example agreement with Serialise" $ map (uncurry QC.testProperty) exampleCBORGenericValueTests+    , testGroup "example2 agreement with Serialise" $ map (uncurry QC.testProperty) example2CBORGenericValueTests+    ]   ]++exampleNF :: NormAPI+exampleNF = apiNormalForm example++example2NF :: NormAPI+example2NF = apiNormalForm example2
tests/Data/API/Test/Main.hs view
@@ -2,10 +2,13 @@     ( main     ) where +import           Data.API.API+import           Data.API.API.Gen import           Data.API.Test.JSON import           Data.API.Test.Migration  import           Test.Tasty+import           Test.Tasty.QuickCheck  main :: IO () main = defaultMain tests@@ -13,4 +16,14 @@ tests :: TestTree tests = testGroup "api-tools" [ migrationTests                               , jsonTests+                              , testProperty "Convert/unconvert" convertUncovertTest                               ]++-- | Test that converting an 'API' into a self-hosted 'APISpec' and+-- back does not change it.  We have 'Arbitrary' instances only for+-- 'APISpec', but we compare 'API' because it is slightly more precise+-- (e.g. 'APISpec' contains bogus read-only fields for unions).+convertUncovertTest :: APISpec -> Bool+convertUncovertTest api = unconvertAPI (convertAPI unconverted_api) == unconverted_api+  where+    unconverted_api = unconvertAPI api
tests/Data/API/Test/Migration.hs view
@@ -14,15 +14,19 @@ import           Data.API.Test.MigrationData import           Data.API.Types import           Data.API.Utils+import qualified Data.API.Value           as Value  import qualified Data.Aeson               as JS import qualified Data.Aeson.Encode.Pretty as JS+import qualified Codec.Serialise as CBOR+import qualified Codec.CBOR.FlatTerm as CBOR import qualified Data.ByteString.Char8    as B import qualified Data.ByteString.Base64   as B64 import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.HashMap.Strict      as HMap import qualified Data.Map                 as Map import qualified Data.Text                as T+import qualified Data.Text.Encoding       as TE import           Data.Version import           Test.Tasty               as Test import           Test.Tasty.HUnit@@ -42,6 +46,16 @@     recur <- HMap.lookup "recur" x ?! CustomMigrationError "missing recur" (JS.Object x)     return $ HMap.insert "recur2" recur x +testDatabaseMigration' :: TestDatabaseMigration -> Value.Record -> Either ValueError Value.Record+testDatabaseMigration' DuplicateBar r = do+    let x = Value.recordToMap r+    bar <- Map.lookup "bar" x ?! CustomMigrationError "missing bar" JS.Null+    return $ Value.mapToRecord $ Map.insert "bar2" bar x+testDatabaseMigration' DuplicateRecursive r = do+    let x = Value.recordToMap r+    recur <- Map.lookup "recur" x ?! CustomMigrationError "missing recur" JS.Null+    return $ Value.mapToRecord $ Map.insert "recur2" recur x+ testDatabaseMigrationSchema :: TestDatabaseMigration -> NormAPI -> Either ApplyFailure (Maybe NormAPI) testDatabaseMigrationSchema DuplicateBar _ = Right Nothing testDatabaseMigrationSchema DuplicateRecursive napi =@@ -67,6 +81,21 @@     new <- HMap.lookup "new" x ?! CustomMigrationError "missing new" (JS.Object x)     return $ HMap.insert "newnew" new x +testRecordMigration' :: TestRecordMigration -> Value.Value -> Either ValueError Value.Value+testRecordMigration' CopyIDtoC = mkRecordMigration' $ \ rec -> do+    let x = Value.recordToMap rec+    i <- Map.lookup "id" x ?! CustomMigrationError "missing id" JS.Null+    b <- Map.lookup "c" x  ?! CustomMigrationError "missing b" JS.Null+    r <- case (i, b) of+        (Value.Int j, Value.String t)+            -> return $ Value.String $ t `T.append` T.pack (show j)+        _   -> Left $ CustomMigrationError "bad data" JS.Null+    return $ Value.mapToRecord $ Map.insert "c" r x+testRecordMigration' DuplicateNew = mkRecordMigration' $ \ rec -> do+    let x = Value.recordToMap rec+    new <- Map.lookup "new" x ?! CustomMigrationError "missing new" JS.Null+    return $ Value.mapToRecord $ Map.insert "newnew" new x+ testRecordMigrationSchema :: TestRecordMigration -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl) testRecordMigrationSchema CopyIDtoC    = noSchemaChanges testRecordMigrationSchema DuplicateNew = mkRecordMigrationSchema "Recursive" $ \ r ->@@ -81,15 +110,26 @@         Right x -> return (JS.String (T.pack (B.unpack x))) testFieldMigration ConvertBinaryToString v = Left $ CustomMigrationError "bad data" v +testFieldMigration' :: TestFieldMigration -> Value.Value -> Either ValueError Value.Value+testFieldMigration' ConvertBinaryToString (Value.Bytes bs) = return (Value.String (TE.decodeUtf8 (_Binary bs)))+testFieldMigration' ConvertBinaryToString v = Left $ CustomMigrationError "bad data" (JS.toJSON v) -testMigration :: CustomMigrations TestDatabaseMigration TestRecordMigration TestFieldMigration++testMigration :: CustomMigrations JS.Object JS.Value TestDatabaseMigration TestRecordMigration TestFieldMigration testMigration = CustomMigrations testDatabaseMigration                                  testDatabaseMigrationSchema                                  testRecordMigration                                  testRecordMigrationSchema                                  testFieldMigration +testMigration' :: CustomMigrations Value.Record Value.Value TestDatabaseMigration TestRecordMigration TestFieldMigration+testMigration' = CustomMigrations testDatabaseMigration'+                                  testDatabaseMigrationSchema+                                  testRecordMigration'+                                  testRecordMigrationSchema+                                  testFieldMigration' + assertMatchesAPI :: String -> API -> JS.Value -> Assertion assertMatchesAPI x a v = case dataMatchesAPI root_ a v of     Right () -> return ()@@ -135,6 +175,7 @@ $(generateAPITools startSchema                    [ enumTool                    , jsonTool'+                   , cborTool                    , quickCheckTool                    ]) @@ -151,11 +192,29 @@   where     failedBecause e = failed { reason = e } +validMigrationProperty' :: DatabaseSnapshot -> P.Result+validMigrationProperty' db =+    case migrateDataDump' (startSchema, startVersion) (endSchema, DevVersion)+                         changelog testMigration' root_ CheckStartAndEnd db_generic of+    Right (v, []) -> case dataMatchesAPI root_ endSchema (JS.toJSON v) of+        Right _   -> succeeded+        Left  err -> failedBecause ("end data does not match API: "+                                    ++ prettyValueErrorPosition err)+    Right (_, ws) -> failedBecause ("migration generated warnings: " ++ show ws)+    Left err      -> failedBecause ("migration failed: " ++ prettyMigrateFailure err)+  where+    failedBecause e = failed { reason = e } +    db_generic = case CBOR.fromFlatTerm (Value.decode (apiNormalForm startSchema) (TyName root_))+                                        (CBOR.toFlatTerm (CBOR.encode db)) of+                   Right v  -> v+                   Left err -> error err+ migrationTests :: TestTree migrationTests = testGroup "Migration"   [ testCase     "Basic migration using sample changelog" basicMigrationTest   , testGroup    "Invalid changes"    $ map applyFailureTest   expectedApplyFailures   , testGroup    "Invalid migrations" $ map migrateFailureTest expectedMigrateFailures-  , QC.testProperty "Valid migrations" validMigrationProperty+  , QC.testProperty "Valid migrations (JSON)" validMigrationProperty+  , QC.testProperty "Valid migrations (generic)" validMigrationProperty'   ]