From 1929dbed571c4fd1c59bc0393d54f4e8e560693d Mon Sep 17 00:00:00 2001 From: Klaus Thoden Date: Tue, 21 Jun 2016 18:16:51 +0200 Subject: [PATCH] Big reorganisation of files --- Skripten/eoaconvert.cfg | 17 + TeX/publication.cfg | 40 + Templates/DejaVuSerif-BoldItalic.ttf | Bin 0 -> 293332 bytes Templates/DejaVuSerif-Italic.ttf | Bin 0 -> 300912 bytes Templates/DejaVuSerif-bold.ttf | Bin 0 -> 305644 bytes Templates/DejaVuSerif.ttf | Bin 0 -> 328028 bytes Templates/eoa-epub.css | 35 + thirdparty/epubcheck/.classpath | 8 + .../.externalToolBuilders/Jar Builder.launch | 21 + thirdparty/epubcheck/.project | 27 + .../.settings/org.eclipse.jdt.core.prefs | 12 + .../.settings/org.eclipse.jdt.ui.prefs | 5 + thirdparty/epubcheck/COPYING.txt | 19 + thirdparty/epubcheck/Issue28.epub | Bin 0 -> 62729 bytes thirdparty/epubcheck/README.txt | 61 + ...iopensource.datatype.xsd.regex.RegexEngine | 3 + ...haiopensource.validate.SchemaReaderFactory | 4 + ...source.validate.auto.SchemaReceiverFactory | 4 + ...g.iso_relax.verifier.VerifierFactoryLoader | 1 + ...rg.relaxng.datatype.DatatypeLibraryFactory | 1 + .../epubcheck/api/EpubCheck$ProxyReport.class | Bin 0 -> 1131 bytes .../com/adobe/epubcheck/api/EpubCheck.class | Bin 0 -> 3719 bytes .../bin/com/adobe/epubcheck/api/Report.class | Bin 0 -> 194 bytes .../adobe/epubcheck/autotest/AutoTest.class | Bin 0 -> 2063 bytes .../autotest/AutoTestContentHandler.class | Bin 0 -> 5408 bytes .../com/adobe/epubcheck/autotest/Result.class | Bin 0 -> 932 bytes .../epubcheck/bitmap/BitmapChecker.class | Bin 0 -> 2367 bytes .../bitmap/BitmapCheckerFactory.class | Bin 0 -> 1263 bytes .../epubcheck/dtbook/DTBookChecker.class | Bin 0 -> 2320 bytes .../dtbook/DTBookCheckerFactory.class | Bin 0 -> 1282 bytes .../epubcheck/dtbook/DTBookHandler.class | Bin 0 -> 2960 bytes .../com/adobe/epubcheck/dtd/dtbook-2005-2.dtd | 2824 ++++++++ .../com/adobe/epubcheck/dtd/ncx-2005-1.dtd | 269 + .../bin/com/adobe/epubcheck/dtd/oeb12.dtdinc | 1136 ++++ .../bin/com/adobe/epubcheck/dtd/opf20.dtd | 296 + .../bin/com/adobe/epubcheck/dtd/svg11.dtd | 5790 +++++++++++++++++ .../com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc | 196 + .../adobe/epubcheck/dtd/xhtml-special.dtdinc | 80 + .../adobe/epubcheck/dtd/xhtml-symbol.dtdinc | 237 + .../com/adobe/epubcheck/dtd/xhtml1-strict.dtd | 979 +++ .../epubcheck/dtd/xhtml1-transitional.dtd | 1200 ++++ .../com/adobe/epubcheck/ncx/NCXChecker.class | Bin 0 -> 2603 bytes .../epubcheck/ncx/NCXCheckerFactory.class | Bin 0 -> 1255 bytes .../com/adobe/epubcheck/ncx/NCXHandler.class | Bin 0 -> 2141 bytes .../epubcheck/ocf/EncryptionFilter.class | Bin 0 -> 229 bytes .../epubcheck/ocf/EncryptionHandler.class | Bin 0 -> 2914 bytes .../ocf/IDPFFontManglingFilter.class | Bin 0 -> 855 bytes .../com/adobe/epubcheck/ocf/OCFChecker.class | Bin 0 -> 3542 bytes .../com/adobe/epubcheck/ocf/OCFHandler.class | Bin 0 -> 1803 bytes .../com/adobe/epubcheck/ocf/OCFPackage.class | Bin 0 -> 2075 bytes .../ocf/UnsupportedEncryptionFilter.class | Bin 0 -> 633 bytes .../adobe/epubcheck/opf/ContentChecker.class | Bin 0 -> 159 bytes .../epubcheck/opf/ContentCheckerFactory.class | Bin 0 -> 355 bytes .../epubcheck/opf/GenericContentChecker.class | Bin 0 -> 1324 bytes .../opf/GenericContentCheckerFactory.class | Bin 0 -> 1271 bytes .../com/adobe/epubcheck/opf/OPFChecker.class | Bin 0 -> 8864 bytes .../com/adobe/epubcheck/opf/OPFHandler.class | Bin 0 -> 11397 bytes .../bin/com/adobe/epubcheck/opf/OPFItem.class | Bin 0 -> 1713 bytes .../epubcheck/opf/XRefChecker$Anchor.class | Bin 0 -> 720 bytes .../epubcheck/opf/XRefChecker$Reference.class | Bin 0 -> 902 bytes .../epubcheck/opf/XRefChecker$Resource.class | Bin 0 -> 979 bytes .../com/adobe/epubcheck/opf/XRefChecker.class | Bin 0 -> 6439 bytes .../com/adobe/epubcheck/ops/OPSChecker.class | Bin 0 -> 2530 bytes .../epubcheck/ops/OPSCheckerFactory.class | Bin 0 -> 1275 bytes .../com/adobe/epubcheck/ops/OPSHandler.class | Bin 0 -> 6817 bytes .../adobe/epubcheck/ops/registeredSchemas.txt | 74 + .../bin/com/adobe/epubcheck/rng/container.rng | 24 + .../com/adobe/epubcheck/rng/content-svg.rng | 13 + .../com/adobe/epubcheck/rng/content-xhtml.rng | 13 + .../bin/com/adobe/epubcheck/rng/content.rng | 89 + .../com/adobe/epubcheck/rng/dtbook-2005-2.rng | 4110 ++++++++++++ .../com/adobe/epubcheck/rng/encryption.rng | 20 + .../bin/com/adobe/epubcheck/rng/ncx-old.rng | 253 + .../bin/com/adobe/epubcheck/rng/ncx.rng | 295 + .../bin/com/adobe/epubcheck/rng/opf.rng | 15 + .../bin/com/adobe/epubcheck/rng/opf12.rng | 386 ++ .../bin/com/adobe/epubcheck/rng/opf20.rng | 499 ++ .../adobe/epubcheck/rng/ops/ops-switch.rng | 51 + .../bin/com/adobe/epubcheck/rng/ops20.nrl | 70 + .../bin/com/adobe/epubcheck/rng/ops20.rng | 16 + .../com/adobe/epubcheck/rng/signatures.rng | 15 + .../adobe/epubcheck/rng/svg/svg-animation.rng | 412 ++ .../rng/svg/svg-animevents-attrib.rng | 61 + .../epubcheck/rng/svg/svg-basic-clip.rng | 129 + .../epubcheck/rng/svg/svg-basic-filter.rng | 870 +++ .../epubcheck/rng/svg/svg-basic-font.rng | 544 ++ .../rng/svg/svg-basic-graphics-attrib.rng | 74 + .../epubcheck/rng/svg/svg-basic-structure.rng | 666 ++ .../epubcheck/rng/svg/svg-basic-text.rng | 273 + .../com/adobe/epubcheck/rng/svg/svg-clip.rng | 37 + .../epubcheck/rng/svg/svg-conditional.rng | 124 + .../rng/svg/svg-container-attrib.rng | 49 + .../epubcheck/rng/svg/svg-core-attrib.rng | 73 + .../adobe/epubcheck/rng/svg/svg-cursor.rng | 99 + .../adobe/epubcheck/rng/svg/svg-datatypes.rng | 188 + .../rng/svg/svg-docevents-attrib.rng | 87 + .../epubcheck/rng/svg/svg-extensibility.rng | 125 + .../rng/svg/svg-extresources-attrib.rng | 42 + .../adobe/epubcheck/rng/svg/svg-filter.rng | 512 ++ .../com/adobe/epubcheck/rng/svg/svg-font.rng | 146 + .../adobe/epubcheck/rng/svg/svg-gradient.rng | 259 + .../rng/svg/svg-graphevents-attrib.rng | 124 + .../epubcheck/rng/svg/svg-graphics-attrib.rng | 95 + .../adobe/epubcheck/rng/svg/svg-hyperlink.rng | 106 + .../com/adobe/epubcheck/rng/svg/svg-image.rng | 104 + .../adobe/epubcheck/rng/svg/svg-marker.rng | 161 + .../com/adobe/epubcheck/rng/svg/svg-mask.rng | 148 + .../epubcheck/rng/svg/svg-opacity-attrib.rng | 60 + .../epubcheck/rng/svg/svg-paint-attrib.rng | 207 + .../adobe/epubcheck/rng/svg/svg-pattern.rng | 138 + .../adobe/epubcheck/rng/svg/svg-profile.rng | 92 + .../com/adobe/epubcheck/rng/svg/svg-qname.rng | 98 + .../adobe/epubcheck/rng/svg/svg-script.rng | 64 + .../com/adobe/epubcheck/rng/svg/svg-shape.rng | 433 ++ .../adobe/epubcheck/rng/svg/svg-structure.rng | 92 + .../com/adobe/epubcheck/rng/svg/svg-style.rng | 121 + .../com/adobe/epubcheck/rng/svg/svg-text.rng | 627 ++ .../com/adobe/epubcheck/rng/svg/svg-view.rng | 83 + .../epubcheck/rng/svg/svg-viewport-attrib.rng | 64 + .../epubcheck/rng/svg/svg-xlink-attrib.rng | 194 + .../bin/com/adobe/epubcheck/rng/svg11.rng | 231 + .../com/adobe/epubcheck/rng/xenc-schema.rng | 223 + .../com/adobe/epubcheck/rng/xhtml/applet.rng | 47 + .../com/adobe/epubcheck/rng/xhtml/attribs.rng | 61 + .../com/adobe/epubcheck/rng/xhtml/base.rng | 23 + .../adobe/epubcheck/rng/xhtml/basic-form.rng | 200 + .../adobe/epubcheck/rng/xhtml/basic-table.rng | 146 + .../bin/com/adobe/epubcheck/rng/xhtml/bdo.rng | 37 + .../com/adobe/epubcheck/rng/xhtml/csismap.rng | 102 + .../adobe/epubcheck/rng/xhtml/datatypes.rng | 120 + .../com/adobe/epubcheck/rng/xhtml/edit.rng | 55 + .../com/adobe/epubcheck/rng/xhtml/events.rng | 208 + .../com/adobe/epubcheck/rng/xhtml/form.rng | 209 + .../com/adobe/epubcheck/rng/xhtml/frames.rng | 111 + .../adobe/epubcheck/rng/xhtml/hypertext.rng | 61 + .../com/adobe/epubcheck/rng/xhtml/iframe.rng | 67 + .../com/adobe/epubcheck/rng/xhtml/image.rng | 40 + .../adobe/epubcheck/rng/xhtml/inlstyle.rng | 11 + .../com/adobe/epubcheck/rng/xhtml/legacy.rng | 502 ++ .../com/adobe/epubcheck/rng/xhtml/link.rng | 56 + .../com/adobe/epubcheck/rng/xhtml/list.rng | 92 + .../com/adobe/epubcheck/rng/xhtml/meta.rng | 37 + .../adobe/epubcheck/rng/xhtml/nameident.rng | 39 + .../com/adobe/epubcheck/rng/xhtml/object.rng | 82 + .../com/adobe/epubcheck/rng/xhtml/param.rng | 33 + .../com/adobe/epubcheck/rng/xhtml/pres.rng | 107 + .../com/adobe/epubcheck/rng/xhtml/ruby.rng | 102 + .../com/adobe/epubcheck/rng/xhtml/script.rng | 70 + .../com/adobe/epubcheck/rng/xhtml/ssismap.rng | 14 + .../com/adobe/epubcheck/rng/xhtml/struct.rng | 78 + .../com/adobe/epubcheck/rng/xhtml/style.rng | 36 + .../com/adobe/epubcheck/rng/xhtml/table.rng | 257 + .../com/adobe/epubcheck/rng/xhtml/target.rng | 31 + .../com/adobe/epubcheck/rng/xhtml/text.rng | 338 + .../epubcheck/rng/xmldsig-core-schema.rng | 341 + .../bin/com/adobe/epubcheck/sch/ncx.sch | 81 + .../bin/com/adobe/epubcheck/sch/opf.sch | 15 + .../com/adobe/epubcheck/tool/Checker.class | Bin 0 -> 2527 bytes .../com/adobe/epubcheck/util/CheckUtil.class | Bin 0 -> 831 bytes .../epubcheck/util/DefaultReportImpl.class | Bin 0 -> 1297 bytes .../com/adobe/epubcheck/util/PathUtil.class | Bin 0 -> 2444 bytes .../adobe/epubcheck/util/ResourceUtil.class | Bin 0 -> 1879 bytes .../epubcheck/util/WriterReportImpl.class | Bin 0 -> 1240 bytes .../adobe/epubcheck/xml/XMLAttribute.class | Bin 0 -> 683 bytes .../com/adobe/epubcheck/xml/XMLElement.class | Bin 0 -> 2042 bytes .../com/adobe/epubcheck/xml/XMLHandler.class | Bin 0 -> 310 bytes .../bin/com/adobe/epubcheck/xml/XMLNode.class | Bin 0 -> 761 bytes .../com/adobe/epubcheck/xml/XMLParser.class | Bin 0 -> 18613 bytes .../adobe/epubcheck/xml/XMLValidator$1.class | Bin 0 -> 225 bytes .../xml/XMLValidator$ErrorHandlerImpl.class | Bin 0 -> 1367 bytes .../XMLValidator$ResourceEntityResolver.class | Bin 0 -> 1842 bytes .../XMLValidator$XMLReaderCreatorImpl.class | Bin 0 -> 2010 bytes .../adobe/epubcheck/xml/XMLValidator.class | Bin 0 -> 3493 bytes .../thaiopensource/datatype/Datatype2.class | Bin 0 -> 192 bytes .../datatype/xsd/AnyUriDatatype.class | Bin 0 -> 631 bytes .../datatype/xsd/Base64BinaryDatatype.class | Bin 0 -> 2270 bytes .../datatype/xsd/BinaryDatatype.class | Bin 0 -> 1193 bytes .../datatype/xsd/BooleanDatatype.class | Bin 0 -> 1009 bytes .../datatype/xsd/CdataDatatype.class | Bin 0 -> 369 bytes .../datatype/xsd/DatatypeBase.class | Bin 0 -> 4495 bytes .../datatype/xsd/DatatypeBuilderImpl.class | Bin 0 -> 7875 bytes .../xsd/DatatypeLibraryFactoryImpl.class | Bin 0 -> 942 bytes .../datatype/xsd/DatatypeLibraryImpl.class | Bin 0 -> 8627 bytes .../DateTimeDatatype$CalendarFactory.class | Bin 0 -> 1116 bytes .../xsd/DateTimeDatatype$DateTime.class | Bin 0 -> 1249 bytes .../datatype/xsd/DateTimeDatatype.class | Bin 0 -> 6147 bytes .../datatype/xsd/DecimalDatatype.class | Bin 0 -> 2015 bytes .../datatype/xsd/DoubleDatatype.class | Bin 0 -> 2271 bytes .../xsd/DurationDatatype$Duration.class | Bin 0 -> 2061 bytes .../datatype/xsd/DurationDatatype.class | Bin 0 -> 5659 bytes .../datatype/xsd/EntityDatatype.class | Bin 0 -> 909 bytes .../datatype/xsd/FloatDatatype.class | Bin 0 -> 1282 bytes .../datatype/xsd/HexBinaryDatatype.class | Bin 0 -> 1837 bytes .../datatype/xsd/IdDatatype.class | Bin 0 -> 425 bytes .../datatype/xsd/IdrefDatatype.class | Bin 0 -> 434 bytes .../xsd/IntegerRestrictDatatype.class | Bin 0 -> 813 bytes .../datatype/xsd/LengthRestrictDatatype.class | Bin 0 -> 1069 bytes .../datatype/xsd/ListDatatype.class | Bin 0 -> 2515 bytes .../xsd/MaxExclusiveRestrictDatatype.class | Bin 0 -> 1134 bytes .../xsd/MaxInclusiveRestrictDatatype.class | Bin 0 -> 1176 bytes .../xsd/MaxLengthRestrictDatatype.class | Bin 0 -> 1078 bytes .../thaiopensource/datatype/xsd/Measure.class | Bin 0 -> 171 bytes .../xsd/MinExclusiveRestrictDatatype.class | Bin 0 -> 1134 bytes .../xsd/MinInclusiveRestrictDatatype.class | Bin 0 -> 1176 bytes .../xsd/MinLengthRestrictDatatype.class | Bin 0 -> 1078 bytes .../datatype/xsd/NCNameDatatype.class | Bin 0 -> 560 bytes .../datatype/xsd/NameDatatype.class | Bin 0 -> 815 bytes .../datatype/xsd/NmtokenDatatype.class | Bin 0 -> 827 bytes .../datatype/xsd/OrderRelation.class | Bin 0 -> 202 bytes .../xsd/PatternRestrictDatatype.class | Bin 0 -> 940 bytes .../xsd/PrecisionRestrictDatatype.class | Bin 0 -> 1173 bytes .../datatype/xsd/QNameDatatype$QName.class | Bin 0 -> 937 bytes .../datatype/xsd/QNameDatatype.class | Bin 0 -> 1650 bytes .../datatype/xsd/RegexDatatype.class | Bin 0 -> 1245 bytes .../datatype/xsd/RestrictDatatype.class | Bin 0 -> 2108 bytes .../datatype/xsd/ScaleRestrictDatatype.class | Bin 0 -> 810 bytes .../datatype/xsd/StringDatatype.class | Bin 0 -> 372 bytes .../datatype/xsd/TokenDatatype.class | Bin 0 -> 1476 bytes .../datatype/xsd/ValueRestrictDatatype.class | Bin 0 -> 1128 bytes .../datatype/xsd/regex/Regex.class | Bin 0 -> 171 bytes .../datatype/xsd/regex/RegexEngine.class | Bin 0 -> 314 bytes .../xsd/regex/RegexSyntaxException.class | Bin 0 -> 728 bytes .../xsd/regex/jdk1_4/Categories.class | Bin 0 -> 2592 bytes .../xsd/regex/jdk1_4/NamingExceptions.class | Bin 0 -> 1556 bytes .../xsd/regex/jdk1_4/RegexEngineImpl$1.class | Bin 0 -> 1015 bytes .../xsd/regex/jdk1_4/RegexEngineImpl.class | Bin 0 -> 1182 bytes .../regex/jdk1_4/Translator$CharClass.class | Bin 0 -> 4294 bytes .../regex/jdk1_4/Translator$CharRange.class | Bin 0 -> 1507 bytes .../regex/jdk1_4/Translator$Complement.class | Bin 0 -> 1861 bytes .../xsd/regex/jdk1_4/Translator$Empty.class | Bin 0 -> 1021 bytes .../regex/jdk1_4/Translator$Property.class | Bin 0 -> 1202 bytes .../xsd/regex/jdk1_4/Translator$Range.class | Bin 0 -> 973 bytes .../jdk1_4/Translator$SimpleCharClass.class | Bin 0 -> 1164 bytes .../regex/jdk1_4/Translator$SingleChar.class | Bin 0 -> 1085 bytes .../regex/jdk1_4/Translator$Subtraction.class | Bin 0 -> 2726 bytes .../xsd/regex/jdk1_4/Translator$Union.class | Bin 0 -> 3049 bytes .../jdk1_4/Translator$WideSingleChar.class | Bin 0 -> 1260 bytes .../xsd/regex/jdk1_4/Translator.class | Bin 0 -> 19682 bytes .../jdk1_4/gen/CategoriesGen$Range.class | Bin 0 -> 840 bytes .../xsd/regex/jdk1_4/gen/CategoriesGen.class | Bin 0 -> 6251 bytes .../jdk1_4/gen/NamingExceptionsGen.class | Bin 0 -> 5399 bytes .../jdk1_4/resources/Messages.properties | 13 + .../xsd/regex/test/CategoryTest.class | Bin 0 -> 6157 bytes .../datatype/xsd/regex/test/TestDriver.class | Bin 0 -> 7010 bytes .../xsd/resources/Messages.properties | 14 + .../relaxng/SchemaFactory.class | Bin 0 -> 4339 bytes .../impl/AbstractPatternFunction.class | Bin 0 -> 3806 bytes .../relaxng/impl/AfterPattern.class | Bin 0 -> 1401 bytes .../relaxng/impl/Alphabet.class | Bin 0 -> 1418 bytes .../relaxng/impl/AnyNameClass.class | Bin 0 -> 1848 bytes .../relaxng/impl/AnyNameExceptNameClass.class | Bin 0 -> 1521 bytes .../relaxng/impl/ApplyAfterFunction.class | Bin 0 -> 2217 bytes .../impl/AttributeNameClassChecker.class | Bin 0 -> 2250 bytes .../relaxng/impl/AttributePattern.class | Bin 0 -> 4496 bytes .../relaxng/impl/BinaryPattern.class | Bin 0 -> 1829 bytes .../relaxng/impl/BlankDataDerivType.class | Bin 0 -> 1775 bytes .../relaxng/impl/BuiltinDatatypeBuilder.class | Bin 0 -> 1253 bytes .../relaxng/impl/BuiltinDatatypeLibrary.class | Bin 0 -> 1434 bytes .../impl/BuiltinDatatypeLibraryFactory.class | Bin 0 -> 1689 bytes .../relaxng/impl/ChoiceNameClass.class | Bin 0 -> 1753 bytes .../relaxng/impl/ChoicePattern.class | Bin 0 -> 2848 bytes .../relaxng/impl/CombineSchema.class | Bin 0 -> 1098 bytes .../relaxng/impl/CombineValidator.class | Bin 0 -> 1567 bytes .../impl/CompatibilityDatatypeLibrary.class | Bin 0 -> 1563 bytes .../relaxng/impl/DataDataDerivType.class | Bin 0 -> 2058 bytes .../relaxng/impl/DataDerivFunction.class | Bin 0 -> 6451 bytes .../relaxng/impl/DataDerivType.class | Bin 0 -> 1572 bytes .../relaxng/impl/DataDerivTypeFunction.class | Bin 0 -> 5200 bytes .../relaxng/impl/DataExceptPattern.class | Bin 0 -> 2505 bytes .../relaxng/impl/DataPattern.class | Bin 0 -> 2323 bytes .../relaxng/impl/DatatypeValue.class | Bin 0 -> 971 bytes .../impl/DuplicateAttributeDetector$1.class | Bin 0 -> 283 bytes ...plicateAttributeDetector$Alternative.class | Bin 0 -> 1778 bytes .../impl/DuplicateAttributeDetector.class | Bin 0 -> 2333 bytes .../relaxng/impl/ElementPattern.class | Bin 0 -> 4082 bytes .../relaxng/impl/EmptyPattern.class | Bin 0 -> 1772 bytes .../relaxng/impl/EndAttributesFunction.class | Bin 0 -> 4107 bytes .../relaxng/impl/EndTagDerivFunction.class | Bin 0 -> 2469 bytes .../relaxng/impl/ErrorNameClass.class | Bin 0 -> 1028 bytes .../relaxng/impl/ErrorPattern.class | Bin 0 -> 1178 bytes .../impl/FeasibleIdSoundnessChecker.class | Bin 0 -> 697 bytes .../impl/FeasibleIdTypeMapSchema.class | Bin 0 -> 1414 bytes ...bleTransform$FeasiblePatternFunction.class | Bin 0 -> 3350 bytes .../relaxng/impl/FeasibleTransform.class | Bin 0 -> 1061 bytes .../relaxng/impl/FindElementFunction.class | Bin 0 -> 4012 bytes .../relaxng/impl/GroupPattern.class | Bin 0 -> 2755 bytes .../relaxng/impl/IdSoundnessChecker$1.class | Bin 0 -> 259 bytes .../impl/IdSoundnessChecker$Entry.class | Bin 0 -> 836 bytes .../relaxng/impl/IdSoundnessChecker.class | Bin 0 -> 6707 bytes .../relaxng/impl/IdTypeMap.class | Bin 0 -> 225 bytes .../relaxng/impl/IdTypeMapBuilder$1.class | Bin 0 -> 253 bytes .../impl/IdTypeMapBuilder$BuildFunction.class | Bin 0 -> 6709 bytes ...peMapBuilder$ElementNameClassVisitor.class | Bin 0 -> 3221 bytes .../IdTypeMapBuilder$IdTypeFunction.class | Bin 0 -> 2182 bytes .../impl/IdTypeMapBuilder$IdTypeMapImpl.class | Bin 0 -> 2279 bytes .../IdTypeMapBuilder$PossibleConflict.class | Bin 0 -> 1713 bytes .../impl/IdTypeMapBuilder$ScopedName.class | Bin 0 -> 1673 bytes ...IdTypeMapBuilder$WrappedSAXException.class | Bin 0 -> 803 bytes .../relaxng/impl/IdTypeMapBuilder.class | Bin 0 -> 7493 bytes .../relaxng/impl/IdTypeMapSchema.class | Bin 0 -> 1382 bytes .../IgnoreMissingAttributesFunction.class | Bin 0 -> 1416 bytes .../impl/InconsistentDataDerivType.class | Bin 0 -> 957 bytes .../relaxng/impl/InterleavePattern.class | Bin 0 -> 3294 bytes .../relaxng/impl/ListPattern.class | Bin 0 -> 3121 bytes .../relaxng/impl/MixedTextDerivFunction.class | Bin 0 -> 3173 bytes .../relaxng/impl/NameClass.class | Bin 0 -> 599 bytes .../relaxng/impl/NameClassVisitor.class | Bin 0 -> 608 bytes .../relaxng/impl/NameFormatter.class | Bin 0 -> 1175 bytes .../relaxng/impl/NotAllowedPattern.class | Bin 0 -> 1365 bytes .../relaxng/impl/NsNameClass.class | Bin 0 -> 1531 bytes .../relaxng/impl/NsNameExceptNameClass.class | Bin 0 -> 1799 bytes .../relaxng/impl/NullNameClass.class | Bin 0 -> 1856 bytes .../relaxng/impl/OneOrMorePattern.class | Bin 0 -> 2963 bytes .../relaxng/impl/OverlapDetector.class | Bin 0 -> 2612 bytes .../thaiopensource/relaxng/impl/Pattern.class | Bin 0 -> 3770 bytes .../relaxng/impl/PatternBuilder.class | Bin 0 -> 2888 bytes ...ernDumper$ChoiceDumpNameClassVisitor.class | Bin 0 -> 1107 bytes ...tternDumper$ChoiceDumpPatternVisitor.class | Bin 0 -> 1081 bytes .../PatternDumper$DumpNameClassVisitor.class | Bin 0 -> 2764 bytes .../PatternDumper$DumpPatternVisitor.class | Bin 0 -> 4151 bytes ...atternDumper$GroupDumpPatternVisitor.class | Bin 0 -> 1077 bytes ...nDumper$InterleaveDumpPatternVisitor.class | Bin 0 -> 1097 bytes .../relaxng/impl/PatternDumper.class | Bin 0 -> 7211 bytes .../relaxng/impl/PatternFunction.class | Bin 0 -> 1609 bytes .../relaxng/impl/PatternFuture.class | Bin 0 -> 347 bytes .../relaxng/impl/PatternInterner.class | Bin 0 -> 1840 bytes .../relaxng/impl/PatternMemo.class | Bin 0 -> 7287 bytes .../relaxng/impl/PatternSchema.class | Bin 0 -> 1711 bytes .../relaxng/impl/PatternValidator$1.class | Bin 0 -> 1296 bytes .../impl/PatternValidator$PrefixMapping.class | Bin 0 -> 1371 bytes .../relaxng/impl/PatternValidator.class | Bin 0 -> 10119 bytes .../relaxng/impl/PatternVisitor.class | Bin 0 -> 859 bytes .../relaxng/impl/RecoverAfterFunction.class | Bin 0 -> 1857 bytes .../relaxng/impl/RefPattern.class | Bin 0 -> 3728 bytes .../impl/RestrictionViolationException.class | Bin 0 -> 1189 bytes .../relaxng/impl/SchemaBuilderImpl$1.class | Bin 0 -> 2139 bytes ...maBuilderImpl$DataPatternBuilderImpl.class | Bin 0 -> 5124 bytes ...aBuilderImpl$DummyDataPatternBuilder.class | Bin 0 -> 2750 bytes .../impl/SchemaBuilderImpl$GrammarImpl.class | Bin 0 -> 8467 bytes .../impl/SchemaBuilderImpl$IncludeImpl.class | Bin 0 -> 6513 bytes .../impl/SchemaBuilderImpl$LocatorImpl.class | Bin 0 -> 1644 bytes .../impl/SchemaBuilderImpl$OpenIncludes.class | Bin 0 -> 669 bytes .../impl/SchemaBuilderImpl$Override.class | Bin 0 -> 735 bytes .../impl/SchemaBuilderImpl$RootScope.class | Bin 0 -> 1574 bytes ...emaBuilderImpl$ValidationContextImpl.class | Bin 0 -> 1758 bytes .../relaxng/impl/SchemaBuilderImpl.class | Bin 0 -> 27188 bytes .../relaxng/impl/SchemaPatternBuilder.class | Bin 0 -> 4582 bytes .../relaxng/impl/SchemaReaderImpl.class | Bin 0 -> 5454 bytes .../relaxng/impl/SchemaReceiverImpl$1.class | Bin 0 -> 2386 bytes .../relaxng/impl/SchemaReceiverImpl.class | Bin 0 -> 2879 bytes .../relaxng/impl/SimpleNameClass.class | Bin 0 -> 1579 bytes .../relaxng/impl/SingleDataDerivType.class | Bin 0 -> 1359 bytes .../impl/StartAttributeDerivFunction$1.class | Bin 0 -> 1485 bytes .../impl/StartAttributeDerivFunction$2.class | Bin 0 -> 1485 bytes .../impl/StartAttributeDerivFunction.class | Bin 0 -> 3344 bytes .../impl/StartTagOpenDerivFunction$1.class | Bin 0 -> 1525 bytes .../impl/StartTagOpenDerivFunction$2.class | Bin 0 -> 1530 bytes .../impl/StartTagOpenDerivFunction$3.class | Bin 0 -> 1530 bytes .../impl/StartTagOpenDerivFunction$4.class | Bin 0 -> 1525 bytes .../impl/StartTagOpenDerivFunction$5.class | Bin 0 -> 1621 bytes .../impl/StartTagOpenDerivFunction.class | Bin 0 -> 5619 bytes .../StartTagOpenRecoverDerivFunction.class | Bin 0 -> 2040 bytes .../relaxng/impl/StringDatatype.class | Bin 0 -> 1963 bytes .../relaxng/impl/StringNormalizer.class | Bin 0 -> 1012 bytes .../relaxng/impl/StringPattern.class | Bin 0 -> 387 bytes .../relaxng/impl/TextOnlyFunction.class | Bin 0 -> 1565 bytes .../relaxng/impl/TextPattern.class | Bin 0 -> 1810 bytes .../relaxng/impl/TokenDatatype.class | Bin 0 -> 726 bytes .../impl/UnexpandedNotAllowedPattern.class | Bin 0 -> 858 bytes .../impl/ValidatorPatternBuilder$1.class | Bin 0 -> 274 bytes ...orPatternBuilder$NoteChoicesFunction.class | Bin 0 -> 2012 bytes ...PatternBuilder$RemoveChoicesFunction.class | Bin 0 -> 2592 bytes .../impl/ValidatorPatternBuilder.class | Bin 0 -> 5478 bytes .../relaxng/impl/ValueDataDerivType.class | Bin 0 -> 2584 bytes .../relaxng/impl/ValuePattern.class | Bin 0 -> 2480 bytes .../impl/resources/Messages.properties | 102 + .../relaxng/parse/Annotations.class | Bin 0 -> 572 bytes .../relaxng/parse/BuildException.class | Bin 0 -> 649 bytes .../relaxng/parse/CommentList.class | Bin 0 -> 300 bytes .../relaxng/parse/Context.class | Bin 0 -> 283 bytes .../relaxng/parse/DataPatternBuilder.class | Bin 0 -> 903 bytes .../thaiopensource/relaxng/parse/Div.class | Bin 0 -> 363 bytes .../parse/ElementAnnotationBuilder.class | Bin 0 -> 526 bytes .../relaxng/parse/Grammar.class | Bin 0 -> 468 bytes .../relaxng/parse/GrammarSection$1.class | Bin 0 -> 249 bytes .../parse/GrammarSection$Combine.class | Bin 0 -> 946 bytes .../relaxng/parse/GrammarSection.class | Bin 0 -> 1440 bytes .../parse/IllegalSchemaException.class | Bin 0 -> 360 bytes .../relaxng/parse/Include.class | Bin 0 -> 474 bytes .../relaxng/parse/IncludedGrammar.class | Bin 0 -> 492 bytes .../relaxng/parse/Location.class | Bin 0 -> 130 bytes .../relaxng/parse/ParseReceiver.class | Bin 0 -> 439 bytes .../relaxng/parse/Parseable.class | Bin 0 -> 478 bytes .../parse/ParsedElementAnnotation.class | Bin 0 -> 160 bytes .../relaxng/parse/ParsedNameClass.class | Bin 0 -> 144 bytes .../relaxng/parse/ParsedPattern.class | Bin 0 -> 140 bytes .../relaxng/parse/ParsedPatternFuture.class | Bin 0 -> 316 bytes .../relaxng/parse/SchemaBuilder.class | Bin 0 -> 5547 bytes .../thaiopensource/relaxng/parse/Scope.class | Bin 0 -> 412 bytes .../relaxng/parse/SubParser.class | Bin 0 -> 658 bytes .../parse/compact/CompactParseable.class | Bin 0 -> 3887 bytes .../parse/compact/CompactSyntax$JJCalls.class | Bin 0 -> 577 bytes .../compact/CompactSyntax$LocatedString.class | Bin 0 -> 1352 bytes .../relaxng/parse/compact/CompactSyntax.class | Bin 0 -> 74268 bytes .../relaxng/parse/compact/CompactSyntax.jj | 1933 ++++++ .../compact/CompactSyntaxConstants.class | Bin 0 -> 2643 bytes .../compact/CompactSyntaxTokenManager.class | Bin 0 -> 26716 bytes .../relaxng/parse/compact/EOFException.class | Bin 0 -> 346 bytes .../parse/compact/EscapeSyntaxException.class | Bin 0 -> 835 bytes .../parse/compact/ParseException.class | Bin 0 -> 3348 bytes .../relaxng/parse/compact/Token.class | Bin 0 -> 760 bytes .../relaxng/parse/compact/TokenMgrError.class | Bin 0 -> 2620 bytes .../compact/UCode_UCodeESC_CharStream.class | Bin 0 -> 9210 bytes .../compact/resources/Messages.properties | 22 + .../relaxng/parse/sax/DtdContext.class | Bin 0 -> 1722 bytes .../relaxng/parse/sax/SAXParseReceiver.class | Bin 0 -> 1379 bytes .../relaxng/parse/sax/SAXParseable.class | Bin 0 -> 2281 bytes .../relaxng/parse/sax/SAXSubParser.class | Bin 0 -> 3514 bytes .../sax/SchemaParser$AbstractContext.class | Bin 0 -> 2053 bytes .../parse/sax/SchemaParser$AnyNameState.class | Bin 0 -> 3262 bytes .../sax/SchemaParser$AttributeState.class | Bin 0 -> 4579 bytes .../parse/sax/SchemaParser$ChoiceState.class | Bin 0 -> 1686 bytes .../sax/SchemaParser$CommentHandler.class | Bin 0 -> 302 bytes .../parse/sax/SchemaParser$ContextImpl.class | Bin 0 -> 977 bytes .../parse/sax/SchemaParser$DataState.class | Bin 0 -> 4339 bytes .../parse/sax/SchemaParser$DefineState.class | Bin 0 -> 2456 bytes .../sax/SchemaParser$DefinitionState.class | Bin 0 -> 2355 bytes .../parse/sax/SchemaParser$DivState.class | Bin 0 -> 1388 bytes .../parse/sax/SchemaParser$ElementState.class | Bin 0 -> 3701 bytes .../sax/SchemaParser$EmptyContentState.class | Bin 0 -> 2245 bytes .../parse/sax/SchemaParser$EmptyState.class | Bin 0 -> 1544 bytes .../sax/SchemaParser$ExternalRefState.class | Bin 0 -> 2822 bytes .../SchemaParser$ForeignElementHandler.class | Bin 0 -> 4887 bytes .../SchemaParser$GrammarSectionState.class | Bin 0 -> 3132 bytes .../parse/sax/SchemaParser$GrammarState.class | Bin 0 -> 2305 bytes .../parse/sax/SchemaParser$GroupState.class | Bin 0 -> 920 bytes .../parse/sax/SchemaParser$Handler.class | Bin 0 -> 3462 bytes .../parse/sax/SchemaParser$IncludeState.class | Bin 0 -> 2404 bytes .../sax/SchemaParser$InterleaveState.class | Bin 0 -> 1649 bytes .../sax/SchemaParser$LexicalHandlerImpl.class | Bin 0 -> 1602 bytes .../parse/sax/SchemaParser$ListState.class | Bin 0 -> 1884 bytes .../sax/SchemaParser$MergeGrammarState.class | Bin 0 -> 1752 bytes .../parse/sax/SchemaParser$MixedState.class | Bin 0 -> 1888 bytes .../sax/SchemaParser$NameClassBaseState.class | Bin 0 -> 1083 bytes .../SchemaParser$NameClassChildState.class | Bin 0 -> 2687 bytes .../SchemaParser$NameClassChoiceState.class | Bin 0 -> 4287 bytes ...SchemaParser$NameClassContainerState.class | Bin 0 -> 1492 bytes .../parse/sax/SchemaParser$NameClassRef.class | Bin 0 -> 335 bytes .../parse/sax/SchemaParser$NameState.class | Bin 0 -> 2453 bytes .../sax/SchemaParser$NotAllowedState.class | Bin 0 -> 1564 bytes .../parse/sax/SchemaParser$NsNameState.class | Bin 0 -> 2038 bytes .../sax/SchemaParser$OneOrMoreState.class | Bin 0 -> 1904 bytes .../sax/SchemaParser$OptionalState.class | Bin 0 -> 1900 bytes .../parse/sax/SchemaParser$ParamState.class | Bin 0 -> 3173 bytes .../sax/SchemaParser$ParentRefState.class | Bin 0 -> 1761 bytes .../SchemaParser$PatternContainerState.class | Bin 0 -> 4109 bytes .../sax/SchemaParser$PrefixMapping.class | Bin 0 -> 730 bytes .../parse/sax/SchemaParser$RefState.class | Bin 0 -> 2288 bytes .../parse/sax/SchemaParser$RootState.class | Bin 0 -> 3365 bytes .../parse/sax/SchemaParser$SavedContext.class | Bin 0 -> 867 bytes ...maParser$SinglePatternContainerState.class | Bin 0 -> 1276 bytes .../parse/sax/SchemaParser$Skipper.class | Bin 0 -> 1686 bytes .../parse/sax/SchemaParser$StartState.class | Bin 0 -> 2419 bytes .../parse/sax/SchemaParser$State.class | Bin 0 -> 8925 bytes .../parse/sax/SchemaParser$TextState.class | Bin 0 -> 1540 bytes .../parse/sax/SchemaParser$ValueState.class | Bin 0 -> 3320 bytes .../sax/SchemaParser$ZeroOrMoreState.class | Bin 0 -> 1908 bytes .../relaxng/parse/sax/SchemaParser.class | Bin 0 -> 18719 bytes .../parse/sax/resources/Messages.properties | 38 + .../thaiopensource/relaxng/util/Driver.class | Bin 0 -> 6748 bytes .../relaxng/util/ExegenDriver.class | Bin 0 -> 580 bytes .../relaxng/util/TestDriver.class | Bin 0 -> 6974 bytes .../relaxng/util/ValidationEngine.class | Bin 0 -> 3270 bytes .../util/resources/Messages.properties | 17 + .../relaxng/util/resources/Version.properties | 1 + .../bin/com/thaiopensource/util/Equal.class | Bin 0 -> 504 bytes .../com/thaiopensource/util/Localizer.class | Bin 0 -> 1881 bytes .../OptionParser$InvalidOptionException.class | Bin 0 -> 456 bytes ...ptionParser$MissingArgumentException.class | Bin 0 -> 462 bytes .../thaiopensource/util/OptionParser.class | Bin 0 -> 3340 bytes .../com/thaiopensource/util/PropertyId.class | Bin 0 -> 972 bytes .../thaiopensource/util/PropertyMap$1.class | Bin 0 -> 936 bytes .../com/thaiopensource/util/PropertyMap.class | Bin 0 -> 594 bytes .../util/PropertyMapBuilder$1.class | Bin 0 -> 243 bytes .../PropertyMapBuilder$PropertyMapImpl.class | Bin 0 -> 2026 bytes .../util/PropertyMapBuilder.class | Bin 0 -> 3198 bytes .../com/thaiopensource/util/Service$1.class | Bin 0 -> 210 bytes .../thaiopensource/util/Service$Loader.class | Bin 0 -> 1605 bytes .../thaiopensource/util/Service$Loader2.class | Bin 0 -> 1970 bytes .../util/Service$ProviderEnumeration.class | Bin 0 -> 1524 bytes .../util/Service$Singleton.class | Bin 0 -> 1070 bytes .../bin/com/thaiopensource/util/Service.class | Bin 0 -> 5181 bytes .../util/SinglePropertyMap.class | Bin 0 -> 1416 bytes .../bin/com/thaiopensource/util/Uri.class | Bin 0 -> 3548 bytes .../com/thaiopensource/util/UriOrFile.class | Bin 0 -> 2546 bytes .../bin/com/thaiopensource/util/Utf16.class | Bin 0 -> 875 bytes .../bin/com/thaiopensource/util/Version.class | Bin 0 -> 1164 bytes .../validate/AbstractSchema.class | Bin 0 -> 1650 bytes .../com/thaiopensource/validate/Flag.class | Bin 0 -> 386 bytes .../thaiopensource/validate/FlagOption.class | Bin 0 -> 1179 bytes .../validate/FlagPropertyId.class | Bin 0 -> 1432 bytes .../validate/IncorrectSchemaException.class | Bin 0 -> 356 bytes .../com/thaiopensource/validate/Option.class | Bin 0 -> 385 bytes .../validate/OptionArgumentException.class | Bin 0 -> 498 bytes .../OptionArgumentFormatException.class | Bin 0 -> 548 bytes .../OptionArgumentPresenceException.class | Bin 0 -> 413 bytes .../com/thaiopensource/validate/Schema.class | Bin 0 -> 294 bytes .../validate/SchemaReader.class | Bin 0 -> 587 bytes .../validate/SchemaReaderFactory.class | Bin 0 -> 320 bytes .../validate/SchemaReaderLoader.class | Bin 0 -> 2029 bytes .../validate/StringOption.class | Bin 0 -> 1427 bytes .../validate/StringPropertyId.class | Bin 0 -> 1682 bytes ...ateProperty$EntityResolverPropertyId.class | Bin 0 -> 1560 bytes ...idateProperty$ErrorHandlerPropertyId.class | Bin 0 -> 1540 bytes ...eProperty$XMLReaderCreatorPropertyId.class | Bin 0 -> 1685 bytes .../validate/ValidateProperty.class | Bin 0 -> 1758 bytes .../validate/ValidationDriver.class | Bin 0 -> 7111 bytes .../thaiopensource/validate/Validator.class | Bin 0 -> 263 bytes .../validate/auto/AutoSchemaReader.class | Bin 0 -> 5862 bytes .../validate/auto/AutoSchemaReceiver$1.class | Bin 0 -> 261 bytes .../auto/AutoSchemaReceiver$Handler.class | Bin 0 -> 5156 bytes .../validate/auto/AutoSchemaReceiver.class | Bin 0 -> 2258 bytes .../validate/auto/ReparseException.class | Bin 0 -> 601 bytes .../validate/auto/Rewindable.class | Bin 0 -> 207 bytes .../auto/RewindableInputStream$Block.class | Bin 0 -> 1105 bytes .../validate/auto/RewindableInputStream.class | Bin 0 -> 3229 bytes .../validate/auto/SchemaFuture.class | Bin 0 -> 440 bytes ...maReaderFactorySchemaReceiverFactory.class | Bin 0 -> 1496 bytes ...emaReaderLoaderSchemaReceiverFactory.class | Bin 0 -> 593 bytes .../auto/SchemaReaderSchemaReceiver$1.class | Bin 0 -> 1453 bytes .../auto/SchemaReaderSchemaReceiver.class | Bin 0 -> 1520 bytes .../validate/auto/SchemaReceiver.class | Bin 0 -> 296 bytes .../auto/SchemaReceiverFactory$1.class | Bin 0 -> 837 bytes ...tory$SchemaReceiverFactoryPropertyId.class | Bin 0 -> 1825 bytes .../validate/auto/SchemaReceiverFactory.class | Bin 0 -> 890 bytes .../validate/auto/SchemaReceiverLoader.class | Bin 0 -> 2192 bytes .../auto/resources/Messages.properties | 2 + .../validate/mns/ContextMap.class | Bin 0 -> 1729 bytes .../validate/mns/ElementsOrAttributes.class | Bin 0 -> 1270 bytes .../thaiopensource/validate/mns/Hashset.class | Bin 0 -> 879 bytes .../mns/MnsSchemaReceiverFactory.class | Bin 0 -> 1109 bytes .../mns/NamespaceFilteredAttributes.class | Bin 0 -> 2869 bytes .../validate/mns/SchemaImpl$1.class | Bin 0 -> 235 bytes .../mns/SchemaImpl$ElementAction.class | Bin 0 -> 2343 bytes .../validate/mns/SchemaImpl$Handler.class | Bin 0 -> 15743 bytes .../validate/mns/SchemaImpl$Mode.class | Bin 0 -> 2855 bytes .../mns/SchemaImpl$WrappedIOException.class | Bin 0 -> 1155 bytes .../validate/mns/SchemaImpl.class | Bin 0 -> 3846 bytes .../validate/mns/SchemaReceiverImpl.class | Bin 0 -> 5395 bytes .../mns/ValidatorImpl$PrefixMapping.class | Bin 0 -> 717 bytes .../validate/mns/ValidatorImpl$Subtree.class | Bin 0 -> 1657 bytes .../validate/mns/ValidatorImpl.class | Bin 0 -> 10356 bytes .../mns/resources/Messages.properties | 10 + .../validate/mns/resources/mns.rng | 217 + .../thaiopensource/validate/nrl/Action.class | Bin 0 -> 947 bytes .../validate/nrl/ActionSet.class | Bin 0 -> 1932 bytes .../validate/nrl/AllowAction.class | Bin 0 -> 1341 bytes .../validate/nrl/AttachAction.class | Bin 0 -> 1561 bytes .../validate/nrl/AttributeActionSet.class | Bin 0 -> 1299 bytes .../validate/nrl/ContextMap$1.class | Bin 0 -> 235 bytes .../validate/nrl/ContextMap$Enumerator.class | Bin 0 -> 1967 bytes .../validate/nrl/ContextMap.class | Bin 0 -> 3241 bytes .../validate/nrl/ElementsOrAttributes.class | Bin 0 -> 1270 bytes .../validate/nrl/FilteredAttributes.class | Bin 0 -> 2835 bytes .../thaiopensource/validate/nrl/Hashset.class | Bin 0 -> 1330 bytes .../thaiopensource/validate/nrl/IntSet.class | Bin 0 -> 1707 bytes .../thaiopensource/validate/nrl/Mode.class | Bin 0 -> 4354 bytes .../validate/nrl/ModeUsage.class | Bin 0 -> 2966 bytes .../validate/nrl/NoResultAction.class | Bin 0 -> 711 bytes .../validate/nrl/NrlProperty.class | Bin 0 -> 554 bytes .../nrl/NrlSchemaReceiverFactory.class | Bin 0 -> 1634 bytes .../validate/nrl/Path$ParseException.class | Bin 0 -> 618 bytes .../thaiopensource/validate/nrl/Path.class | Bin 0 -> 3347 bytes .../validate/nrl/RejectAction.class | Bin 0 -> 1445 bytes .../validate/nrl/ResultAction.class | Bin 0 -> 731 bytes .../validate/nrl/SchemaImpl$1.class | Bin 0 -> 235 bytes .../validate/nrl/SchemaImpl$Handler.class | Bin 0 -> 20484 bytes .../nrl/SchemaImpl$MustSupportOption.class | Bin 0 -> 1291 bytes .../nrl/SchemaImpl$WrappedIOException.class | Bin 0 -> 1155 bytes .../validate/nrl/SchemaImpl.class | Bin 0 -> 7730 bytes .../validate/nrl/SchemaReceiverImpl.class | Bin 0 -> 7112 bytes .../validate/nrl/SectionState.class | Bin 0 -> 616 bytes .../validate/nrl/UnwrapAction.class | Bin 0 -> 1361 bytes .../validate/nrl/ValidateAction.class | Bin 0 -> 1830 bytes .../nrl/ValidatorImpl$PrefixMapping.class | Bin 0 -> 717 bytes .../validate/nrl/ValidatorImpl$Program.class | Bin 0 -> 690 bytes .../validate/nrl/ValidatorImpl$Section.class | Bin 0 -> 3995 bytes .../validate/nrl/ValidatorImpl.class | Bin 0 -> 13988 bytes .../nrl/resources/Messages.properties | 26 + .../validate/nrl/resources/nrl.rng | 237 + .../validate/rng/CompactSchemaReader.class | Bin 0 -> 1137 bytes ...rty$DatatypeLibraryFactoryPropertyId.class | Bin 0 -> 1695 bytes .../validate/rng/RngProperty.class | Bin 0 -> 1989 bytes .../validate/rng/SAXSchemaReader.class | Bin 0 -> 1163 bytes .../rng/SAXSchemaReceiverFactory.class | Bin 0 -> 2186 bytes .../schematron/DraconianErrorListener.class | Bin 0 -> 842 bytes .../validate/schematron/OutputHandler.class | Bin 0 -> 3940 bytes .../schematron/SaxonSchemaReaderFactory.class | Bin 0 -> 607 bytes .../validate/schematron/SchemaImpl.class | Bin 0 -> 1089 bytes .../SchemaReaderImpl$ErrorFilter.class | Bin 0 -> 2017 bytes .../SchemaReaderImpl$LocationFilter.class | Bin 0 -> 2529 bytes .../SchemaReaderImpl$SAXErrorListener.class | Bin 0 -> 2897 bytes .../SchemaReaderImpl$TransformStage.class | Bin 0 -> 3069 bytes .../SchemaReaderImpl$UserException.class | Bin 0 -> 711 bytes ...chemaReaderImpl$UserWrapErrorHandler.class | Bin 0 -> 1430 bytes .../SchemaReaderImpl$ValidateStage.class | Bin 0 -> 1942 bytes .../schematron/SchemaReaderImpl.class | Bin 0 -> 12533 bytes .../schematron/SchematronProperty$1.class | Bin 0 -> 273 bytes .../SchematronProperty$PhaseOption.class | Bin 0 -> 1432 bytes .../schematron/SchematronProperty.class | Bin 0 -> 1690 bytes .../SchematronSchemaReaderFactory.class | Bin 0 -> 1632 bytes .../validate/schematron/ValidatorImpl$1.class | Bin 0 -> 1908 bytes .../ValidatorImpl$BlockingReader.class | Bin 0 -> 1668 bytes .../validate/schematron/ValidatorImpl.class | Bin 0 -> 5381 bytes .../validate/schematron/XMLReaderImpl.class | Bin 0 -> 2560 bytes .../schematron/resources/Messages.properties | 11 + .../schematron/resources/schematron.rnc | 167 + .../schematron/resources/schematron.xsl | 405 ++ .../xml/sax/AbstractLexicalHandler.class | Bin 0 -> 1218 bytes .../xml/sax/CountingErrorHandler.class | Bin 0 -> 1944 bytes .../xml/sax/DelegatingContentHandler.class | Bin 0 -> 2764 bytes .../xml/sax/DraconianErrorHandler.class | Bin 0 -> 756 bytes .../xml/sax/ErrorHandlerImpl.class | Bin 0 -> 4497 bytes .../xml/sax/ForkContentHandler.class | Bin 0 -> 2534 bytes .../xml/sax/ForkDTDHandler.class | Bin 0 -> 1096 bytes .../xml/sax/Jaxp11XMLReaderCreator.class | Bin 0 -> 1133 bytes .../xml/sax/Sax2XMLReaderCreator.class | Bin 0 -> 1398 bytes .../xml/sax/XMLReaderCreator.class | Bin 0 -> 247 bytes .../xml/sax/XmlBaseHandler$1.class | Bin 0 -> 237 bytes .../xml/sax/XmlBaseHandler$Entry.class | Bin 0 -> 2034 bytes .../xml/sax/XmlBaseHandler.class | Bin 0 -> 2776 bytes .../xml/sax/resources/Messages.properties | 29 + .../thaiopensource/xml/util/EncodingMap.class | Bin 0 -> 1427 bytes .../com/thaiopensource/xml/util/Name.class | Bin 0 -> 1018 bytes .../com/thaiopensource/xml/util/Naming.class | Bin 0 -> 4298 bytes .../xml/util/StringSplitter.class | Bin 0 -> 1084 bytes .../xml/util/WellKnownNamespaces.class | Bin 0 -> 1011 bytes .../bin/org/relaxng/datatype/Datatype.class | Bin 0 -> 920 bytes .../relaxng/datatype/DatatypeBuilder.class | Bin 0 -> 375 bytes .../relaxng/datatype/DatatypeException.class | Bin 0 -> 740 bytes .../relaxng/datatype/DatatypeLibrary.class | Bin 0 -> 381 bytes .../datatype/DatatypeLibraryFactory.class | Bin 0 -> 239 bytes .../datatype/DatatypeStreamingValidator.class | Bin 0 -> 306 bytes .../relaxng/datatype/ValidationContext.class | Bin 0 -> 326 bytes .../helpers/DatatypeLibraryLoader$1.class | Bin 0 -> 262 bytes ...DatatypeLibraryLoader$Service$Loader.class | Bin 0 -> 1931 bytes ...atatypeLibraryLoader$Service$Loader2.class | Bin 0 -> 2304 bytes ...ryLoader$Service$ProviderEnumeration.class | Bin 0 -> 1885 bytes ...atypeLibraryLoader$Service$Singleton.class | Bin 0 -> 1296 bytes .../DatatypeLibraryLoader$Service.class | Bin 0 -> 4809 bytes .../helpers/DatatypeLibraryLoader.class | Bin 0 -> 2057 bytes .../ParameterlessDatatypeBuilder.class | Bin 0 -> 1013 bytes .../helpers/StreamingValidatorImpl.class | Bin 0 -> 1449 bytes thirdparty/epubcheck/build.bat | 6 + thirdparty/epubcheck/build.xml | 144 + thirdparty/epubcheck/epubcheck-1.0.5.jar | Bin 0 -> 858795 bytes thirdparty/epubcheck/foo.epub | Bin 0 -> 6842 bytes thirdparty/epubcheck/jing_license.txt | 12 + ...iopensource.datatype.xsd.regex.RegexEngine | 3 + ...haiopensource.validate.SchemaReaderFactory | 4 + ...source.validate.auto.SchemaReceiverFactory | 4 + ...g.iso_relax.verifier.VerifierFactoryLoader | 1 + ...rg.relaxng.datatype.DatatypeLibraryFactory | 1 + .../thaiopensource/datatype/Datatype2.java | 7 + .../datatype/xsd/AnyUriDatatype.java | 14 + .../datatype/xsd/Base64BinaryDatatype.java | 105 + .../datatype/xsd/BinaryDatatype.java | 35 + .../datatype/xsd/BooleanDatatype.java | 17 + .../datatype/xsd/CdataDatatype.java | 7 + .../datatype/xsd/DatatypeBase.java | 171 + .../datatype/xsd/DatatypeBuilderImpl.java | 178 + .../xsd/DatatypeLibraryFactoryImpl.java | 20 + .../datatype/xsd/DatatypeLibraryImpl.java | 149 + .../datatype/xsd/DateTimeDatatype.java | 312 + .../datatype/xsd/DecimalDatatype.java | 79 + .../datatype/xsd/DoubleDatatype.java | 80 + .../datatype/xsd/DurationDatatype.java | 243 + .../datatype/xsd/EntityDatatype.java | 15 + .../datatype/xsd/FloatDatatype.java | 27 + .../datatype/xsd/HexBinaryDatatype.java | 53 + .../datatype/xsd/IdDatatype.java | 7 + .../datatype/xsd/IdrefDatatype.java | 7 + .../datatype/xsd/IntegerRestrictDatatype.java | 11 + .../datatype/xsd/LengthRestrictDatatype.java | 16 + .../datatype/xsd/ListDatatype.java | 77 + .../xsd/MaxExclusiveRestrictDatatype.java | 18 + .../xsd/MaxInclusiveRestrictDatatype.java | 18 + .../xsd/MaxLengthRestrictDatatype.java | 16 + .../thaiopensource/datatype/xsd/Measure.java | 5 + .../xsd/MinExclusiveRestrictDatatype.java | 18 + .../xsd/MinInclusiveRestrictDatatype.java | 18 + .../xsd/MinLengthRestrictDatatype.java | 16 + .../datatype/xsd/NCNameDatatype.java | 9 + .../datatype/xsd/NameDatatype.java | 17 + .../datatype/xsd/NmtokenDatatype.java | 16 + .../datatype/xsd/OrderRelation.java | 5 + .../datatype/xsd/PatternRestrictDatatype.java | 16 + .../xsd/PrecisionRestrictDatatype.java | 20 + .../datatype/xsd/QNameDatatype.java | 54 + .../datatype/xsd/RegexDatatype.java | 27 + .../datatype/xsd/RestrictDatatype.java | 52 + .../datatype/xsd/ScaleRestrictDatatype.java | 16 + .../datatype/xsd/StringDatatype.java | 7 + .../datatype/xsd/TokenDatatype.java | 38 + .../datatype/xsd/ValueRestrictDatatype.java | 22 + .../datatype/xsd/regex/Regex.java | 16 + .../datatype/xsd/regex/RegexEngine.java | 17 + .../xsd/regex/RegexSyntaxException.java | 33 + .../datatype/xsd/regex/jdk1_4/Categories.java | 141 + .../xsd/regex/jdk1_4/NamingExceptions.java | 46 + .../xsd/regex/jdk1_4/RegexEngineImpl.java | 30 + .../datatype/xsd/regex/jdk1_4/Translator.java | 1313 ++++ .../xsd/regex/jdk1_4/gen/CategoriesGen.java | 161 + .../regex/jdk1_4/gen/NamingExceptionsGen.java | 152 + .../jdk1_4/resources/Messages.properties | 13 + .../datatype/xsd/regex/test/CategoryTest.java | 135 + .../datatype/xsd/regex/test/TestDriver.java | 165 + .../xsd/resources/Messages.properties | 14 + .../thaiopensource/relaxng/SchemaFactory.java | 210 + .../relaxng/impl/AbstractPatternFunction.java | 69 + .../relaxng/impl/AfterPattern.java | 22 + .../thaiopensource/relaxng/impl/Alphabet.java | 27 + .../relaxng/impl/AnyNameClass.java | 30 + .../relaxng/impl/AnyNameExceptNameClass.java | 38 + .../relaxng/impl/ApplyAfterFunction.java | 28 + .../impl/AttributeNameClassChecker.java | 45 + .../relaxng/impl/AttributePattern.java | 95 + .../relaxng/impl/BinaryPattern.java | 40 + .../relaxng/impl/BlankDataDerivType.java | 33 + .../relaxng/impl/BuiltinDatatypeBuilder.java | 24 + .../relaxng/impl/BuiltinDatatypeLibrary.java | 24 + .../impl/BuiltinDatatypeLibraryFactory.java | 41 + .../relaxng/impl/ChoiceNameClass.java | 44 + .../relaxng/impl/ChoicePattern.java | 44 + .../relaxng/impl/CombineSchema.java | 22 + .../relaxng/impl/CombineValidator.java | 49 + .../impl/CompatibilityDatatypeLibrary.java | 34 + .../relaxng/impl/DataDataDerivType.java | 45 + .../relaxng/impl/DataDerivFunction.java | 135 + .../relaxng/impl/DataDerivType.java | 11 + .../relaxng/impl/DataDerivTypeFunction.java | 69 + .../relaxng/impl/DataExceptPattern.java | 45 + .../relaxng/impl/DataPattern.java | 43 + .../relaxng/impl/DatatypeValue.java | 26 + .../impl/DuplicateAttributeDetector.java | 48 + .../relaxng/impl/ElementPattern.java | 95 + .../relaxng/impl/EmptyPattern.java | 25 + .../relaxng/impl/EndAttributesFunction.java | 75 + .../relaxng/impl/EndTagDerivFunction.java | 33 + .../relaxng/impl/ErrorNameClass.java | 21 + .../relaxng/impl/ErrorPattern.java | 16 + .../impl/FeasibleIdSoundnessChecker.java | 14 + .../relaxng/impl/FeasibleIdTypeMapSchema.java | 21 + .../relaxng/impl/FeasibleTransform.java | 46 + .../relaxng/impl/FindElementFunction.java | 78 + .../relaxng/impl/GroupPattern.java | 43 + .../relaxng/impl/IdSoundnessChecker.java | 185 + .../relaxng/impl/IdTypeMap.java | 7 + .../relaxng/impl/IdTypeMapBuilder.java | 315 + .../relaxng/impl/IdTypeMapSchema.java | 22 + .../impl/IgnoreMissingAttributesFunction.java | 15 + .../impl/InconsistentDataDerivType.java | 19 + .../relaxng/impl/InterleavePattern.java | 61 + .../relaxng/impl/ListPattern.java | 65 + .../relaxng/impl/MixedTextDerivFunction.java | 45 + .../relaxng/impl/NameClass.java | 15 + .../relaxng/impl/NameClassVisitor.java | 14 + .../relaxng/impl/NameFormatter.java | 15 + .../relaxng/impl/NotAllowedPattern.java | 20 + .../relaxng/impl/NsNameClass.java | 38 + .../relaxng/impl/NsNameExceptNameClass.java | 44 + .../relaxng/impl/NullNameClass.java | 31 + .../relaxng/impl/OneOrMorePattern.java | 62 + .../relaxng/impl/OverlapDetector.java | 68 + .../thaiopensource/relaxng/impl/Pattern.java | 108 + .../relaxng/impl/PatternBuilder.java | 92 + .../relaxng/impl/PatternDumper.java | 341 + .../relaxng/impl/PatternFunction.java | 20 + .../relaxng/impl/PatternFuture.java | 10 + .../relaxng/impl/PatternInterner.java | 68 + .../relaxng/impl/PatternMemo.java | 193 + .../relaxng/impl/PatternSchema.java | 23 + .../relaxng/impl/PatternValidator.java | 271 + .../relaxng/impl/PatternVisitor.java | 20 + .../relaxng/impl/RecoverAfterFunction.java | 22 + .../relaxng/impl/RefPattern.java | 105 + .../impl/RestrictionViolationException.java | 37 + .../relaxng/impl/SchemaBuilderImpl.java | 896 +++ .../relaxng/impl/SchemaPatternBuilder.java | 90 + .../relaxng/impl/SchemaReaderImpl.java | 72 + .../relaxng/impl/SchemaReceiverImpl.java | 50 + .../relaxng/impl/SimpleNameClass.java | 44 + .../relaxng/impl/SingleDataDerivType.java | 26 + .../impl/StartAttributeDerivFunction.java | 40 + .../impl/StartTagOpenDerivFunction.java | 95 + .../StartTagOpenRecoverDerivFunction.java | 20 + .../relaxng/impl/StringDatatype.java | 46 + .../relaxng/impl/StringNormalizer.java | 15 + .../relaxng/impl/StringPattern.java | 7 + .../relaxng/impl/TextOnlyFunction.java | 19 + .../relaxng/impl/TextPattern.java | 32 + .../relaxng/impl/TokenDatatype.java | 9 + .../impl/UnexpandedNotAllowedPattern.java | 12 + .../relaxng/impl/ValidatorPatternBuilder.java | 141 + .../relaxng/impl/ValueDataDerivType.java | 55 + .../relaxng/impl/ValuePattern.java | 48 + .../impl/resources/Messages.properties | 102 + .../relaxng/parse/Annotations.java | 15 + .../relaxng/parse/BuildException.java | 14 + .../relaxng/parse/CommentList.java | 5 + .../thaiopensource/relaxng/parse/Context.java | 10 + .../relaxng/parse/DataPatternBuilder.java | 11 + .../com/thaiopensource/relaxng/parse/Div.java | 5 + .../parse/ElementAnnotationBuilder.java | 6 + .../thaiopensource/relaxng/parse/Grammar.java | 5 + .../relaxng/parse/GrammarSection.java | 29 + .../relaxng/parse/IllegalSchemaException.java | 3 + .../thaiopensource/relaxng/parse/Include.java | 6 + .../relaxng/parse/IncludedGrammar.java | 5 + .../relaxng/parse/Location.java | 3 + .../relaxng/parse/ParseReceiver.java | 8 + .../relaxng/parse/Parseable.java | 5 + .../parse/ParsedElementAnnotation.java | 3 + .../relaxng/parse/ParsedNameClass.java | 3 + .../relaxng/parse/ParsedPattern.java | 3 + .../relaxng/parse/ParsedPatternFuture.java | 5 + .../relaxng/parse/SchemaBuilder.java | 53 + .../thaiopensource/relaxng/parse/Scope.java | 6 + .../relaxng/parse/SubParser.java | 8 + .../parse/compact/CompactParseable.java | 89 + .../relaxng/parse/compact/CompactSyntax.java | 3554 ++++++++++ .../relaxng/parse/compact/CompactSyntax.jj | 1933 ++++++ .../parse/compact/CompactSyntaxConstants.java | 100 + .../compact/CompactSyntaxTokenManager.java | 1803 +++++ .../relaxng/parse/compact/EOFException.java | 4 + .../parse/compact/EscapeSyntaxException.java | 25 + .../relaxng/parse/compact/ParseException.java | 191 + .../relaxng/parse/compact/Token.java | 81 + .../relaxng/parse/compact/TokenMgrError.java | 133 + .../compact/UCode_UCodeESC_CharStream.java | 549 ++ .../compact/resources/Messages.properties | 22 + .../relaxng/parse/sax/DtdContext.java | 50 + .../relaxng/parse/sax/SAXParseReceiver.java | 21 + .../relaxng/parse/sax/SAXParseable.java | 40 + .../relaxng/parse/sax/SAXSubParser.java | 76 + .../relaxng/parse/sax/SchemaParser.java | 1615 +++++ .../parse/sax/resources/Messages.properties | 38 + .../thaiopensource/relaxng/util/Driver.java | 154 + .../relaxng/util/ExegenDriver.java | 8 + .../relaxng/util/TestDriver.java | 153 + .../relaxng/util/ValidationEngine.java | 127 + .../util/resources/Messages.properties | 17 + .../relaxng/util/resources/Version.properties | 1 + .../com/thaiopensource/util/Equal.java | 9 + .../com/thaiopensource/util/Localizer.java | 44 + .../com/thaiopensource/util/OptionParser.java | 108 + .../com/thaiopensource/util/PropertyId.java | 29 + .../com/thaiopensource/util/PropertyMap.java | 25 + .../util/PropertyMapBuilder.java | 95 + .../com/thaiopensource/util/Service.java | 213 + .../util/SinglePropertyMap.java | 36 + .../jingsrc/com/thaiopensource/util/Uri.java | 149 + .../com/thaiopensource/util/UriOrFile.java | 80 + .../com/thaiopensource/util/Utf16.java | 24 + .../com/thaiopensource/util/Version.java | 28 + .../validate/AbstractSchema.java | 35 + .../com/thaiopensource/validate/Flag.java | 14 + .../thaiopensource/validate/FlagOption.java | 24 + .../validate/FlagPropertyId.java | 29 + .../validate/IncorrectSchemaException.java | 13 + .../com/thaiopensource/validate/Option.java | 18 + .../validate/OptionArgumentException.java | 10 + .../OptionArgumentFormatException.java | 10 + .../OptionArgumentPresenceException.java | 6 + .../com/thaiopensource/validate/Schema.java | 33 + .../thaiopensource/validate/SchemaReader.java | 34 + .../validate/SchemaReaderFactory.java | 29 + .../validate/SchemaReaderLoader.java | 35 + .../thaiopensource/validate/StringOption.java | 33 + .../validate/StringPropertyId.java | 47 + .../validate/ValidateProperty.java | 169 + .../validate/ValidationDriver.java | 221 + .../thaiopensource/validate/Validator.java | 80 + .../validate/auto/AutoSchemaReader.java | 95 + .../validate/auto/AutoSchemaReceiver.java | 96 + .../validate/auto/ReparseException.java | 16 + .../validate/auto/Rewindable.java | 7 + .../validate/auto/RewindableInputStream.java | 192 + .../validate/auto/SchemaFuture.java | 13 + ...emaReaderFactorySchemaReceiverFactory.java | 26 + ...hemaReaderLoaderSchemaReceiverFactory.java | 10 + .../auto/SchemaReaderSchemaReceiver.java | 31 + .../validate/auto/SchemaReceiver.java | 9 + .../validate/auto/SchemaReceiverFactory.java | 30 + .../validate/auto/SchemaReceiverLoader.java | 34 + .../auto/resources/Messages.properties | 2 + .../validate/mns/ContextMap.java | 59 + .../validate/mns/ElementsOrAttributes.java | 41 + .../thaiopensource/validate/mns/Hashset.java | 19 + .../mns/MnsSchemaReceiverFactory.java | 18 + .../mns/NamespaceFilteredAttributes.java | 110 + .../validate/mns/SchemaImpl.java | 464 ++ .../validate/mns/SchemaReceiverImpl.java | 92 + .../validate/mns/ValidatorImpl.java | 263 + .../mns/resources/Messages.properties | 10 + .../validate/mns/resources/mns.rng | 217 + .../thaiopensource/validate/nrl/Action.java | 21 + .../validate/nrl/ActionSet.java | 35 + .../validate/nrl/AllowAction.java | 16 + .../validate/nrl/AttachAction.java | 25 + .../validate/nrl/AttributeActionSet.java | 36 + .../validate/nrl/ContextMap.java | 137 + .../validate/nrl/ElementsOrAttributes.java | 41 + .../validate/nrl/FilteredAttributes.java | 102 + .../thaiopensource/validate/nrl/Hashset.java | 29 + .../thaiopensource/validate/nrl/IntSet.java | 75 + .../com/thaiopensource/validate/nrl/Mode.java | 144 + .../validate/nrl/ModeUsage.java | 80 + .../validate/nrl/NoResultAction.java | 16 + .../validate/nrl/NrlProperty.java | 9 + .../nrl/NrlSchemaReceiverFactory.java | 22 + .../com/thaiopensource/validate/nrl/Path.java | 151 + .../validate/nrl/RejectAction.java | 23 + .../validate/nrl/ResultAction.java | 17 + .../validate/nrl/SchemaImpl.java | 582 ++ .../validate/nrl/SchemaReceiverImpl.java | 110 + .../validate/nrl/SectionState.java | 23 + .../validate/nrl/UnwrapAction.java | 17 + .../validate/nrl/ValidateAction.java | 33 + .../validate/nrl/ValidatorImpl.java | 399 ++ .../nrl/resources/Messages.properties | 26 + .../validate/nrl/resources/nrl.rng | 237 + .../validate/rng/CompactSchemaReader.java | 24 + .../validate/rng/RngProperty.java | 45 + .../validate/rng/SAXSchemaReader.java | 24 + .../rng/SAXSchemaReceiverFactory.java | 28 + .../schematron/DraconianErrorListener.java | 23 + .../validate/schematron/OutputHandler.java | 95 + .../schematron/SaxonSchemaReaderFactory.java | 11 + .../validate/schematron/SchemaImpl.java | 21 + .../validate/schematron/SchemaReaderImpl.java | 499 ++ .../schematron/SchematronProperty.java | 55 + .../SchematronSchemaReaderFactory.java | 30 + .../validate/schematron/ValidatorImpl.java | 163 + .../validate/schematron/XMLReaderImpl.java | 82 + .../schematron/resources/Messages.properties | 11 + .../schematron/resources/schematron.rnc | 167 + .../schematron/resources/schematron.xsl | 405 ++ .../xml/sax/AbstractLexicalHandler.java | 27 + .../xml/sax/CountingErrorHandler.java | 75 + .../xml/sax/DelegatingContentHandler.java | 92 + .../xml/sax/DraconianErrorHandler.java | 25 + .../xml/sax/ErrorHandlerImpl.java | 149 + .../xml/sax/ForkContentHandler.java | 71 + .../xml/sax/ForkDTDHandler.java | 31 + .../xml/sax/Jaxp11XMLReaderCreator.java | 38 + .../xml/sax/Sax2XMLReaderCreator.java | 57 + .../xml/sax/XMLReaderCreator.java | 20 + .../xml/sax/XmlBaseHandler.java | 58 + .../xml/sax/resources/Messages.properties | 29 + .../thaiopensource/xml/util/EncodingMap.java | 37 + .../com/thaiopensource/xml/util/Name.java | 35 + .../com/thaiopensource/xml/util/Naming.java | 181 + .../xml/util/StringSplitter.java | 42 + .../xml/util/WellKnownNamespaces.java | 16 + .../org/relaxng/datatype/Datatype.java | 237 + .../org/relaxng/datatype/DatatypeBuilder.java | 45 + .../relaxng/datatype/DatatypeException.java | 39 + .../org/relaxng/datatype/DatatypeLibrary.java | 37 + .../datatype/DatatypeLibraryFactory.java | 26 + .../datatype/DatatypeStreamingValidator.java | 46 + .../relaxng/datatype/ValidationContext.java | 66 + .../helpers/DatatypeLibraryLoader.java | 267 + .../helpers/ParameterlessDatatypeBuilder.java | 42 + .../helpers/StreamingValidatorImpl.java | 55 + .../com/adobe/epubcheck/api/EpubCheck.java | 158 + .../src/com/adobe/epubcheck/api/Report.java | 60 + .../adobe/epubcheck/autotest/AutoTest.java | 93 + .../autotest/AutoTestContentHandler.java | 234 + .../com/adobe/epubcheck/autotest/Result.java | 65 + .../adobe/epubcheck/bitmap/BitmapChecker.java | 84 + .../bitmap/BitmapCheckerFactory.java | 43 + .../adobe/epubcheck/dtbook/DTBookChecker.java | 65 + .../dtbook/DTBookCheckerFactory.java | 45 + .../adobe/epubcheck/dtbook/DTBookHandler.java | 100 + .../com/adobe/epubcheck/dtd/dtbook-2005-2.dtd | 2824 ++++++++ .../com/adobe/epubcheck/dtd/ncx-2005-1.dtd | 269 + .../src/com/adobe/epubcheck/dtd/oeb12.dtdinc | 1136 ++++ .../src/com/adobe/epubcheck/dtd/opf20.dtd | 296 + .../src/com/adobe/epubcheck/dtd/svg11.dtd | 5790 +++++++++++++++++ .../com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc | 196 + .../adobe/epubcheck/dtd/xhtml-special.dtdinc | 80 + .../adobe/epubcheck/dtd/xhtml-symbol.dtdinc | 237 + .../com/adobe/epubcheck/dtd/xhtml1-strict.dtd | 979 +++ .../epubcheck/dtd/xhtml1-transitional.dtd | 1200 ++++ .../com/adobe/epubcheck/ncx/NCXChecker.java | 83 + .../epubcheck/ncx/NCXCheckerFactory.java | 45 + .../com/adobe/epubcheck/ncx/NCXHandler.java | 74 + .../adobe/epubcheck/ocf/EncryptionFilter.java | 10 + .../epubcheck/ocf/EncryptionHandler.java | 96 + .../epubcheck/ocf/IDPFFontManglingFilter.java | 22 + .../com/adobe/epubcheck/ocf/OCFChecker.java | 124 + .../com/adobe/epubcheck/ocf/OCFHandler.java | 68 + .../com/adobe/epubcheck/ocf/OCFPackage.java | 55 + .../ocf/UnsupportedEncryptionFilter.java | 15 + .../adobe/epubcheck/opf/ContentChecker.java | 28 + .../epubcheck/opf/ContentCheckerFactory.java | 32 + .../epubcheck/opf/GenericContentChecker.java | 49 + .../opf/GenericContentCheckerFactory.java | 41 + .../com/adobe/epubcheck/opf/OPFChecker.java | 297 + .../com/adobe/epubcheck/opf/OPFHandler.java | 357 + .../src/com/adobe/epubcheck/opf/OPFItem.java | 99 + .../com/adobe/epubcheck/opf/XRefChecker.java | 317 + .../com/adobe/epubcheck/ops/OPSChecker.java | 72 + .../epubcheck/ops/OPSCheckerFactory.java | 44 + .../com/adobe/epubcheck/ops/OPSHandler.java | 234 + .../adobe/epubcheck/ops/registeredSchemas.txt | 74 + .../src/com/adobe/epubcheck/rng/container.rng | 24 + .../com/adobe/epubcheck/rng/content-svg.rng | 13 + .../com/adobe/epubcheck/rng/content-xhtml.rng | 13 + .../src/com/adobe/epubcheck/rng/content.rng | 89 + .../com/adobe/epubcheck/rng/dtbook-2005-2.rng | 4110 ++++++++++++ .../com/adobe/epubcheck/rng/encryption.rng | 20 + .../src/com/adobe/epubcheck/rng/ncx-old.rng | 253 + .../src/com/adobe/epubcheck/rng/ncx.rng | 295 + .../src/com/adobe/epubcheck/rng/opf.rng | 15 + .../src/com/adobe/epubcheck/rng/opf12.rng | 386 ++ .../src/com/adobe/epubcheck/rng/opf20.rng | 499 ++ .../adobe/epubcheck/rng/ops/ops-switch.rng | 51 + .../src/com/adobe/epubcheck/rng/ops20.nrl | 70 + .../src/com/adobe/epubcheck/rng/ops20.rng | 16 + .../com/adobe/epubcheck/rng/signatures.rng | 15 + .../adobe/epubcheck/rng/svg/svg-animation.rng | 412 ++ .../rng/svg/svg-animevents-attrib.rng | 61 + .../epubcheck/rng/svg/svg-basic-clip.rng | 129 + .../epubcheck/rng/svg/svg-basic-filter.rng | 870 +++ .../epubcheck/rng/svg/svg-basic-font.rng | 544 ++ .../rng/svg/svg-basic-graphics-attrib.rng | 74 + .../epubcheck/rng/svg/svg-basic-structure.rng | 666 ++ .../epubcheck/rng/svg/svg-basic-text.rng | 273 + .../com/adobe/epubcheck/rng/svg/svg-clip.rng | 37 + .../epubcheck/rng/svg/svg-conditional.rng | 124 + .../rng/svg/svg-container-attrib.rng | 49 + .../epubcheck/rng/svg/svg-core-attrib.rng | 73 + .../adobe/epubcheck/rng/svg/svg-cursor.rng | 99 + .../adobe/epubcheck/rng/svg/svg-datatypes.rng | 188 + .../rng/svg/svg-docevents-attrib.rng | 87 + .../epubcheck/rng/svg/svg-extensibility.rng | 125 + .../rng/svg/svg-extresources-attrib.rng | 42 + .../adobe/epubcheck/rng/svg/svg-filter.rng | 512 ++ .../com/adobe/epubcheck/rng/svg/svg-font.rng | 146 + .../adobe/epubcheck/rng/svg/svg-gradient.rng | 259 + .../rng/svg/svg-graphevents-attrib.rng | 124 + .../epubcheck/rng/svg/svg-graphics-attrib.rng | 95 + .../adobe/epubcheck/rng/svg/svg-hyperlink.rng | 106 + .../com/adobe/epubcheck/rng/svg/svg-image.rng | 104 + .../adobe/epubcheck/rng/svg/svg-marker.rng | 161 + .../com/adobe/epubcheck/rng/svg/svg-mask.rng | 148 + .../epubcheck/rng/svg/svg-opacity-attrib.rng | 60 + .../epubcheck/rng/svg/svg-paint-attrib.rng | 207 + .../adobe/epubcheck/rng/svg/svg-pattern.rng | 138 + .../adobe/epubcheck/rng/svg/svg-profile.rng | 92 + .../com/adobe/epubcheck/rng/svg/svg-qname.rng | 98 + .../adobe/epubcheck/rng/svg/svg-script.rng | 64 + .../com/adobe/epubcheck/rng/svg/svg-shape.rng | 433 ++ .../adobe/epubcheck/rng/svg/svg-structure.rng | 92 + .../com/adobe/epubcheck/rng/svg/svg-style.rng | 121 + .../com/adobe/epubcheck/rng/svg/svg-text.rng | 627 ++ .../com/adobe/epubcheck/rng/svg/svg-view.rng | 83 + .../epubcheck/rng/svg/svg-viewport-attrib.rng | 64 + .../epubcheck/rng/svg/svg-xlink-attrib.rng | 194 + .../src/com/adobe/epubcheck/rng/svg11.rng | 231 + .../com/adobe/epubcheck/rng/xenc-schema.rng | 223 + .../com/adobe/epubcheck/rng/xhtml/applet.rng | 47 + .../com/adobe/epubcheck/rng/xhtml/attribs.rng | 61 + .../com/adobe/epubcheck/rng/xhtml/base.rng | 23 + .../adobe/epubcheck/rng/xhtml/basic-form.rng | 200 + .../adobe/epubcheck/rng/xhtml/basic-table.rng | 146 + .../src/com/adobe/epubcheck/rng/xhtml/bdo.rng | 37 + .../com/adobe/epubcheck/rng/xhtml/csismap.rng | 102 + .../adobe/epubcheck/rng/xhtml/datatypes.rng | 120 + .../com/adobe/epubcheck/rng/xhtml/edit.rng | 55 + .../com/adobe/epubcheck/rng/xhtml/events.rng | 208 + .../com/adobe/epubcheck/rng/xhtml/form.rng | 209 + .../com/adobe/epubcheck/rng/xhtml/frames.rng | 111 + .../adobe/epubcheck/rng/xhtml/hypertext.rng | 61 + .../com/adobe/epubcheck/rng/xhtml/iframe.rng | 67 + .../com/adobe/epubcheck/rng/xhtml/image.rng | 40 + .../adobe/epubcheck/rng/xhtml/inlstyle.rng | 11 + .../com/adobe/epubcheck/rng/xhtml/legacy.rng | 502 ++ .../com/adobe/epubcheck/rng/xhtml/link.rng | 56 + .../com/adobe/epubcheck/rng/xhtml/list.rng | 92 + .../com/adobe/epubcheck/rng/xhtml/meta.rng | 37 + .../adobe/epubcheck/rng/xhtml/nameident.rng | 39 + .../com/adobe/epubcheck/rng/xhtml/object.rng | 82 + .../com/adobe/epubcheck/rng/xhtml/param.rng | 33 + .../com/adobe/epubcheck/rng/xhtml/pres.rng | 107 + .../com/adobe/epubcheck/rng/xhtml/ruby.rng | 102 + .../com/adobe/epubcheck/rng/xhtml/script.rng | 70 + .../com/adobe/epubcheck/rng/xhtml/ssismap.rng | 14 + .../com/adobe/epubcheck/rng/xhtml/struct.rng | 78 + .../com/adobe/epubcheck/rng/xhtml/style.rng | 36 + .../com/adobe/epubcheck/rng/xhtml/table.rng | 257 + .../com/adobe/epubcheck/rng/xhtml/target.rng | 31 + .../com/adobe/epubcheck/rng/xhtml/text.rng | 338 + .../epubcheck/rng/xmldsig-core-schema.rng | 341 + .../src/com/adobe/epubcheck/sch/ncx.sch | 81 + .../src/com/adobe/epubcheck/sch/opf.sch | 15 + .../src/com/adobe/epubcheck/tool/Checker.java | 119 + .../com/adobe/epubcheck/util/CheckUtil.java | 46 + .../epubcheck/util/DefaultReportImpl.java | 43 + .../com/adobe/epubcheck/util/PathUtil.java | 82 + .../adobe/epubcheck/util/ResourceUtil.java | 43 + .../epubcheck/util/WriterReportImpl.java | 45 + .../com/adobe/epubcheck/xml/XMLAttribute.java | 37 + .../com/adobe/epubcheck/xml/XMLElement.java | 79 + .../com/adobe/epubcheck/xml/XMLHandler.java | 33 + .../src/com/adobe/epubcheck/xml/XMLNode.java | 49 + .../com/adobe/epubcheck/xml/XMLParser.java | 578 ++ .../com/adobe/epubcheck/xml/XMLValidator.java | 138 + thirdparty/epubcheck/testdocs/autotest.sh | 1 + .../testdocs/general/OPFIllegalElement.epub | Bin 0 -> 4321 bytes .../general/OPFIllegalElement_UniqueID.epub | Bin 0 -> 4329 bytes .../epubcheck/testdocs/general/PageMap.epub | Bin 0 -> 4565 bytes .../epubcheck/testdocs/general/Test.epub | Bin 0 -> 4322 bytes .../testdocs/general/UniqueIDNotUsed.epub | Bin 0 -> 4322 bytes .../epubcheck/testdocs/general/tests.xml | 35 + .../epubcheck/testdocs/issues/Issue21.epub | Bin 0 -> 4316 bytes .../epubcheck/testdocs/issues/Issue25.epub | Bin 0 -> 259264 bytes .../epubcheck/testdocs/issues/issues.xml | 19 + Skripten/tralics => thirdparty/tralics-2.14.4 | Bin thirdparty/tralics-2.15.2/COPYING | 57 + thirdparty/tralics-2.15.2/ChangeLog | 337 + thirdparty/tralics-2.15.2/Copyright | 75 + thirdparty/tralics-2.15.2/LISEZMOI | 142 + .../tralics-2.15.2/Licence_CeCILL_V2-en.txt | 505 ++ .../tralics-2.15.2/Licence_CeCILL_V2-fr.txt | 512 ++ thirdparty/tralics-2.15.2/Modele/amsldoc.xml | 2357 +++++++ .../tralics-2.15.2/Modele/beauvilams2.xml | 505 ++ thirdparty/tralics-2.15.2/Modele/bo.xml | 64 + thirdparty/tralics-2.15.2/Modele/comp_pi.xml | 5 + .../tralics-2.15.2/Modele/ex_emple2008.xml | 233 + .../tralics-2.15.2/Modele/exemple2003.xml | 407 ++ .../tralics-2.15.2/Modele/exemple2005.xml | 496 ++ .../tralics-2.15.2/Modele/exemple2006.xml | 481 ++ .../tralics-2.15.2/Modele/exemple2007.xml | 233 + .../tralics-2.15.2/Modele/exemple2008.xml | 225 + .../tralics-2.15.2/Modele/exemple2009.xml | 236 + .../tralics-2.15.2/Modele/exemple2011.xml | 513 ++ .../tralics-2.15.2/Modele/exemple2013.xml | 513 ++ .../tralics-2.15.2/Modele/exempleb2011.xml | 364 ++ thirdparty/tralics-2.15.2/Modele/fptest.xml | 958 +++ thirdparty/tralics-2.15.2/Modele/hello.xml | 6 + .../tralics-2.15.2/Modele/hello1-no.xml | 7 + thirdparty/tralics-2.15.2/Modele/hello1.xml | 7 + thirdparty/tralics-2.15.2/Modele/hello2.xml | 7 + thirdparty/tralics-2.15.2/Modele/hello3.xml | 11 + thirdparty/tralics-2.15.2/Modele/testb.xml | 21 + thirdparty/tralics-2.15.2/Modele/testb0.xml | 718 ++ thirdparty/tralics-2.15.2/Modele/testb1.xml | 854 +++ thirdparty/tralics-2.15.2/Modele/testbe.xml | 116 + .../tralics-2.15.2/Modele/testclass.xml | 23 + thirdparty/tralics-2.15.2/Modele/testerr.xml | 315 + thirdparty/tralics-2.15.2/Modele/testhtml.xml | 208 + .../tralics-2.15.2/Modele/testkeyval.xml | 129 + thirdparty/tralics-2.15.2/Modele/testm1a.xml | 10 + thirdparty/tralics-2.15.2/Modele/testm1b.xml | 12 + thirdparty/tralics-2.15.2/Modele/testm1c.xml | 12 + thirdparty/tralics-2.15.2/Modele/testmath.xml | 4873 ++++++++++++++ thirdparty/tralics-2.15.2/Modele/testpack.xml | 134 + .../tralics-2.15.2/Modele/testpackii.xml | 33 + thirdparty/tralics-2.15.2/Modele/teststr.xml | 172 + thirdparty/tralics-2.15.2/Modele/tormath.xml | 523 ++ thirdparty/tralics-2.15.2/Modele/tormath1.xml | 293 + thirdparty/tralics-2.15.2/Modele/tormath2.xml | 523 ++ thirdparty/tralics-2.15.2/Modele/tormath3.xml | 523 ++ thirdparty/tralics-2.15.2/Modele/torture.xml | 1443 ++++ thirdparty/tralics-2.15.2/Modele/tpa.xml | 45 + thirdparty/tralics-2.15.2/Modele/tpa2.xml | 252 + thirdparty/tralics-2.15.2/Modele/tpa2x.xml | 265 + thirdparty/tralics-2.15.2/Modele/txerr.xml | 9 + thirdparty/tralics-2.15.2/Modele/txtc.xml | 209 + thirdparty/tralics-2.15.2/Modele/txtd.xml | 19 + thirdparty/tralics-2.15.2/Modele/xii.xml | 440 ++ thirdparty/tralics-2.15.2/README | 56 + thirdparty/tralics-2.15.2/Test/README | 34 + thirdparty/tralics-2.15.2/Test/alltests | 189 + thirdparty/tralics-2.15.2/Test/amsldoc.tex | 2691 ++++++++ .../tralics-2.15.2/Test/beauvilams2.tex | 554 ++ thirdparty/tralics-2.15.2/Test/beauville.bib | 172 + thirdparty/tralics-2.15.2/Test/bi.bib | 21 + thirdparty/tralics-2.15.2/Test/bo.bib | 35 + thirdparty/tralics-2.15.2/Test/bo.tex | 47 + thirdparty/tralics-2.15.2/Test/comp_pi.tex | 335 + thirdparty/tralics-2.15.2/Test/dummy.txt | 3 + .../tralics-2.15.2/Test/ex_emple2008.tex | 350 + .../tralics-2.15.2/Test/exemple2003.tex | 575 ++ .../tralics-2.15.2/Test/exemple2005.tex | 727 +++ .../tralics-2.15.2/Test/exemple2006.tex | 693 ++ .../tralics-2.15.2/Test/exemple2007.tex | 343 + .../tralics-2.15.2/Test/exemple2008.tex | 332 + .../tralics-2.15.2/Test/exemple2009.tex | 345 + .../tralics-2.15.2/Test/exemple2011.tex | 788 +++ .../tralics-2.15.2/Test/exemple2013.tex | 789 +++ .../tralics-2.15.2/Test/exempleb2011.tex | 570 ++ thirdparty/tralics-2.15.2/Test/fptest.tex | 1716 +++++ thirdparty/tralics-2.15.2/Test/hello.tex | 1 + thirdparty/tralics-2.15.2/Test/hello1.tex | 4 + thirdparty/tralics-2.15.2/Test/hello2.tex | 8 + thirdparty/tralics-2.15.2/Test/hello2003.tex | 3 + thirdparty/tralics-2.15.2/Test/hello2004.tex | 3 + thirdparty/tralics-2.15.2/Test/hello2006.tex | 3 + thirdparty/tralics-2.15.2/Test/hello3.tex | 9 + thirdparty/tralics-2.15.2/Test/lxdoc.tex | 1252 ++++ thirdparty/tralics-2.15.2/Test/mathmlc.tex | 709 ++ thirdparty/tralics-2.15.2/Test/taux1.tex | 5 + thirdparty/tralics-2.15.2/Test/taux2.tex | 9 + thirdparty/tralics-2.15.2/Test/testb.tex | 17 + thirdparty/tralics-2.15.2/Test/testb1.tex | 9 + thirdparty/tralics-2.15.2/Test/testbe.tex | 189 + thirdparty/tralics-2.15.2/Test/testclass.tex | 42 + thirdparty/tralics-2.15.2/Test/testerr.tex | 575 ++ thirdparty/tralics-2.15.2/Test/testhtml.tex | 530 ++ thirdparty/tralics-2.15.2/Test/testkeyval.tex | 703 ++ thirdparty/tralics-2.15.2/Test/testm1.tex | 15 + thirdparty/tralics-2.15.2/Test/testmath.tex | 5755 ++++++++++++++++ thirdparty/tralics-2.15.2/Test/testmath.ult | 27 + thirdparty/tralics-2.15.2/Test/testpack.tex | 408 ++ thirdparty/tralics-2.15.2/Test/testpackii.tex | 80 + thirdparty/tralics-2.15.2/Test/teststr.tex | 304 + thirdparty/tralics-2.15.2/Test/tormath.tex | 859 +++ thirdparty/tralics-2.15.2/Test/tormath1.tex | 8 + thirdparty/tralics-2.15.2/Test/tormath2.tex | 6 + thirdparty/tralics-2.15.2/Test/tormath3.tex | 6 + thirdparty/tralics-2.15.2/Test/torture.bib | 1284 ++++ thirdparty/tralics-2.15.2/Test/torture.tex | 3788 +++++++++++ thirdparty/tralics-2.15.2/Test/tortureaux.tex | 6 + thirdparty/tralics-2.15.2/Test/tpa.tex | 38 + thirdparty/tralics-2.15.2/Test/tpa2.tex | 349 + thirdparty/tralics-2.15.2/Test/tptest.tex | 29 + .../tralics-2.15.2/Test/tralics-ex1.tex | 6 + .../tralics-2.15.2/Test/tralics-ex2.tex | 14 + thirdparty/tralics-2.15.2/Test/tralics.bib | 341 + thirdparty/tralics-2.15.2/Test/tralics.sty | 14 + thirdparty/tralics-2.15.2/Test/txerr.tex | 14 + thirdparty/tralics-2.15.2/Test/txtc.tex | 338 + thirdparty/tralics-2.15.2/Test/txtd.tex | 24 + thirdparty/tralics-2.15.2/Test/xhello.tex | 3 + thirdparty/tralics-2.15.2/Test/xii.tex | 13 + thirdparty/tralics-2.15.2/confdir/.tralics_rc | 26 + thirdparty/tralics-2.15.2/confdir/COPYING | 42 + thirdparty/tralics-2.15.2/confdir/README | 42 + thirdparty/tralics-2.15.2/confdir/RR.plt | 70 + thirdparty/tralics-2.15.2/confdir/RR.tcf | 54 + .../tralics-2.15.2/confdir/abstract.plt | 46 + thirdparty/tralics-2.15.2/confdir/ae.plt | 14 + thirdparty/tralics-2.15.2/confdir/aecompl.plt | 14 + thirdparty/tralics-2.15.2/confdir/aeguill.plt | 19 + thirdparty/tralics-2.15.2/confdir/alltt.plt | 21 + thirdparty/tralics-2.15.2/confdir/amsart.clt | 279 + thirdparty/tralics-2.15.2/confdir/amsbsy.plt | 8 + thirdparty/tralics-2.15.2/confdir/amscd.plt | 61 + .../tralics-2.15.2/confdir/amsfonts.plt | 7 + thirdparty/tralics-2.15.2/confdir/amsgen.plt | 10 + thirdparty/tralics-2.15.2/confdir/amsmath.plt | 296 + thirdparty/tralics-2.15.2/confdir/amsmidx.plt | 19 + thirdparty/tralics-2.15.2/confdir/amsopn.plt | 51 + thirdparty/tralics-2.15.2/confdir/amssymb.plt | 9 + thirdparty/tralics-2.15.2/confdir/amstext.plt | 7 + thirdparty/tralics-2.15.2/confdir/amsthm.plt | 5 + thirdparty/tralics-2.15.2/confdir/amsxtra.plt | 25 + thirdparty/tralics-2.15.2/confdir/article.clt | 34 + thirdparty/tralics-2.15.2/confdir/bbding.plt | 138 + thirdparty/tralics-2.15.2/confdir/book.clt | 46 + thirdparty/tralics-2.15.2/confdir/braket.plt | 48 + thirdparty/tralics-2.15.2/confdir/calc.plt | 7 + thirdparty/tralics-2.15.2/confdir/cedram.tcf | 78 + .../tralics-2.15.2/confdir/cgloss4e.plt | 28 + .../tralics-2.15.2/confdir/checkend.plt | 12 + thirdparty/tralics-2.15.2/confdir/color.plt | 132 + thirdparty/tralics-2.15.2/confdir/comma.plt | 54 + .../tralics-2.15.2/confdir/config_empty | 6 + .../tralics-2.15.2/confdir/coollist.plt | 53 + thirdparty/tralics-2.15.2/confdir/coolstr.plt | 290 + thirdparty/tralics-2.15.2/confdir/curves.plt | 41 + .../tralics-2.15.2/confdir/datenumber.plt | 208 + thirdparty/tralics-2.15.2/confdir/decimal.plt | 21 + .../tralics-2.15.2/confdir/delarray.plt | 11 + .../tralics-2.15.2/confdir/epigraph.plt | 49 + thirdparty/tralics-2.15.2/confdir/esdiff.plt | 146 + thirdparty/tralics-2.15.2/confdir/etex.plt | 215 + thirdparty/tralics-2.15.2/confdir/eucal.plt | 12 + thirdparty/tralics-2.15.2/confdir/eufrak.plt | 9 + thirdparty/tralics-2.15.2/confdir/eurotex.tcf | 20 + .../tralics-2.15.2/confdir/fancybox.plt | 851 +++ .../tralics-2.15.2/confdir/fancyhdr.plt | 21 + .../tralics-2.15.2/confdir/fancyvrb.plt | 31 + thirdparty/tralics-2.15.2/confdir/fix-cm.plt | 11 + thirdparty/tralics-2.15.2/confdir/fixfoot.plt | 34 + .../tralics-2.15.2/confdir/fixltx2e.plt | 26 + thirdparty/tralics-2.15.2/confdir/fixme.plt | 96 + thirdparty/tralics-2.15.2/confdir/flafter.plt | 9 + thirdparty/tralics-2.15.2/confdir/float.plt | 91 + thirdparty/tralics-2.15.2/confdir/fontenc.plt | 12 + thirdparty/tralics-2.15.2/confdir/forloop.plt | 37 + thirdparty/tralics-2.15.2/confdir/fp.plt | 14 + thirdparty/tralics-2.15.2/confdir/gb4e.plt | 76 + thirdparty/tralics-2.15.2/confdir/gescap.tcf | 156 + .../tralics-2.15.2/confdir/graphics.plt | 64 + .../tralics-2.15.2/confdir/graphicx.plt | 29 + .../tralics-2.15.2/confdir/graphpap.plt | 9 + thirdparty/tralics-2.15.2/confdir/hello.tcf | 17 + thirdparty/tralics-2.15.2/confdir/hello1.tcf | 174 + thirdparty/tralics-2.15.2/confdir/hello3.tcf | 31 + thirdparty/tralics-2.15.2/confdir/html.plt | 190 + .../tralics-2.15.2/confdir/hyperref.plt | 4 + thirdparty/tralics-2.15.2/confdir/ifpdf.plt | 11 + thirdparty/tralics-2.15.2/confdir/ifthen.plt | 23 + thirdparty/tralics-2.15.2/confdir/index.plt | 20 + .../tralics-2.15.2/confdir/inputenc.plt | 481 ++ thirdparty/tralics-2.15.2/confdir/keyval.plt | 50 + .../tralics-2.15.2/confdir/kvoptions.plt | 149 + thirdparty/tralics-2.15.2/confdir/latex.plt | 190 + .../tralics-2.15.2/confdir/latexsym.plt | 20 + thirdparty/tralics-2.15.2/confdir/lipsum.plt | 1691 +++++ .../tralics-2.15.2/confdir/listings.plt | 70 + thirdparty/tralics-2.15.2/confdir/makeidx.plt | 12 + thirdparty/tralics-2.15.2/confdir/maple2e.plt | 32 + .../tralics-2.15.2/confdir/mapleenv.plt | 328 + .../tralics-2.15.2/confdir/mapleplots.plt | 152 + .../tralics-2.15.2/confdir/maplestyle.plt | 146 + .../tralics-2.15.2/confdir/mapletab.plt | 183 + .../tralics-2.15.2/confdir/mapleutil.plt | 251 + thirdparty/tralics-2.15.2/confdir/minimal.clt | 9 + thirdparty/tralics-2.15.2/confdir/mml.plt | 304 + thirdparty/tralics-2.15.2/confdir/mml.sty | 304 + thirdparty/tralics-2.15.2/confdir/natbib.plt | 279 + .../tralics-2.15.2/confdir/newlfont.plt | 27 + .../tralics-2.15.2/confdir/nopageno.plt | 13 + .../tralics-2.15.2/confdir/oldlfont.plt | 8 + .../tralics-2.15.2/confdir/overword.plt | 143 + thirdparty/tralics-2.15.2/confdir/ra.plt | 451 ++ thirdparty/tralics-2.15.2/confdir/ra.tcf | 46 + thirdparty/tralics-2.15.2/confdir/ra2003.clt | 35 + thirdparty/tralics-2.15.2/confdir/ra2004.clt | 34 + thirdparty/tralics-2.15.2/confdir/ra2005.clt | 35 + thirdparty/tralics-2.15.2/confdir/ra2006.clt | 42 + thirdparty/tralics-2.15.2/confdir/ra2007.clt | 33 + thirdparty/tralics-2.15.2/confdir/ra2007.tcf | 46 + thirdparty/tralics-2.15.2/confdir/ra2008.clt | 29 + thirdparty/tralics-2.15.2/confdir/ra2008.tcf | 47 + thirdparty/tralics-2.15.2/confdir/ra2009.clt | 29 + thirdparty/tralics-2.15.2/confdir/ra2009.tcf | 50 + thirdparty/tralics-2.15.2/confdir/ra2011.clt | 29 + thirdparty/tralics-2.15.2/confdir/ra2011.tcf | 50 + thirdparty/tralics-2.15.2/confdir/ra2013.clt | 29 + thirdparty/tralics-2.15.2/confdir/ra2013.tcf | 48 + thirdparty/tralics-2.15.2/confdir/rabib.tcf | 24 + .../tralics-2.15.2/confdir/remreset.plt | 17 + thirdparty/tralics-2.15.2/confdir/report.clt | 38 + .../tralics-2.15.2/confdir/shortvrb.plt | 11 + thirdparty/tralics-2.15.2/confdir/showidx.plt | 17 + thirdparty/tralics-2.15.2/confdir/soul.plt | 12 + thirdparty/tralics-2.15.2/confdir/std.clt | 91 + .../tralics-2.15.2/confdir/subfigure.plt | 17 + thirdparty/tralics-2.15.2/confdir/suffix.plt | 66 + .../tralics-2.15.2/confdir/syntonly.plt | 8 + thirdparty/tralics-2.15.2/confdir/test.tcf | 312 + thirdparty/tralics-2.15.2/confdir/test0.tcf | 18 + thirdparty/tralics-2.15.2/confdir/testa.tcf | 14 + .../tralics-2.15.2/confdir/textcase.plt | 27 + .../tralics-2.15.2/confdir/textcomp.plt | 28 + thirdparty/tralics-2.15.2/confdir/tipa.plt | 406 ++ thirdparty/tralics-2.15.2/confdir/tipx.plt | 94 + .../tralics-2.15.2/confdir/titlepage.plt | 20 + thirdparty/tralics-2.15.2/confdir/tloop.plt | 42 + thirdparty/tralics-2.15.2/confdir/torture.tcf | 69 + thirdparty/tralics-2.15.2/confdir/tp.tcf | 51 + thirdparty/tralics-2.15.2/confdir/tpa.tcf | 52 + .../tralics-2.15.2/confdir/tracefnt.plt | 19 + .../tralics-2.15.2/confdir/tralics-iso.plt | 2188 +++++++ thirdparty/tralics-2.15.2/confdir/tralics_rc | 26 + thirdparty/tralics-2.15.2/confdir/unused.tcf | 40 + thirdparty/tralics-2.15.2/confdir/upref.plt | 5 + thirdparty/tralics-2.15.2/confdir/xkeyval.plt | 30 + thirdparty/tralics-2.15.2/mktar | 139 + thirdparty/tralics-2.15.2/src/Copyright | 75 + thirdparty/tralics-2.15.2/src/Makefile | 71 + thirdparty/tralics-2.15.2/src/README | 31 + thirdparty/tralics-2.15.2/src/readline.C | 1097 ++++ thirdparty/tralics-2.15.2/src/readline.o | Bin 0 -> 36628 bytes thirdparty/tralics-2.15.2/src/tralics | Bin 0 -> 1696232 bytes thirdparty/tralics-2.15.2/src/tralics.C | 2072 ++++++ thirdparty/tralics-2.15.2/src/tralics.h | 62 + thirdparty/tralics-2.15.2/src/tralics.o | Bin 0 -> 149512 bytes thirdparty/tralics-2.15.2/src/txaccent.C | 1104 ++++ thirdparty/tralics-2.15.2/src/txaccent.o | Bin 0 -> 34780 bytes thirdparty/tralics-2.15.2/src/txarray.C | 652 ++ thirdparty/tralics-2.15.2/src/txarray.h | 61 + thirdparty/tralics-2.15.2/src/txarray.o | Bin 0 -> 34364 bytes thirdparty/tralics-2.15.2/src/txatt.C | 283 + thirdparty/tralics-2.15.2/src/txatt.h | 62 + thirdparty/tralics-2.15.2/src/txatt.o | Bin 0 -> 14668 bytes thirdparty/tralics-2.15.2/src/txaux.C | 636 ++ thirdparty/tralics-2.15.2/src/txaux.o | Bin 0 -> 19876 bytes thirdparty/tralics-2.15.2/src/txbib.C | 3036 +++++++++ thirdparty/tralics-2.15.2/src/txbib.h | 408 ++ thirdparty/tralics-2.15.2/src/txbib.o | Bin 0 -> 179448 bytes thirdparty/tralics-2.15.2/src/txbuffer.C | 1459 +++++ thirdparty/tralics-2.15.2/src/txbuffer.h | 308 + thirdparty/tralics-2.15.2/src/txbuffer.o | Bin 0 -> 79052 bytes thirdparty/tralics-2.15.2/src/txchars.h | 71 + thirdparty/tralics-2.15.2/src/txclasses.C | 1329 ++++ thirdparty/tralics-2.15.2/src/txclasses.h | 112 + thirdparty/tralics-2.15.2/src/txclasses.o | Bin 0 -> 108168 bytes thirdparty/tralics-2.15.2/src/txcmd.h | 629 ++ thirdparty/tralics-2.15.2/src/txcommands.C | 1684 +++++ thirdparty/tralics-2.15.2/src/txcommands.o | Bin 0 -> 54172 bytes thirdparty/tralics-2.15.2/src/txcond.h | 51 + thirdparty/tralics-2.15.2/src/txconfig.C | 554 ++ thirdparty/tralics-2.15.2/src/txconfig.o | Bin 0 -> 47372 bytes thirdparty/tralics-2.15.2/src/txconst.h | 60 + thirdparty/tralics-2.15.2/src/txeqtb.h | 358 + thirdparty/tralics-2.15.2/src/txerr.C | 570 ++ thirdparty/tralics-2.15.2/src/txerr.o | Bin 0 -> 41120 bytes thirdparty/tralics-2.15.2/src/txfonts.C | 392 ++ thirdparty/tralics-2.15.2/src/txfonts.h | 119 + thirdparty/tralics-2.15.2/src/txfonts.o | Bin 0 -> 18692 bytes thirdparty/tralics-2.15.2/src/txfp.C | 3191 +++++++++ thirdparty/tralics-2.15.2/src/txfp.h | 82 + thirdparty/tralics-2.15.2/src/txfp.o | Bin 0 -> 181568 bytes thirdparty/tralics-2.15.2/src/txhash.h | 194 + thirdparty/tralics-2.15.2/src/txid.h | 34 + thirdparty/tralics-2.15.2/src/tximage.h | 25 + thirdparty/tralics-2.15.2/src/txinline.h | 130 + thirdparty/tralics-2.15.2/src/txio.C | 1363 ++++ thirdparty/tralics-2.15.2/src/txio.h | 202 + thirdparty/tralics-2.15.2/src/txio.o | Bin 0 -> 85996 bytes thirdparty/tralics-2.15.2/src/txlogger.h | 130 + thirdparty/tralics-2.15.2/src/txmain.C | 1342 ++++ thirdparty/tralics-2.15.2/src/txmain.o | Bin 0 -> 121604 bytes thirdparty/tralics-2.15.2/src/txmath.C | 3131 +++++++++ thirdparty/tralics-2.15.2/src/txmath.h | 507 ++ thirdparty/tralics-2.15.2/src/txmath.o | Bin 0 -> 165832 bytes thirdparty/tralics-2.15.2/src/txmath1.C | 1913 ++++++ thirdparty/tralics-2.15.2/src/txmath1.h | 109 + thirdparty/tralics-2.15.2/src/txmath1.o | Bin 0 -> 83840 bytes thirdparty/tralics-2.15.2/src/txmathboot.C | 2280 +++++++ thirdparty/tralics-2.15.2/src/txmathboot.o | Bin 0 -> 205404 bytes thirdparty/tralics-2.15.2/src/txmlio.C | 767 +++ thirdparty/tralics-2.15.2/src/txmlio.h | 82 + thirdparty/tralics-2.15.2/src/txmlio.o | Bin 0 -> 48692 bytes thirdparty/tralics-2.15.2/src/txparam.h | 289 + thirdparty/tralics-2.15.2/src/txparser.C | 4141 ++++++++++++ thirdparty/tralics-2.15.2/src/txparser.h | 984 +++ thirdparty/tralics-2.15.2/src/txparser.o | Bin 0 -> 233904 bytes thirdparty/tralics-2.15.2/src/txparser2.C | 2400 +++++++ thirdparty/tralics-2.15.2/src/txparser2.h | 88 + thirdparty/tralics-2.15.2/src/txparser2.o | Bin 0 -> 170756 bytes thirdparty/tralics-2.15.2/src/txparser3.C | 926 +++ thirdparty/tralics-2.15.2/src/txparser3.o | Bin 0 -> 65040 bytes thirdparty/tralics-2.15.2/src/txpath.h | 22 + thirdparty/tralics-2.15.2/src/txpost.C | 1243 ++++ thirdparty/tralics-2.15.2/src/txpost.h | 76 + thirdparty/tralics-2.15.2/src/txpost.o | Bin 0 -> 72520 bytes thirdparty/tralics-2.15.2/src/txra.C | 145 + thirdparty/tralics-2.15.2/src/txra.o | Bin 0 -> 11136 bytes thirdparty/tralics-2.15.2/src/txscaled.h | 203 + thirdparty/tralics-2.15.2/src/txscan.C | 2616 ++++++++ thirdparty/tralics-2.15.2/src/txscan.o | Bin 0 -> 135836 bytes thirdparty/tralics-2.15.2/src/txstack.C | 774 +++ thirdparty/tralics-2.15.2/src/txstack.h | 153 + thirdparty/tralics-2.15.2/src/txstack.o | Bin 0 -> 52436 bytes thirdparty/tralics-2.15.2/src/txstats.h | 74 + thirdparty/tralics-2.15.2/src/txstring.h | 82 + thirdparty/tralics-2.15.2/src/txtitlepage.C | 1097 ++++ thirdparty/tralics-2.15.2/src/txtitlepage.h | 133 + thirdparty/tralics-2.15.2/src/txtitlepage.o | Bin 0 -> 61644 bytes thirdparty/tralics-2.15.2/src/txtoken.C | 1222 ++++ thirdparty/tralics-2.15.2/src/txtoken.h | 293 + thirdparty/tralics-2.15.2/src/txtoken.o | Bin 0 -> 52452 bytes thirdparty/tralics-2.15.2/src/txtoken1.C | 2519 +++++++ thirdparty/tralics-2.15.2/src/txtoken1.o | Bin 0 -> 130376 bytes thirdparty/tralics-2.15.2/src/txtoken2.C | 1586 +++++ thirdparty/tralics-2.15.2/src/txtoken2.o | Bin 0 -> 117620 bytes thirdparty/tralics-2.15.2/src/txtokenlist.h | 150 + thirdparty/tralics-2.15.2/src/txtranslate.C | 2314 +++++++ thirdparty/tralics-2.15.2/src/txtranslate.o | Bin 0 -> 128784 bytes thirdparty/tralics-2.15.2/src/txtrees.C | 753 +++ thirdparty/tralics-2.15.2/src/txtrees.h | 84 + thirdparty/tralics-2.15.2/src/txtrees.o | Bin 0 -> 61476 bytes thirdparty/tralics-2.15.2/src/txvars.h | 607 ++ thirdparty/tralics-2.15.2/src/txxml.h | 126 + 1493 files changed, 223933 insertions(+) create mode 100644 Skripten/eoaconvert.cfg create mode 100644 TeX/publication.cfg create mode 100644 Templates/DejaVuSerif-BoldItalic.ttf create mode 100644 Templates/DejaVuSerif-Italic.ttf create mode 100644 Templates/DejaVuSerif-bold.ttf create mode 100644 Templates/DejaVuSerif.ttf create mode 100644 Templates/eoa-epub.css create mode 100644 thirdparty/epubcheck/.classpath create mode 100644 thirdparty/epubcheck/.externalToolBuilders/Jar Builder.launch create mode 100644 thirdparty/epubcheck/.project create mode 100644 thirdparty/epubcheck/.settings/org.eclipse.jdt.core.prefs create mode 100644 thirdparty/epubcheck/.settings/org.eclipse.jdt.ui.prefs create mode 100644 thirdparty/epubcheck/COPYING.txt create mode 100644 thirdparty/epubcheck/Issue28.epub create mode 100644 thirdparty/epubcheck/README.txt create mode 100644 thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine create mode 100644 thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory create mode 100644 thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory create mode 100644 thirdparty/epubcheck/bin/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader create mode 100644 thirdparty/epubcheck/bin/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck$ProxyReport.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/api/Report.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/autotest/AutoTest.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/autotest/AutoTestContentHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/autotest/Result.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/bitmap/BitmapChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/bitmap/BitmapCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/dtbook-2005-2.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/ncx-2005-1.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/oeb12.dtdinc create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/opf20.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/svg11.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-special.dtdinc create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-strict.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/EncryptionFilter.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/EncryptionHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFPackage.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/UnsupportedEncryptionFilter.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/ContentChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/ContentCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/GenericContentChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/GenericContentCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/OPFChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/OPFHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/OPFItem.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker$Anchor.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker$Reference.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker$Resource.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSChecker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSCheckerFactory.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/registeredSchemas.txt create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/container.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-svg.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-xhtml.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/dtbook-2005-2.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/encryption.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx-old.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf12.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf20.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops/ops-switch.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.nrl create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/signatures.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animation.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-font.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-text.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-clip.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-conditional.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-cursor.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-datatypes.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extensibility.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-filter.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-font.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-gradient.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-image.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-marker.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-mask.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-pattern.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-profile.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-qname.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-script.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-shape.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-structure.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-style.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-text.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-view.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg11.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xenc-schema.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/applet.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/attribs.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/base.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-form.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-table.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/bdo.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/csismap.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/datatypes.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/edit.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/events.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/form.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/frames.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/hypertext.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/iframe.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/image.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/inlstyle.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/legacy.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/link.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/list.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/meta.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/nameident.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/object.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/param.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/pres.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ruby.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/script.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ssismap.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/struct.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/style.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/table.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/target.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/text.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xmldsig-core-schema.rng create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/ncx.sch create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/opf.sch create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/tool/Checker.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/util/CheckUtil.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/util/DefaultReportImpl.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/util/PathUtil.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/util/ResourceUtil.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/util/WriterReportImpl.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLAttribute.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLElement.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLHandler.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLNode.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLParser.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$1.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ErrorHandlerImpl.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ResourceEntityResolver.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$XMLReaderCreatorImpl.class create mode 100644 thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/Datatype2.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/AnyUriDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/BinaryDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/BooleanDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/CdataDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBase.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype$CalendarFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype$DateTime.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DecimalDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DoubleDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype$Duration.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/EntityDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/FloatDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/HexBinaryDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/IdDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/IdrefDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/LengthRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ListDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxLengthRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/Measure.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NCNameDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NameDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NmtokenDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/OrderRelation.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/PrecisionRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/QNameDatatype$QName.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/QNameDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/RegexDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/RestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ScaleRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/StringDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/TokenDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/Regex.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/RegexEngine.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/NamingExceptions.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$CharClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$CharRange.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Complement.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Empty.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Property.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Range.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$SimpleCharClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$SingleChar.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Subtraction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Union.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$WideSingleChar.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen$Range.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/test/CategoryTest.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/test/TestDriver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/SchemaFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AbstractPatternFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AfterPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/Alphabet.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ApplyAfterFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AttributePattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BinaryPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BlankDataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibraryFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ChoiceNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ChoicePattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CombineSchema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CombineValidator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataExceptPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DatatypeValue.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector$Alternative.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ElementPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/EmptyPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/EndAttributesFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/EndTagDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ErrorNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ErrorPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleIdTypeMapSchema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleTransform$FeasiblePatternFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleTransform.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FindElementFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/GroupPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$Entry.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$BuildFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$ElementNameClassVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$IdTypeFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$IdTypeMapImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$PossibleConflict.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$ScopedName.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$WrappedSAXException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapSchema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IgnoreMissingAttributesFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/InterleavePattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ListPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/MixedTextDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClassVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameFormatter.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NotAllowedPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NsNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NsNameExceptNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NullNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OneOrMorePattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OverlapDetector.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/Pattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpNameClassVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpPatternVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$DumpNameClassVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$DumpPatternVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$GroupDumpPatternVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$InterleaveDumpPatternVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFuture.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternInterner.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternMemo.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternSchema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$PrefixMapping.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternVisitor.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RecoverAfterFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RefPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RestrictionViolationException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$DataPatternBuilderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$DummyDataPatternBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$GrammarImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$IncludeImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$LocatorImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$OpenIncludes.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$Override.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$RootScope.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$ValidationContextImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaPatternBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReaderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReceiverImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SimpleNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SingleDataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction$2.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$2.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$3.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$4.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$5.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StringDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StringNormalizer.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StringPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/TextOnlyFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/TextPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/TokenDatatype.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$NoteChoicesFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$RemoveChoicesFunction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValueDataDerivType.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValuePattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Annotations.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/BuildException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/CommentList.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Context.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/DataPatternBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Div.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ElementAnnotationBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Grammar.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection$Combine.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IllegalSchemaException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Include.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IncludedGrammar.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Location.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParseReceiver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Parseable.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedNameClass.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedPattern.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedPatternFuture.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/SchemaBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Scope.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/SubParser.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactParseable.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax$JJCalls.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax$LocatedString.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EOFException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/ParseException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/Token.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/TokenMgrError.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/DtdContext.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXParseReceiver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXParseable.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXSubParser.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AbstractContext.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AnyNameState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AttributeState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ChoiceState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$CommentHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ContextImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DataState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DefineState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DefinitionState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DivState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ElementState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$EmptyContentState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$EmptyState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ExternalRefState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ForeignElementHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$GrammarSectionState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$GrammarState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$GroupState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$Handler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$IncludeState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$InterleaveState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$LexicalHandlerImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ListState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$MergeGrammarState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$MixedState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassBaseState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChildState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChoiceState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassContainerState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassRef.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NotAllowedState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NsNameState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$OneOrMoreState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$OptionalState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ParamState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ParentRefState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$PatternContainerState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$PrefixMapping.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$RefState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$RootState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$SavedContext.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$SinglePatternContainerState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$Skipper.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$StartState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$State.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$TextState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ValueState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ZeroOrMoreState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/Driver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/ExegenDriver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/TestDriver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/ValidationEngine.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Version.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Equal.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Localizer.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/OptionParser$InvalidOptionException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/OptionParser$MissingArgumentException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/OptionParser.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMapBuilder$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMapBuilder$PropertyMapImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMapBuilder.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader2.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service$ProviderEnumeration.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Singleton.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Service.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/SinglePropertyMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Uri.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/UriOrFile.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Utf16.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/util/Version.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/AbstractSchema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/Flag.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/FlagOption.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/FlagPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/IncorrectSchemaException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/Option.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/OptionArgumentException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/OptionArgumentFormatException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/OptionArgumentPresenceException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/Schema.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/SchemaReader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/SchemaReaderFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/SchemaReaderLoader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/StringOption.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/StringPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$EntityResolverPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$ErrorHandlerPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$XMLReaderCreatorPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidationDriver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/Validator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$Handler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/ReparseException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/Rewindable.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/RewindableInputStream$Block.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/RewindableInputStream.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaFuture.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderFactorySchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiver.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverFactory$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverFactory$SchemaReceiverFactoryPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverLoader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ContextMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ElementsOrAttributes.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/Hashset.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/MnsSchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$ElementAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$Handler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$Mode.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$WrappedIOException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaReceiverImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ValidatorImpl$PrefixMapping.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ValidatorImpl$Subtree.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ValidatorImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/resources/mns.rng create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Action.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ActionSet.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AllowAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttachAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttributeActionSet.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ContextMap$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ContextMap$Enumerator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ContextMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ElementsOrAttributes.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/FilteredAttributes.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Hashset.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/IntSet.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Mode.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ModeUsage.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NoResultAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NrlProperty.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NrlSchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path$ParseException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/RejectAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ResultAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$Handler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$MustSupportOption.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$WrappedIOException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaReceiverImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SectionState.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/UnwrapAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidateAction.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl$PrefixMapping.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl$Program.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl$Section.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/resources/nrl.rng create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/CompactSchemaReader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty$DatatypeLibraryFactoryPropertyId.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/DraconianErrorListener.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/OutputHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ErrorFilter.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$LocationFilter.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$SAXErrorListener.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$TransformStage.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserException.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserWrapErrorHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ValidateStage.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchematronProperty$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchematronProperty$PhaseOption.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchematronProperty.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchematronSchemaReaderFactory.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/ValidatorImpl$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/ValidatorImpl$BlockingReader.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/ValidatorImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/XMLReaderImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/resources/schematron.rnc create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/resources/schematron.xsl create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/AbstractLexicalHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/CountingErrorHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DelegatingContentHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DraconianErrorHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ErrorHandlerImpl.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ForkContentHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ForkDTDHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/Sax2XMLReaderCreator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XMLReaderCreator.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$1.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$Entry.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/resources/Messages.properties create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/util/EncodingMap.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/util/Name.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/util/Naming.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/util/StringSplitter.class create mode 100644 thirdparty/epubcheck/bin/com/thaiopensource/xml/util/WellKnownNamespaces.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/Datatype.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeBuilder.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeException.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeLibrary.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeLibraryFactory.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeStreamingValidator.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/ValidationContext.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$1.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$Loader.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$Loader2.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$ProviderEnumeration.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$Singleton.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.class create mode 100644 thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/StreamingValidatorImpl.class create mode 100644 thirdparty/epubcheck/build.bat create mode 100644 thirdparty/epubcheck/build.xml create mode 100644 thirdparty/epubcheck/epubcheck-1.0.5.jar create mode 100644 thirdparty/epubcheck/foo.epub create mode 100644 thirdparty/epubcheck/jing_license.txt create mode 100644 thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine create mode 100644 thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory create mode 100644 thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory create mode 100644 thirdparty/epubcheck/jingsrc/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader create mode 100644 thirdparty/epubcheck/jingsrc/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/Datatype2.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/AnyUriDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BinaryDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BooleanDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/CdataDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBase.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DateTimeDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DecimalDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DoubleDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DurationDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/EntityDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/FloatDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/HexBinaryDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdrefDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/LengthRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ListDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxLengthRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Measure.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NCNameDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NameDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NmtokenDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/OrderRelation.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PrecisionRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/QNameDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RegexDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ScaleRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/StringDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/TokenDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/Regex.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexEngine.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/NamingExceptions.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/CategoryTest.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/TestDriver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/SchemaFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AbstractPatternFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AfterPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Alphabet.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ApplyAfterFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributePattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BinaryPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BlankDataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibraryFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoiceNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoicePattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineSchema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineValidator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataExceptPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DatatypeValue.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ElementPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EmptyPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndAttributesFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndTagDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdTypeMapSchema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleTransform.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FindElementFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/GroupPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdSoundnessChecker.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapSchema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IgnoreMissingAttributesFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InterleavePattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ListPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/MixedTextDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClassVisitor.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameFormatter.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NotAllowedPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameExceptNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NullNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OneOrMorePattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OverlapDetector.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Pattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternDumper.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFuture.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternInterner.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternMemo.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternSchema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternValidator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternVisitor.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RecoverAfterFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RefPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RestrictionViolationException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaPatternBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReaderImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SimpleNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SingleDataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringNormalizer.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextOnlyFunction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TokenDatatype.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValueDataDerivType.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValuePattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Annotations.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/BuildException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/CommentList.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Context.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/DataPatternBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Div.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ElementAnnotationBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Grammar.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/GrammarSection.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IllegalSchemaException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Include.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IncludedGrammar.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Location.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParseReceiver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Parseable.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedNameClass.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPattern.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPatternFuture.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SchemaBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Scope.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SubParser.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactParseable.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EOFException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/ParseException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/Token.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/TokenMgrError.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/DtdContext.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseReceiver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseable.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXSubParser.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SchemaParser.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/Driver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ExegenDriver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/TestDriver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ValidationEngine.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Version.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Equal.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Localizer.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/OptionParser.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyId.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMapBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Service.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/SinglePropertyMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Uri.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/UriOrFile.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Utf16.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Version.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/AbstractSchema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Flag.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagOption.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagPropertyId.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/IncorrectSchemaException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Option.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentFormatException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentPresenceException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Schema.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderLoader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringOption.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringPropertyId.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidateProperty.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidationDriver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Validator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReceiver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/ReparseException.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/Rewindable.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/RewindableInputStream.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaFuture.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderFactorySchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiver.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverLoader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ContextMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ElementsOrAttributes.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/Hashset.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/MnsSchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaReceiverImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ValidatorImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/mns.rng create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Action.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ActionSet.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AllowAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttachAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttributeActionSet.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ContextMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ElementsOrAttributes.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/FilteredAttributes.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Hashset.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/IntSet.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Mode.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ModeUsage.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NoResultAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlProperty.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlSchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Path.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/RejectAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ResultAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaReceiverImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SectionState.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/UnwrapAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidateAction.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidatorImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/nrl.rng create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/CompactSchemaReader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/RngProperty.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReader.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/DraconianErrorListener.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/OutputHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaReaderImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronProperty.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronSchemaReaderFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/ValidatorImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/XMLReaderImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.rnc create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.xsl create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/AbstractLexicalHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/CountingErrorHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DelegatingContentHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DraconianErrorHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ErrorHandlerImpl.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkContentHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkDTDHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Sax2XMLReaderCreator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XMLReaderCreator.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XmlBaseHandler.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/resources/Messages.properties create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/EncodingMap.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Name.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Naming.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/StringSplitter.java create mode 100644 thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/WellKnownNamespaces.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/Datatype.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeException.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibrary.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibraryFactory.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeStreamingValidator.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/ValidationContext.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.java create mode 100644 thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/StreamingValidatorImpl.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/api/EpubCheck.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/api/Report.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTest.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTestContentHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/Result.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/dtbook-2005-2.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/ncx-2005-1.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/oeb12.dtdinc create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/opf20.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/svg11.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-special.dtdinc create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-strict.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionFilter.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFPackage.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/UnsupportedEncryptionFilter.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFItem.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/opf/XRefChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSChecker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSCheckerFactory.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/ops/registeredSchemas.txt create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/container.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-svg.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-xhtml.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/dtbook-2005-2.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/encryption.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx-old.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf12.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf20.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops/ops-switch.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.nrl create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/signatures.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animation.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-font.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-text.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-clip.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-conditional.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-cursor.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-datatypes.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extensibility.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-filter.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-font.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-gradient.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-image.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-marker.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-mask.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-pattern.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-profile.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-qname.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-script.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-shape.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-structure.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-style.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-text.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-view.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg11.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xenc-schema.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/applet.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/attribs.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/base.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-form.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-table.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/bdo.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/csismap.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/datatypes.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/edit.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/events.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/form.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/frames.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/hypertext.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/iframe.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/image.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/inlstyle.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/legacy.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/link.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/list.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/meta.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/nameident.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/object.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/param.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/pres.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ruby.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/script.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ssismap.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/struct.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/style.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/table.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/target.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/text.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xmldsig-core-schema.rng create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/sch/ncx.sch create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/sch/opf.sch create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/tool/Checker.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/util/CheckUtil.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/util/DefaultReportImpl.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/util/PathUtil.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/util/ResourceUtil.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/util/WriterReportImpl.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLAttribute.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLElement.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLHandler.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLNode.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLParser.java create mode 100644 thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLValidator.java create mode 100644 thirdparty/epubcheck/testdocs/autotest.sh create mode 100644 thirdparty/epubcheck/testdocs/general/OPFIllegalElement.epub create mode 100644 thirdparty/epubcheck/testdocs/general/OPFIllegalElement_UniqueID.epub create mode 100644 thirdparty/epubcheck/testdocs/general/PageMap.epub create mode 100644 thirdparty/epubcheck/testdocs/general/Test.epub create mode 100644 thirdparty/epubcheck/testdocs/general/UniqueIDNotUsed.epub create mode 100644 thirdparty/epubcheck/testdocs/general/tests.xml create mode 100644 thirdparty/epubcheck/testdocs/issues/Issue21.epub create mode 100644 thirdparty/epubcheck/testdocs/issues/Issue25.epub create mode 100644 thirdparty/epubcheck/testdocs/issues/issues.xml rename Skripten/tralics => thirdparty/tralics-2.14.4 (100%) create mode 100644 thirdparty/tralics-2.15.2/COPYING create mode 100644 thirdparty/tralics-2.15.2/ChangeLog create mode 100644 thirdparty/tralics-2.15.2/Copyright create mode 100644 thirdparty/tralics-2.15.2/LISEZMOI create mode 100644 thirdparty/tralics-2.15.2/Licence_CeCILL_V2-en.txt create mode 100644 thirdparty/tralics-2.15.2/Licence_CeCILL_V2-fr.txt create mode 100644 thirdparty/tralics-2.15.2/Modele/amsldoc.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/beauvilams2.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/bo.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/comp_pi.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/ex_emple2008.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2003.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2005.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2006.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2007.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2008.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2009.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2011.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exemple2013.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/exempleb2011.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/fptest.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/hello.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/hello1-no.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/hello1.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/hello2.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/hello3.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testb.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testb0.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testb1.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testbe.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testclass.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testerr.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testhtml.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testkeyval.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testm1a.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testm1b.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testm1c.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testmath.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testpack.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/testpackii.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/teststr.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tormath.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tormath1.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tormath2.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tormath3.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/torture.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tpa.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tpa2.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/tpa2x.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/txerr.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/txtc.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/txtd.xml create mode 100644 thirdparty/tralics-2.15.2/Modele/xii.xml create mode 100644 thirdparty/tralics-2.15.2/README create mode 100644 thirdparty/tralics-2.15.2/Test/README create mode 100755 thirdparty/tralics-2.15.2/Test/alltests create mode 100644 thirdparty/tralics-2.15.2/Test/amsldoc.tex create mode 100644 thirdparty/tralics-2.15.2/Test/beauvilams2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/beauville.bib create mode 100644 thirdparty/tralics-2.15.2/Test/bi.bib create mode 100644 thirdparty/tralics-2.15.2/Test/bo.bib create mode 100644 thirdparty/tralics-2.15.2/Test/bo.tex create mode 100644 thirdparty/tralics-2.15.2/Test/comp_pi.tex create mode 100644 thirdparty/tralics-2.15.2/Test/dummy.txt create mode 100644 thirdparty/tralics-2.15.2/Test/ex_emple2008.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2003.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2005.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2006.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2007.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2008.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2009.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2011.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exemple2013.tex create mode 100644 thirdparty/tralics-2.15.2/Test/exempleb2011.tex create mode 100644 thirdparty/tralics-2.15.2/Test/fptest.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello1.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello2003.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello2004.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello2006.tex create mode 100644 thirdparty/tralics-2.15.2/Test/hello3.tex create mode 100644 thirdparty/tralics-2.15.2/Test/lxdoc.tex create mode 100755 thirdparty/tralics-2.15.2/Test/mathmlc.tex create mode 100644 thirdparty/tralics-2.15.2/Test/taux1.tex create mode 100644 thirdparty/tralics-2.15.2/Test/taux2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testb.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testb1.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testbe.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testclass.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testerr.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testhtml.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testkeyval.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testm1.tex create mode 100755 thirdparty/tralics-2.15.2/Test/testmath.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testmath.ult create mode 100644 thirdparty/tralics-2.15.2/Test/testpack.tex create mode 100644 thirdparty/tralics-2.15.2/Test/testpackii.tex create mode 100644 thirdparty/tralics-2.15.2/Test/teststr.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tormath.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tormath1.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tormath2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tormath3.tex create mode 100644 thirdparty/tralics-2.15.2/Test/torture.bib create mode 100644 thirdparty/tralics-2.15.2/Test/torture.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tortureaux.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tpa.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tpa2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tptest.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tralics-ex1.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tralics-ex2.tex create mode 100644 thirdparty/tralics-2.15.2/Test/tralics.bib create mode 100644 thirdparty/tralics-2.15.2/Test/tralics.sty create mode 100644 thirdparty/tralics-2.15.2/Test/txerr.tex create mode 100644 thirdparty/tralics-2.15.2/Test/txtc.tex create mode 100644 thirdparty/tralics-2.15.2/Test/txtd.tex create mode 100644 thirdparty/tralics-2.15.2/Test/xhello.tex create mode 100644 thirdparty/tralics-2.15.2/Test/xii.tex create mode 100644 thirdparty/tralics-2.15.2/confdir/.tralics_rc create mode 100644 thirdparty/tralics-2.15.2/confdir/COPYING create mode 100644 thirdparty/tralics-2.15.2/confdir/README create mode 100644 thirdparty/tralics-2.15.2/confdir/RR.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/RR.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/abstract.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/ae.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/aecompl.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/aeguill.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/alltt.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsart.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsbsy.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amscd.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsfonts.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsgen.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsmath.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsmidx.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsopn.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amssymb.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amstext.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsthm.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/amsxtra.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/article.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/bbding.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/book.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/braket.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/calc.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/cedram.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/cgloss4e.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/checkend.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/color.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/comma.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/config_empty create mode 100644 thirdparty/tralics-2.15.2/confdir/coollist.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/coolstr.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/curves.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/datenumber.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/decimal.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/delarray.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/epigraph.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/esdiff.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/etex.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/eucal.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/eufrak.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/eurotex.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/fancybox.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fancyhdr.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fancyvrb.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fix-cm.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fixfoot.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fixltx2e.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fixme.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/flafter.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/float.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fontenc.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/forloop.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/fp.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/gb4e.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/gescap.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/graphics.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/graphicx.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/graphpap.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/hello.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/hello1.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/hello3.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/html.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/hyperref.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/ifpdf.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/ifthen.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/index.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/inputenc.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/keyval.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/kvoptions.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/latex.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/latexsym.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/lipsum.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/listings.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/makeidx.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/maple2e.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/mapleenv.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/mapleplots.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/maplestyle.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/mapletab.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/mapleutil.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/minimal.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/mml.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/mml.sty create mode 100644 thirdparty/tralics-2.15.2/confdir/natbib.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/newlfont.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/nopageno.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/oldlfont.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/overword.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2003.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2004.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2005.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2006.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2007.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2007.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2008.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2008.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2009.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2009.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2011.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2011.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2013.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/ra2013.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/rabib.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/remreset.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/report.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/shortvrb.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/showidx.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/soul.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/std.clt create mode 100644 thirdparty/tralics-2.15.2/confdir/subfigure.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/suffix.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/syntonly.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/test.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/test0.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/testa.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/textcase.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/textcomp.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/tipa.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/tipx.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/titlepage.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/tloop.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/torture.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/tp.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/tpa.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/tracefnt.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/tralics-iso.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/tralics_rc create mode 100644 thirdparty/tralics-2.15.2/confdir/unused.tcf create mode 100644 thirdparty/tralics-2.15.2/confdir/upref.plt create mode 100644 thirdparty/tralics-2.15.2/confdir/xkeyval.plt create mode 100755 thirdparty/tralics-2.15.2/mktar create mode 100644 thirdparty/tralics-2.15.2/src/Copyright create mode 100644 thirdparty/tralics-2.15.2/src/Makefile create mode 100644 thirdparty/tralics-2.15.2/src/README create mode 100644 thirdparty/tralics-2.15.2/src/readline.C create mode 100644 thirdparty/tralics-2.15.2/src/readline.o create mode 100755 thirdparty/tralics-2.15.2/src/tralics create mode 100644 thirdparty/tralics-2.15.2/src/tralics.C create mode 100644 thirdparty/tralics-2.15.2/src/tralics.h create mode 100644 thirdparty/tralics-2.15.2/src/tralics.o create mode 100644 thirdparty/tralics-2.15.2/src/txaccent.C create mode 100644 thirdparty/tralics-2.15.2/src/txaccent.o create mode 100644 thirdparty/tralics-2.15.2/src/txarray.C create mode 100644 thirdparty/tralics-2.15.2/src/txarray.h create mode 100644 thirdparty/tralics-2.15.2/src/txarray.o create mode 100644 thirdparty/tralics-2.15.2/src/txatt.C create mode 100644 thirdparty/tralics-2.15.2/src/txatt.h create mode 100644 thirdparty/tralics-2.15.2/src/txatt.o create mode 100644 thirdparty/tralics-2.15.2/src/txaux.C create mode 100644 thirdparty/tralics-2.15.2/src/txaux.o create mode 100644 thirdparty/tralics-2.15.2/src/txbib.C create mode 100644 thirdparty/tralics-2.15.2/src/txbib.h create mode 100644 thirdparty/tralics-2.15.2/src/txbib.o create mode 100644 thirdparty/tralics-2.15.2/src/txbuffer.C create mode 100644 thirdparty/tralics-2.15.2/src/txbuffer.h create mode 100644 thirdparty/tralics-2.15.2/src/txbuffer.o create mode 100644 thirdparty/tralics-2.15.2/src/txchars.h create mode 100644 thirdparty/tralics-2.15.2/src/txclasses.C create mode 100644 thirdparty/tralics-2.15.2/src/txclasses.h create mode 100644 thirdparty/tralics-2.15.2/src/txclasses.o create mode 100644 thirdparty/tralics-2.15.2/src/txcmd.h create mode 100644 thirdparty/tralics-2.15.2/src/txcommands.C create mode 100644 thirdparty/tralics-2.15.2/src/txcommands.o create mode 100644 thirdparty/tralics-2.15.2/src/txcond.h create mode 100644 thirdparty/tralics-2.15.2/src/txconfig.C create mode 100644 thirdparty/tralics-2.15.2/src/txconfig.o create mode 100644 thirdparty/tralics-2.15.2/src/txconst.h create mode 100644 thirdparty/tralics-2.15.2/src/txeqtb.h create mode 100644 thirdparty/tralics-2.15.2/src/txerr.C create mode 100644 thirdparty/tralics-2.15.2/src/txerr.o create mode 100644 thirdparty/tralics-2.15.2/src/txfonts.C create mode 100644 thirdparty/tralics-2.15.2/src/txfonts.h create mode 100644 thirdparty/tralics-2.15.2/src/txfonts.o create mode 100644 thirdparty/tralics-2.15.2/src/txfp.C create mode 100644 thirdparty/tralics-2.15.2/src/txfp.h create mode 100644 thirdparty/tralics-2.15.2/src/txfp.o create mode 100644 thirdparty/tralics-2.15.2/src/txhash.h create mode 100644 thirdparty/tralics-2.15.2/src/txid.h create mode 100644 thirdparty/tralics-2.15.2/src/tximage.h create mode 100644 thirdparty/tralics-2.15.2/src/txinline.h create mode 100644 thirdparty/tralics-2.15.2/src/txio.C create mode 100644 thirdparty/tralics-2.15.2/src/txio.h create mode 100644 thirdparty/tralics-2.15.2/src/txio.o create mode 100644 thirdparty/tralics-2.15.2/src/txlogger.h create mode 100644 thirdparty/tralics-2.15.2/src/txmain.C create mode 100644 thirdparty/tralics-2.15.2/src/txmain.o create mode 100644 thirdparty/tralics-2.15.2/src/txmath.C create mode 100644 thirdparty/tralics-2.15.2/src/txmath.h create mode 100644 thirdparty/tralics-2.15.2/src/txmath.o create mode 100644 thirdparty/tralics-2.15.2/src/txmath1.C create mode 100644 thirdparty/tralics-2.15.2/src/txmath1.h create mode 100644 thirdparty/tralics-2.15.2/src/txmath1.o create mode 100644 thirdparty/tralics-2.15.2/src/txmathboot.C create mode 100644 thirdparty/tralics-2.15.2/src/txmathboot.o create mode 100644 thirdparty/tralics-2.15.2/src/txmlio.C create mode 100644 thirdparty/tralics-2.15.2/src/txmlio.h create mode 100644 thirdparty/tralics-2.15.2/src/txmlio.o create mode 100644 thirdparty/tralics-2.15.2/src/txparam.h create mode 100644 thirdparty/tralics-2.15.2/src/txparser.C create mode 100644 thirdparty/tralics-2.15.2/src/txparser.h create mode 100644 thirdparty/tralics-2.15.2/src/txparser.o create mode 100644 thirdparty/tralics-2.15.2/src/txparser2.C create mode 100644 thirdparty/tralics-2.15.2/src/txparser2.h create mode 100644 thirdparty/tralics-2.15.2/src/txparser2.o create mode 100644 thirdparty/tralics-2.15.2/src/txparser3.C create mode 100644 thirdparty/tralics-2.15.2/src/txparser3.o create mode 100644 thirdparty/tralics-2.15.2/src/txpath.h create mode 100644 thirdparty/tralics-2.15.2/src/txpost.C create mode 100644 thirdparty/tralics-2.15.2/src/txpost.h create mode 100644 thirdparty/tralics-2.15.2/src/txpost.o create mode 100644 thirdparty/tralics-2.15.2/src/txra.C create mode 100644 thirdparty/tralics-2.15.2/src/txra.o create mode 100644 thirdparty/tralics-2.15.2/src/txscaled.h create mode 100644 thirdparty/tralics-2.15.2/src/txscan.C create mode 100644 thirdparty/tralics-2.15.2/src/txscan.o create mode 100644 thirdparty/tralics-2.15.2/src/txstack.C create mode 100644 thirdparty/tralics-2.15.2/src/txstack.h create mode 100644 thirdparty/tralics-2.15.2/src/txstack.o create mode 100644 thirdparty/tralics-2.15.2/src/txstats.h create mode 100644 thirdparty/tralics-2.15.2/src/txstring.h create mode 100644 thirdparty/tralics-2.15.2/src/txtitlepage.C create mode 100644 thirdparty/tralics-2.15.2/src/txtitlepage.h create mode 100644 thirdparty/tralics-2.15.2/src/txtitlepage.o create mode 100644 thirdparty/tralics-2.15.2/src/txtoken.C create mode 100644 thirdparty/tralics-2.15.2/src/txtoken.h create mode 100644 thirdparty/tralics-2.15.2/src/txtoken.o create mode 100644 thirdparty/tralics-2.15.2/src/txtoken1.C create mode 100644 thirdparty/tralics-2.15.2/src/txtoken1.o create mode 100644 thirdparty/tralics-2.15.2/src/txtoken2.C create mode 100644 thirdparty/tralics-2.15.2/src/txtoken2.o create mode 100644 thirdparty/tralics-2.15.2/src/txtokenlist.h create mode 100644 thirdparty/tralics-2.15.2/src/txtranslate.C create mode 100644 thirdparty/tralics-2.15.2/src/txtranslate.o create mode 100644 thirdparty/tralics-2.15.2/src/txtrees.C create mode 100644 thirdparty/tralics-2.15.2/src/txtrees.h create mode 100644 thirdparty/tralics-2.15.2/src/txtrees.o create mode 100644 thirdparty/tralics-2.15.2/src/txvars.h create mode 100644 thirdparty/tralics-2.15.2/src/txxml.h diff --git a/Skripten/eoaconvert.cfg b/Skripten/eoaconvert.cfg new file mode 100644 index 0000000..edcb398 --- /dev/null +++ b/Skripten/eoaconvert.cfg @@ -0,0 +1,17 @@ +[General] +# logging +logfile: ./eoaconvert.log +# choose between DEBUG, INFO, WARNING, ERROR, CRITICAL +loglevel: DEBUG + +[Executables] +graphicsmagic: /usr/local/bin/gm +texlive: /usr/local/texlive/2015/ +texbin: /Library/TeX/texbin/ +TRALICS_PATH_EXEC: /Users/kthoden/EOAKram/EOASkripts/thirdparty/tralics-2.15.2/src/tralics +#TRALICS_PATH_EXEC: /Users/kthoden/EOAKram/EOASkripts/thirdparty/tralics-2.14.4 +TRALICS_PATH_LIB: /Users/kthoden/EOAKram/EOASkripts/tralics +PDFTK_PATH: /usr/local/bin/pdftk +TEMPLATE_PATH: /Users/kthoden/EOAKram/EOASkripts/Templates/ +SUPPORT_PATH: /Users/kthoden/EOAKram/EOASkripts/Support/ +AUX_TEX_FILES_PATH: /Users/kthoden/EOAKram/EOASkripts/TeX/ \ No newline at end of file diff --git a/TeX/publication.cfg b/TeX/publication.cfg new file mode 100644 index 0000000..8de9dcf --- /dev/null +++ b/TeX/publication.cfg @@ -0,0 +1,40 @@ +[Technical] +Serie: Sources +Number: 7 +Title: Alvarus Thomas und sein Liber de triplici motu +Subtitle: Band I: Naturphilosophie an der Pariser Artistenfakultät +PublicationDate: 2016-05-01 +PublicationYear: 2016 +ISBN: 978-3-945561-09-6 +Price: 0,00 € +Shoplink: +Language: de +License: by-nc-sa + +[General] +BriefDescription: Untersuchung zum Leben und Werk von Alvarus Thomas im frühen 16. Jahrhundert +Submitter: Matteo Valleriani and Anne-Laurence Caudano +PublicationManagment: Lindy Divarci +PublicationAssistants: NN +Keyword1: MPRL +Keyword2: Edition Open Sources +Keyword3: Frühe Neuzeit +Keyword4: Geschichte der Philosophie +Keyword5: Naturphilosophie +Keyword6: Mechanik +Keyword7: Aristotelismus +Keyword8: +DetailedDescription: Der Liber de triplici +AdditionalInformation: +EditorialCoordination: +Copyediting: Lindy Divarci, Stefan Paul Trzeciok +Dedication: Für meine Familie +Translator: + +[Authors] +Author1: Stefan Paul Trzeciok +Author2: +Author3: +Author4: +Author5: +Zusatz: diff --git a/Templates/DejaVuSerif-BoldItalic.ttf b/Templates/DejaVuSerif-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3d73ee7d077f33173148e949b898207b69fab49b GIT binary patch literal 293332 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�oqGBKY{rIM&S8L7VT$zIQM1d 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­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

q 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 MlK(rWefTB+3rYiCKL7v# literal 0 HcmV?d00001 diff --git a/Templates/DejaVuSerif-Italic.ttf b/Templates/DejaVuSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5057bd035401e092cb1473c15d6662c9d254920c GIT binary patch literal 300912 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

N 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 + + + + + + + diff --git a/thirdparty/epubcheck/.externalToolBuilders/Jar Builder.launch b/thirdparty/epubcheck/.externalToolBuilders/Jar Builder.launch new file mode 100644 index 0000000..16e017a --- /dev/null +++ b/thirdparty/epubcheck/.externalToolBuilders/Jar Builder.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/.project b/thirdparty/epubcheck/.project new file mode 100644 index 0000000..fcb494b --- /dev/null +++ b/thirdparty/epubcheck/.project @@ -0,0 +1,27 @@ + + + com.adobe.epubcheck + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/Jar Builder.launch + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/thirdparty/epubcheck/.settings/org.eclipse.jdt.core.prefs b/thirdparty/epubcheck/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..4ac996c --- /dev/null +++ b/thirdparty/epubcheck/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Thu Aug 20 22:49:53 PDT 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/thirdparty/epubcheck/.settings/org.eclipse.jdt.ui.prefs b/thirdparty/epubcheck/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..b032fe9 --- /dev/null +++ b/thirdparty/epubcheck/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,5 @@ +#Fri Sep 05 15:39:22 PDT 2008 +eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +internal.default.compliance=default +org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/thirdparty/epubcheck/COPYING.txt b/thirdparty/epubcheck/COPYING.txt new file mode 100644 index 0000000..bdfe74d --- /dev/null +++ b/thirdparty/epubcheck/COPYING.txt @@ -0,0 +1,19 @@ +Copyright (c) 2007 Adobe Systems Incorporated + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/thirdparty/epubcheck/Issue28.epub b/thirdparty/epubcheck/Issue28.epub new file mode 100644 index 0000000000000000000000000000000000000000..fac12331e27adea21e3a46a8b2e3ebdfa4891db4 GIT binary patch literal 62729 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%0D#4f| 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 J`A@@w{txa`Ox6GZ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/README.txt b/thirdparty/epubcheck/README.txt new file mode 100644 index 0000000..6952865 --- /dev/null +++ b/thirdparty/epubcheck/README.txt @@ -0,0 +1,61 @@ +This folder contains the distribution of epubcheck project. + +EpubCheck is a tool to validate IDPF Epub files. It can detect many +types of errors in Epub. OCF container structure, OPF and OPS mark-up, +and internal reference consistency are checked. EpubCheck can be run +as a standalone command-line tool, installed as a web application or +used as a library. + +Epubcheck project home: http://code.google.com/p/epubcheck/ + +BUILDING + +To build epubcheck from the sources you need Java Development Kit (JDK) 1.5 or above +and Apache ant (http://ant.apache.org/) 1.6 or above installed + +Run + +ant -f build.xml + +RUNNING + +To run the tool you need Java Runtime (1.5 or above). Any OS should do. Run +it from the command line: + +java -jar epubcheck-x.x.x.jar file.epub + +All detected errors are simply printed to stderr. + +USING AS A LIBRARY + +You can also use EpubCheck as a library in your Java application. EpubCheck +public interfaces can be found in com.adobe.epubcheck.api package. EpubCheck +class can be used to instantiate a validation engine. Use one of its +constructors and then call validate() method. Report is an interface that +you can implement to get a list of the errors and warnings reported by the +validation engine (instead of the error list being printed out). + +LICENSING + +See COPYING.txt + +AUTHORS + +Peter Sorotokin +Garth Conboy +Markus Gylling +Piotr Kula + +Most of the EpubCheck functionality comes from the schema validation tool Jing +and schemas that were developed by IDPF and DAISY. EpubCheck development was +largely done at Adobe Systems. + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine new file mode 100644 index 0000000..327aad0 --- /dev/null +++ b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine @@ -0,0 +1,3 @@ +com.thaiopensource.datatype.xsd.regex.jdk1_4.RegexEngineImpl +com.thaiopensource.datatype.xsd.regex.xerces2.RegexEngineImpl +com.thaiopensource.datatype.xsd.regex.xerces.RegexEngineImpl diff --git a/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory new file mode 100644 index 0000000..44a7cc0 --- /dev/null +++ b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory @@ -0,0 +1,4 @@ +com.thaiopensource.validate.jarv.JarvSchemaReaderFactory +com.thaiopensource.validate.xerces.XsdSchemaReaderFactory +com.thaiopensource.validate.schematron.SaxonSchemaReaderFactory +com.thaiopensource.validate.schematron.XalanSchemaReaderFactory diff --git a/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory new file mode 100644 index 0000000..ff95351 --- /dev/null +++ b/thirdparty/epubcheck/bin/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory @@ -0,0 +1,4 @@ +com.thaiopensource.validate.rng.SAXSchemaReceiverFactory +com.thaiopensource.validate.mns.MnsSchemaReceiverFactory +com.thaiopensource.validate.nrl.NrlSchemaReceiverFactory +com.thaiopensource.validate.auto.SchemaReaderLoaderSchemaReceiverFactory diff --git a/thirdparty/epubcheck/bin/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader b/thirdparty/epubcheck/bin/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader new file mode 100644 index 0000000..6393d7f --- /dev/null +++ b/thirdparty/epubcheck/bin/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader @@ -0,0 +1 @@ +com.thaiopensource.relaxng.jarv.VerifierFactoryLoaderImpl diff --git a/thirdparty/epubcheck/bin/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory b/thirdparty/epubcheck/bin/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory new file mode 100644 index 0000000..1353184 --- /dev/null +++ b/thirdparty/epubcheck/bin/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory @@ -0,0 +1 @@ +com.thaiopensource.datatype.xsd.DatatypeLibraryFactoryImpl diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck$ProxyReport.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck$ProxyReport.class new file mode 100644 index 0000000000000000000000000000000000000000..63cd16ea2c2f8cac7ca659d4edfc81ba582f5402 GIT binary patch literal 1131 zcmb7E+iuf95Ivi?apRbzlxv|aDGenTQWq!)DFp!$NRh%t1XbdVwYwxPi5;zNXg>=n z6_*D-fR94Vx=B+tib}Qe?#_7U%$YN5|M~mtH-HU1Oe2k(1`MpGQNS%Vtr;}k&LD%L zGD~V#)=|-MM@N+*6?WX9u)(m}bo`#hcYIq|q955#M>wA?-gm7RWYv{bV@S95y|5!f z*P+lY*K@-s3~R;zh%Ie1Xmx)_Fyxx9CtgQATgdm^?viJ|={vl;&84gCp;J@T7&33A zzqkKR^nDpJm<`VpvfkxEAn2uadgj8hc&cDVNa;(4VzIf)zi_L|y|&c~rR%k8jY*fH zJu5}vN79LjP6Sa|U8;wHH5l}s2m;GwA)HF_tJl%E!bV2Bu zS31&~r4Io}(v!m++2?7ui3AP6C|3@^%HNUrMplAifE1kp9^nGbX1q6W5m(4!O8p^1 z9~uoHUmk#c7$B*AJU~(z189}S>JQBPL`uULHyd-P5vMKc-QyU)e26i`Cp28cb;_W2 zi&%;|=CMq^BzdXhG%Nlmv+F9mej@wqWcH_&{TbmrKXdj3F;WVx;4-aBWA*R21pEVu Cl=!m% literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/EpubCheck.class new file mode 100644 index 0000000000000000000000000000000000000000..0fc6defc2f191742a72a3539438f02be6d09f6a7 GIT binary patch literal 3719 zcmai1S$o`O6@KMeBrCE#nbeN$#6d|z@S1VrHl$8SiQS}3>y0>dnWVIl#~NG7j5O6~ zVmmEeSPG?-QkoX(E}?9p5TJ#|2F%k7E_oiVx!@1-^Oz9-{l75lL$c%4H*O%@`iz zj&ydN<4MjgSy%Wdn+slW7Z-I&+Y;KU9*9b&?PA#@2TY^DVB&M8F=M(C>dp_*))lKL zVP_y;_N;u08>w?vF{D7m$>t>Nujwj}Qscv?CyeYRR+Oe?pA*9N9TohvGGk;2-CxUA zdi>Nv)+~CKWAm(O*7VZ0ciMFdLyMjucf9lbP`ZnxicN9m1SBrR1Gy_E%RD$X<-qP?k-r;=%f2xMlcvr)H7?jXmi{*Y|9x!u8IqwC*e=$NXK>M6~_;1 z_yvB+?#LRp?RYxNKBEUUmvLRgukgNxCvZW+U0KI<%SF$e(a)tPLKz7yn+L~GIhPYf z{e0fEXT3Sy$>}-EEqPqIV-!r?vUS7F&RLgDy-?=Cw5cEM)u+pzK5vwC4Zp^3#BxK! zZ}Fal`^Z?=pt_l#(L ztufq#8MFR{RCC;Ox^eDlm5_o?mN^W@$TZfiv!+&a4M1V1b#3Nu9@d=d|2GN#RF8@l zV(c70V*2daN-OAX3i?Tx&{@N$bd4;CF;8NdHbHu8=-eJ~(2*RHyE@Z%I8{8SQk|OI z^C{}{=@CwTGRB|Z6_r*oZfm&9cTX&vcS0aNh~iTnj&kKN=L#{Exk`fi{*~J8AK@$v~{l_ z-raK(a`!5fOwTgvSD@a+whwt27)(+Wc!=x6sK*FeG3py{2@K#%Nb{Vg{CN1TBFsY} z%mr#ic-FEWM$7cBprHoFB&E+1;}JAt%E!ZFXt!L!8BE2nyN5O7-Mk+%s3_jn7RQLQ)W8vUqxevP)#GNNMyP{g1mz5 zqlv-4Dr3EU%SiTpd<}^nDU#grXWSLVb-dr*muO!>^N}cTc8i->Ut}OLaSg3~(SgLn zp?FIuex*5@P_AJgO{`*PW(BRuwq>+8N0+f{8M{NNv(2$LH^_7dnb-!I{=USX+d%RNB8;rz00_J75l@8K06p)#eqy)bOoOqjIE+G(-!MlLDyis zExwHIHhR-@9s5StdCB10Y2+X;6+fAs)Djwb>0g2zy^d()2GdzD)k_-xLj+8-v5Qm#aSN|VQM@YE<8`9FCN@p3?2cX-c;XpTO2g91TX8huhP5$G+t^|tT!J%NELV>@8b nMbY^km}UTVl-_|X?;_MuFyn_;$K(pDInD=Ag8!$O+yUT!4pE{S literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/Report.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/api/Report.class new file mode 100644 index 0000000000000000000000000000000000000000..5963235e5c79e88560f15a3df24dc2e539feb333 GIT binary patch literal 194 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 PqN^rcdn47V!cG4Ny;%4o literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/autotest/Result.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/autotest/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..a7a0ff86154884768241fe91c0bfefafe7b8ac3c GIT binary patch literal 932 zcma))&2H0B5QWdR9XoamEo})u0ZLmcrC#9fKmuihK&liK2~d!_vz@Ed#kG-t%1g09 zqC#T91MpCYb8V{$Q7W;SxifR;%y-BB{paT|0EgIjU}D=w2alE6QD)b|o`oj@or@re zrvleBELg z!y`4%p3PGvAX|@@K3?JVSf58-)+WuHjNysux8kBru$#|x-e*-F$v3fL?lqI2o&^_y z3l}$BSm?U2;kf9*5!m|=aDjCt;3q*k^WTPNGAgmdHJkhZIy5E8lcrQ_PholsLQSN- z$>^AMLBHkwfbfh06V-hV literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/bitmap/BitmapChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/bitmap/BitmapChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..6e886710863d1eb36aa966c9dbf33139d95bb41f GIT binary patch literal 2367 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..6afa70b12b6ccf1920ccf1c20ec31ab39a8f2790 GIT binary patch literal 1282 zcmcIjO>fgc5Ph3CN#mrnl+Qq+Eon;v6oWXX>Vcq0ND)PC6t%~-vq{_}Ud!D8z3`j( zI7FfnKY$;Fm^CI%>4La$uy^)p-pst2*>B&!d6Jw9yn$k+D-v{c_eW+(*W?aOHulZvqn z>2;mmdgC?s2D~R~Mjsyf&YlQmq-xD0{)Rh49`u}j75PEWgqY;YuuJVckqPUp_T1iVI~}HTus;p{|Bp^>q&~h@$z8{E=v#gw*50yJ%WB z!-g^L@A8P%6Y8w{&njlYf8T<+ZEu+DfxR!sktZ6yo_fi&HIKE5A_^!nR7@i<<A*0^2wNO+22%M|3|Sf?T0|F59cho=z&{g zQyb|&PdA57MrY>11neUjDO{p|HU?L)K(=-z2Q0>PhRawYM3a5;%hEZ2iqzr5M_Z-L z1nCb1%myjPL3VyRCP9dTE4Ug5p2sy@Cx*su;3m?sRU*rZty{QF$@5sooh0pY%p)bA nVCigZrsOJVy*pJ`j^hG_Q)CV&$bN>UHO>+?>9#^x3adW=v7%26 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookHandler.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtbook/DTBookHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..290274068a72203238198acb7b41ef87ae9ef08b GIT binary patch literal 2960 zcmbVONpl-T6#iP4G-G+}B#L9A06`&%qs8_(D~=qpIg163?Rbl`5k^u=npm1qW=63S z_I(W$Ra|nRxaGi!szhNcs<`ApQN@4Y#0d@@xKI?YN3!hLlR#0bdEL|9@B3cA_jQkc z{QH~l0rcbJ5VqiCE20<{CN0b}Av}wb5KduKm@yfLMLRCzbO;lelrbe^T1HC7ObBN% zD@M->r*p!bmvAA3PMnl+QMAtqbEyr_Lz9t_k(H4Pfg>M60YzbS36~|zNhmP{E1G3< zi(%_X)-0=9&dhL?SE`w8k!R=Bg>p%qJvB1!E*fO;S2U-{5FWX#UDec*W)##($I^`g z&9yC9JU=Ad1m1Q}JhPHlXD6D=$SZh2H+1J9!^N1V$Ndqk=Jj-1NfV!;(1*+%XIL|$ z8+^1{&Twl=%amv&JYr_G(u`*5;=M8GcZ#~rknn`hIT_QOQ;$s@rDj+&awTrjRzlgL zW@%Z6TjVLl&JU&2f;b?CX~cJah@#M}!cGR3u6K7atk(;MX$k5xMcv_cMaxo9itT8Y zbG*dM+;A9LVggC#3j}UxRJWF@r4tOT+~yf#BW(=;3eIOx2!2B=lZ#K!QMBC1HSsr8 zEHle(n<|+$Y{#l*9o;k-cEmg~zN+?adTC?*ggR+ftt>yGyP3T&Lw&+eK^*%PY{fPO z+tICH2VxS+3JjPMDhjT^QeX??ph^K09jB5~)%p4PzMQ7p*ZNGWpkCj-e_)@wtG|D* z+Ngzus|x0^KsnK9pGA@)HM9{f;hKW$ctOF7cuB#_ctydhc#WZJDtj@ooA%39R9R^d_IhzgoiRKe?bL&2M{B)p~IZM;L&CEb{# zGU??4S=-7=cvr!DcwfQ?3O>XQ1s~xCL(J>cdFhK`?NYpBnaey&vUt+VyHWavE*Z8w zWKsQKGps9cXQ*mfB(|m|x?}PGCas4>(L_^-VU*O@(03<+FYTv!he(Z8bO5M##G$(- zQ*}tP-5x^pL|B%kIx1Z;{7O|Tk^DC-2dU?9Fn;aFQvL zWUvCYu@iwR=|+w(j0qja(s4TQt+b^HUNJ3Exd$XytLSQd4V~F`a#*^q+*^QPf?B0Q zXP2R8`F0kGS7o)XYC@A8b1@^Ey(FtG|SAq|IYC98m!4k%T?k*}K>f?yBLDNPtWY8^1=x z57#x;8{Xt1b}SO!LT7LIQFp8@8Gg(SLXh_hOhNm2DnMQTGKvU=UH6bE8o$4W%@O}S zY+Sia%sjDFwLBtJwSADO3hfv`n3A>$DU!hfD*sWE#SqOL!yz2UC{ADoCvgG8$RmwU z=jIdCh-HN@Drx-8)oqb&N7)iger!q2#07qMaV&Ve!(DF5+`eI zC`D$Bc%P=Swc{@wq*)(D^e1_BlTtR}cO0f3r42_Gi|ZZ)p}bX6yyTK9w3sFv1dO&c lL~r8s9HK{@v{jB7*D+e3T&Ce;#9as5<3`3PC*qKu_y +--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/ncx-2005-1.dtd b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/ncx-2005-1.dtd new file mode 100644 index 0000000..441b2cc --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/ncx-2005-1.dtd @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/oeb12.dtdinc b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/oeb12.dtdinc new file mode 100644 index 0000000..f2e4af6 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/oeb12.dtdinc @@ -0,0 +1,1136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/opf20.dtd b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/opf20.dtd new file mode 100644 index 0000000..72207eb --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/opf20.dtd @@ -0,0 +1,296 @@ + + + + + + +%OEBEntities; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/svg11.dtd b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/svg11.dtd new file mode 100644 index 0000000..30f87e8 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/svg11.dtd @@ -0,0 +1,5790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + +]]> + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc new file mode 100644 index 0000000..7b7b407 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-special.dtdinc b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-special.dtdinc new file mode 100644 index 0000000..2ea205f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-special.dtdinc @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc new file mode 100644 index 0000000..3f8f8e6 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-strict.dtd b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-strict.dtd new file mode 100644 index 0000000..8126d7e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-strict.dtd @@ -0,0 +1,979 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd new file mode 100644 index 0000000..59e6770 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd @@ -0,0 +1,1200 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..8a9356aa6ddfb46cb662bf97506ff8275d0ea303 GIT binary patch literal 2603 zcma)8&2tlF82@dPcGG3~3Qz$N7x_xlkDwxGTlor<7Sa|d))qzGY&Ok8vKu#BXfKZA z%^44zxp?rv8KvoHXSh1!#e*~Q$H+MTo=r&lv2;A-ec#>p`906?`P}^R?{CimoWes5 zM{uDV1}@5SNtUcEmo;3$sEVr^R9r}4O!n~vuE~CV8*-QsiOB?}RNT<83pWLJOHR`& zZfn?!Pvl`nmQUqwR>fQbcQhQpXDU8V;I4*4_#%NXReYtwRFPK@^Q@wRV>!#KWXyt> zw=;HiA#asz>wbn;nW^mP4b!@B&fCKZx_rCp`GEo>Qr@gOnOmU*W#d&dC@Dzh?wJqF zOxbkjGt+_ZxbwW*w&>f%tk|%91;-pTn8~l%yS>y9&Pa_c<9qXN8u(DpkRlZ(f<0|#T1iom8a3%g!Km7P(eo>$Z-{U0nl=Kv z7Sx95=mH!jAuEYKZghW%?P3JVU&WuE*%-DW=3$q0X%!k?gKR zYustcZ9LbZ|BCH#Ji+g6*p4k>JJ-P;tzy^QE2!97!R}n&&q&s>XBB(r`otQ4oh#Tk z(br!`PhTBxyau#C5=8kYNKJ}zQP%OwmxClSP{*5V_&jASe!^e)n{jQ#eH6PHle3KX zhg?76|D_?g_!!^e9KOeSJjMn5h>JvB#R|so9OL*C*QjHPTCU>-|7QJzn_-S5;xCw$ zv(y!%h9&A7qQ%EBF^rKgM=zThOwdL%Gt80X3^=fgLvzWuR&e+iB*XLD;d#H5i4vBH Q7Ai?YXSpe)DCKkhKM*~zO#lD@ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXCheckerFactory.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ncx/NCXCheckerFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..38270a157e2f8d922f4af46ae4e2df1664d76d29 GIT binary patch literal 1255 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..7165cf4f6b00c9c24711c1f355c1a3e9ee202920 GIT binary patch literal 855 zcma)4%Wl&^6g}e@OpIv*X?c}rTL~wix+@k0v1zdsDbPx#U9cNZrs=fKOfX|4zK9JA zka$QeShC=w5Z4bLLa~G_&&++Dd(NHt{^QG60Gn9zaSE5)aB;=QRjhcp=Ha@B8w@QY z4jI-*!b~GRHi?YnEKkId6ekgdqMfaHmx~iVkpqU)50zH-5yPGEe+qgB4DOa0ONPaf z((-9OO=R|rCn$e8Kg$ z6xr*UB~fATIfFO;W#0=&$NUwKl!=CVmfJm>Nj@F)=6V?%r5TnRg8rV#Ga;!liCCG> zXQSvAppBaWJe=`xE5L26GHf)Bc|Hz9r{tZI+Gr;^mV(5EO&E`LDPI{~O{JUzUBPNo z!JoTj=uV{F*Xl(shhwR&I#e=aSPJVIl?-TXH1YvSap^tLbD$rEKw4XLZo{YbELkxe z`T)QG8LWTzBb@hSIS6Q7pj=R{OWAG8K1bHYDw|@9WKms-$_TB4^EKuJ+KYaj{s%ap z(E0|?eFL}kmV6a*#b=>J46583k)9j6HO_t73vLd3_fKW_FD}k+E)JHkOf`&H7M(8r E1Xq>93;+NC literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..18a4cdbe5e5dee12cc5f7bf2e7faf9d589ea8e41 GIT binary patch literal 3542 zcmb7GS#uOs6#i~9neI%Q3=EqiqJtnN8Io~d!X`ulV-{k-Kme7_Op`QBx`*x_B<}mZ zi~EjL`HHBM(o|U`Z~EqozriX?euCw9dpbRXG%2mA>3i?F=X__q=iXoc{_!UOH{eVH zT^MUcC-%wDeih>h9Kb;phuUyI9#HUL0xAwG&=W{tLM{rDvnXeV{2Y-RlPabZmrq{9#`>10_*Uk zil762&k8i#g(Cv%1`GCdPA}RMM$RZ#CJIwV;aHAax!ryJBYNSOK51+eh&x8v zc07ShB)?uZbE7^7dD{)E;LMagqnP)MX;)zR;8FdAo~w9fDYr{^r#yY4BtcUJ+wyeN zGMq8JWEOSLb_CW(DmXb^%IzN-4EZR%G*DyOR!AnMYff6aS8|<*z8x+#$6suKPNoJFdYvt&OxYh*OP;P)q89yL78ql9Jg-Ng0D3wZt)^0W%Sj zVL<0KFAgaoMwtRagH8oJRVuwrP(-fi9a;r?9c zeGfCO;5iM?;{}16M~&kZ(=m#fXwHmdxW2-S>1L))*JZpFyr|(NyezOLss&tBNz$TM z1g?!@3=U6_4$1kdhS%`Ah8uB{hBxr0hPR|YZ{r<-m7#(4tVv%4Ixh!)NmWW6r!?G* zn;P-LoVyZF!!2?<+Tx2+Ez#c9unC)as(V-{3f|N3z6`6#Y4`via&kz+NBCI7C-_vs zXBs}o7Xqv1OG8H0vb~IMWmrO)Bh0FTFEyOTS1h+Ezk=vC^r$5cPeMJtTuH+ypOPC5 z!QwI?HhAn4qn)j_^04|B*U#PViK9k=J$)g$;0j>zPU&uNnwCeMg98FrM|oQBn>-hW zIR9+n z{6cndf6Vcr2)^{#8U2wh%pcjSIL07&k=2ZL#C^3992X)-vl;l~o4$mPm-aU)9-dJ}!R)yAm4vVU2@2(;#*NX>J zOL|+RM7o7|AL7n=gtVkeh~D@dQse2kWSYg&UL_q*D@01i&tVy%(s5#?miPJ$azT_^ zLljB%Q50!OT9KxxX(g>n1mzr7NCd(q=djYZT=HjUaRv2|oUTXF!YX>dkulrE2yW(T zE3U#erffUY&_~MM{O!Ol^kW!#jN%?VfB_uG5T3*cUckM)<3@1`W4tT&;SBa;mJk2) zIEY_x2*2_1|2q!j59s&{6MlvshDQ0d*g{=#qAbH*)TmJI8fx9j*?H3Xs8^Ml2{Jj1 zFK9`*p!WfiNKsBG%0Dpqe($(Ge0BfUCyI9tUvr;*Gyb6!Pe=xelO zhc=u&hc&5dt5_?}60TOBJ!s>6nk$Plo8?+&V5Qp*i`HdeD>VEB9Y0CKXZ*l)(VP@= z4C}pq5f6k#JP^3vFKaRpC?z+Ub(;l6(W#jLLI literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFHandler.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..55a05f87c5d5f1f44859d04abd7acb0ed98b6a55 GIT binary patch literal 1803 zcmbVM%W@M(6g@2oOBQ1s1SU^|!N%xed2C2XkR2S5aS+Il0*a){ONJuf_vVPBxselEX}rX$^+`8f1#x5xddP207@+XBnw z|A1F{Dv)b>T_rHvwq3Os4LZtyB0CN(rM72D=c)8(Jb9?%bDd z*HJ#%obIXc(TMQ*a%B=_BM7A*-gDGIxuHO|tXWMDRM(bIz8jK=;5Rv8s!kfqgc+CQ zipuSd;Lh1S*YkA+U-a!z1w&~OE?<7uY_)WvQ&ykaGV)oIT1daQ&V;RGdYxE$TUw#g zK669gvs4gJ>XsXXeq@EV=L%dapRDVoB^H|r)`mV^4*3f13PHAa-f1nXf?bc#qg|1 zYulh)ZqTqiHk*$ z8}Q1chJC#U1l}4q>3-+AvUtK1&&z(1PtWA1> zCtMI*=F2h*rbLF14%>obL3alKd46-az}>ew+o6Z{DOP`nsMdZ%<|nQ)c!%Q|WH~M( zhb2toD&FPlLgJ10@IF_Ji_zKt_yF@M<|_Y!d%2&H{gM9!Z7Q~vV-zFVPf-Le;u0;I z&kyv@@xNXD6`3RC+O;E`+T}1+${(TdJ?bkjQCTTX$BTtpsd$9bd-a!?tCx(}X4FbE zwEcqYxRQ%;)hpDXjv1_CnGbOt>uBHxnz$Krsxoh#^({~(UH5j%u7FMId4>FD_!=*A zH^ceTh;fa+x>_+#my~+zSgB%E>QyFBN^LPnmwF;_bHqm@|D!bD43v{hsGu63gFub5 tEUhd54!iX~VCxhsVY@}9T9y-R@5ZnT$>uS(CY6eHA=^Z=HHK%f{t7L=dfxy5 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFPackage.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ocf/OCFPackage.class new file mode 100644 index 0000000000000000000000000000000000000000..9fda51631e7ec3c009183bbde98d3c3fae159fd3 GIT binary patch literal 2075 zcma)7U31$+6g_LpR_rK^lO}ClC=h5`efs zpYRKK=|h;I$rNUoKEVt>is7uZwluNB@ZeqT-FweH_ns^H?|**#1Hb|vW-*Q%8JxpS z9iL^93=d24>2qnmmBlh{%i|Y1Rz{JwsxVZJqdSRJe-))#Q zm`~l-hTCwKdGC0(z;x{XuGKm4ty*xK>w50@U1ziIc)q*mI&Fc;(6wQC`{pCR?Rxt} zN#Axo*IyC1T!2XC0DTjtx?%;iW+7{{sn}C$Yx^U7Q|5PbN*d^%quyQTxN9rV7Pj-5)uy zI#thazod}EaGwffZOgmk1cgwoy`V~gbIh{owYolqbgV;x;;`^ArQ0-PuIzYsfeAMi=ZAZ=}XCxALUXHGT3#b~%VS>GhX1PDB z1}1Udzy`iHFokIycMWXfo`L(=5-6NCLZ^i{P{g)@GIk8?;(@@2XGKQ*I3fX|VA6JL z&m7zDag;Uh_RHkUR*)Je*>HiSc&o#(<(Rn264zUq*wLr~u~$rBgmS7msKn9LYpSr~ zAAz1wNk$4>iwFG|0oK8pGL`!vpvp8LxnA#$V2|G^m*Ih!;n!}QAH^hp909J7dIvkz z=B`6#M5JXCb&#?=5-U>4UDmdRb_Ns*?0#D}o*bYQ#^z!;%} zf)Tim0xhzQRYhci!HM!QM*f7Z{R}Pn>J-pSjL$@$&xERypOrqOO-R|ce9*RIWZojX zUHJ>QnC=S|BpuzsAoe*Ox@F~U?{jD(4JRl_Df(399$1> z0e58?=RkBZqR0ffwEYI;6%P(n5N#SoSU{}iXAc%JA{Z|rTJsLFz2_93ElxQrQ%(ma i&Sj|O&O>C!ddSO+vzj?uKiS-AYu8~V>(zy!Kt`3Ch-bHVCd+C`lZ=4Nm!w+GrN9v6#j-TY+F_?wV@ZWShr3+)<6&^r; zn{bJm_y9hX@ysp;q05h+nKS#H^PO|%oBsau;}?K=l+zeQK7|2HDKo9ioiqw4>M+yj zK|YBYwU&~YRqI?YEX*s!-6ZZQ=e~{yIv(nH#E|gpIzzrFLf8th?yW7@AARTvGTDU?wcG+_S;RaZ3VHNlin34R7M+?=JjQUF zJjxXEvT&!E6<=0~kZPhQPBli%Unr+SHO)gJJ%o0Q?gNx)mtcvX=-E1fo=F}f6@5!( z(zHKD?{^p)zGC4l?8*U(mxuNJ3+vZ#v7;h&VqyU^SValD^e3h|GNQUpJ0gYASr;b% E0-sDnjQ{`u literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/GenericContentCheckerFactory.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/GenericContentCheckerFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..e28c6a9cb9dec07746b07975ada300d839bb9a14 GIT binary patch literal 1271 zcmcIjU2hUW6g>kATNbpn^;=Yset=rn2V+cV`a*&+A=b1Fk;h>=z_hTt*$!&|l^+iz zn)n0!QN}y#hC*CweDGm+?ws6n=bm$Ce*FCU9l%r69M~w^c;Fy~N)8#U+t_euC2-Tm z7Q>SAPBr(0WO&{Z{>bG=epk9O7|x5Lpbf5VI#4w zX?#{5vHDVk#Ac_bDvq-p^< zI1JDJi5cHshLv+a_qxYY=nHz7pZ2sw=Re)nS{r40t2SuD^f^W+y=#kN@{0bKXy?+( zXw5vFfPJDMh0FBMMqm-k6q{5^z)D1CxPnze47pEeme%|?q&kltZ%>f^NZZ*GrKrU2 z@3goC5wM1Sy6Nwcj%BDintpeT8wz4<1;LC8k=c&la$_@ bYO6$bqxLeL39?^c8HKZi3hnL_mO|+lho4P^ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/OPFChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/OPFChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..f60693d27f79f636f2d704f5a958e4609792614f GIT binary patch literal 8864 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 y3)ZVMc8NJ$VUlM~)_)#Tn5D;h8H;#+vJ zG4a9&@S%+VnHVtPhKoI4J7>=CoH@V${QL#r1jj`b@U(;?_O!LHMO}-A7ELXl<#CXQ zD^O5!7SB~61*+X^|Euqf{b=a*5*0?n7Xqbm7|DRi+<*h?pU*xm%@=OKGQC8?JSvdKgd6y5NX4?F3X3zCAIk=6ggS$9% zuz|7z2Negmv{lk#6O}xU1di8uge4RUEqCCoe=P$(Y^J5hwZFzic*4~xatCdG#Gr%* zGn#Bhlh$YwQde~!5V&JvTrsw^MR||@H(1D1H{HV&!usc=-0c)ux0X$jbB|Kk z?v|Y*|D7i-+^5_zS+7X)nzMPs8{gs~+StWAH1Hk|c;?hFHc`W4daQwMa#_aOAz8*) dnmKDMO`S8A=C*lqm!8FrA5oV`TtJIetiPFw$^!rZ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker$Resource.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker$Resource.class new file mode 100644 index 0000000000000000000000000000000000000000..10314e63d632b3e848fc140f5e58f04ea43c8031 GIT binary patch literal 979 zcma)5O>fgc5Ph33C#j(&X@K%oXcI`?G;ZJs>LpS|rHD#R6+vzrXB%(gkH~hA`ja?v zuquJX58y{3X19=nddb0WW@l$S@6GQ1{PpbzfJ3|~VGWHkOuSUyD+NsjdkQQC`vzKN z6t5Ew4A=$^8H$mJ!$sr>hDvYBKXcpT!Nl$-kqjnpY2TN=IKQ0JzQF^>4WpQ$cAdFM zq-Ve9v77LbCn(vFL4Pg-%4I`_O_#?5?#b~Fyy-7m=vw|NZ5ykKN8WolB?zwI@}xZNUHUpU{0x^v7If)YMumvh`Jt+V?jIZ zRruBamXpj}qNiW(>ti~Ws`bV{lW40`GjSgeOl+ZJVjXu)+)+?L)x@TP8mbIceZK#n znu!hEGw_=_S|NpD zeMj-r6-p_}U#U2QCxkonLI4*fNTM^PmNRPLVH-Xg20B_LPL2_LPXc_LPhQW$w}{gF1}@D3gFSw5dzxH!w)tr~m)} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/opf/XRefChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..bc8d6f7c36e6d5dcb1587bee1a7b94a2b78f1612 GIT binary patch literal 6439 zcmcIo3w&E;75{%p+N9~-D-f{j*h1H_Eo;{~6rr1Ym2L}k>uBpnr!vyywhc{_cylv` zii&`|RS*X&%22=}pfK24#^m8^6I2jIMdYCGA_R384%y?NZy6f3`<+wb1{J&9KYVuQb29yTd0i{g zyS=#1i!b;w4Lg1KqI|EH*A0G5#f@Hk$&Vn0Me-&ezFfu5%|6`X#jSqS;wwIU)sNe7 zyBB->n1efHmpgsfD}(#wH6pK3KX2~_^tr?o*&=GL-Kl9xEj>v+0}>(-pKxDy17O$!IpKXB8?}r(*qS zL!qie@6`=GB{Kewu5IgDH@0>}S`<`7VMAOU0*S7XGC$+Y8$$*=hIMCVE-PYQ_R9vf(iW)e*umIP(p=~%BqeOWrw!w+c94;lzrDb}r-mU}8}3 zIx9oC-bAW1Lk@JstqO6a>CFnOE(}LtCdWFT4u~mJ+Ks4Hn0vN|#TQ)g76CkY48nMC#yc_J5PFtax z{#=@s-dZEtH>juRz@$L$^w4bm^byN_i>S!Wy+91mG)ac}$U%x8s^#({ZM@bcY)$0` zbt7sf(kTi|9lMpn(g_@Xtjp1ig-rxlWi%hQ8YYF%K78)(@3g|;+JxML=?<4(EI~s< z5|=VKlnEdjdJy9Yj-6uI&=7~{DoxnILPIb5G@O9}4gE-H_yvBcP-lr*t{zDy^}c9w zwb4iOq|DYGF+C$TQaGX{WM88-xn7c|@5ghQWFi(d^$;DUv%~L%`_$6ziFk8JAv~FlY}3m&zgMV;N6l!n z7cXe|171{UoQ#Iz$%~SgH2e{NVknra;m`PshQH!(^7^}mb8()Af8b>={;A<#__u~v z@T!JS<8lobV7nKuX?PtkYRF-`hL7MBYMDUHnPlR>zF$U*DZtv>%O=5oWUxBk+o0f`xs}~x2KjZbOibQkVLvnMo%&I zG&on})2nlZGgL6r`OLIE!mzPmyc{Kh|vY7>T^fg{;x5vbmnDRdq3gEFj(S`^e(*<32s9OBSMqYYN^{ zCV2--ScC2MUWd!n8(bV=3makJhtqehCUg{5z4t%OZkjHCI>@nrt2nSvT@!YTZr)xn+% zo$Plx`tMol!!<6X`JPRUz=z?1!Jq0TW@0<$;cSGNw43lzWH=kL_rM1zBmb62r9}kN5_B%M zvs`Oq8ipU0oLd>*3(ukvOgV_z2Qan!0HzVg^uUY}1UMWR!C|8~{60(S0D|4&MGZ#< zJ;91m95I3;x0E0T2o9_`s&O8UA>|dUFa*{Ldz&Jxl~Qb2uvSXGCM<%GY-_<^DH+?+ zv{F(j{}P}``|LdEr}-BJ0XTrJk5bAhTHm*7;2`yZ8xR5P5&N>UB9KyN9LwKI3e4JZV!qph4 z8^PS;DuNZ)(9-T;#R%$~D;t9qp3_G#uh~0{s>bF@)$Aqkn#vk)&@+N#O0E+oR^VEq z-p$r^wC?pd5;xGJZ={un>AyGOSlmoExz%FROQ{g8CU`4(2iz83xgo2H3|AEyt|~HI zg^ThGSLH1qz+zlX{uSI~dS2hL)GYkv4qw8vw(pBLs@&mvIfD_*Z(Fn<3lw%C$i_m2 z`!Q!jxM39G;n$xpF`H?f;BB-YM1CjcVz0$S?rbf0zli=M7ok3n--lWF zB>juOv87tKF?e33Bu~XN&vO60kZa2uu%Y1)F5po0B5SB&2us=1*lXmoxNxJJwXoevZ4DWK_Sr_yqWz&t}jb zlkxxMVN8epltc3_2Q8tN;7mf2Lt*=e~$;k((E zMf?Pu$~m@T2v(mA=xMY=>*#dG9?KX&ZkZS2a}Q?ld#(-4=HV=%EHPAeyVqJwbJZkBsCl@o8BK%7)-#1E~jQMD#ilrc=gOH1aP(_D6)|D9APC#7enEd literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSChecker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..a0fc80d1d6733e547147dae01fcc6d860e696d5d GIT binary patch literal 2530 zcma)8T~ixX7=D%nc3GCvhPIYk>DE%3FW7=ss-e&}6sd*}0g+UzZZ;dTknC=EHwd?# z@!lD|P_Lcooil0^rZD3V@JBhmXA=@gwu~1!=RIfN&*%L(`RCumzX9CAzK9!`?S+g7 zY0t#Ef1APjzh@O3LHiI^hsGx&#$Q3j=H6%IP^HWZ8;tXIgnqq4Q18mAl|U8dPNSA%(l9#Dkat2Qr0}j zFt_NNP&Uf?`o67m=-YGjLYkS=9S*kw^;&j8*<5Y1k%Du3MXy}iP)kN$^(+z`4HVof zmz2%LOp}i!C3knLd8UY_4b$*uIQ$R|)X)Y&AkT@gJA)0l352>W#MlNQn6~nS&_Kp8 z^`%NVr#tIvu0%JHjHRg*y<@O*<1*|O4flbNWoHv{8rpjl@k9U@6AsAj&zMBY$Ab-N8Nk`bo0QUh^u&8j$>K5wv)23p>Yvx1SJ zU`oPGj7YeJQ3uXte**?=2`V=Ln)2MI{1iVI4G1>D|6`99fysU zXn^G>of=sWiBvpu^{U~J{eKgs1#)9N2KHXdu@p1(ELiucicEF-7^u2^x-$L!YCcbc zv)SFZ&$M^k-c0gD(HtkBM}J;XOEhRsCAnTwDVAi3teu$2u``V|8GRsl+p#p=ZCBoa zGPXhQtxP|vc<}TD(>$RSY^3-*O%;Eqnd0v>U}zUu*ZDj3A?+cOSLpfXFhQrE(1jk_ z<@f=(c%q7~c(RI6e5{Iae5kvM?)Xr+ik?4+rwfy`4*Rwhgh@v)={QHXgLn@^cpuks zmndMSu9I%=(uuVDzH&aryzTNS=5NTSn8#tCVm^11Zy#W)?jbiqXU26He?`u{LbwM0 zS0srFaiJp!*#q=O#2WhQ-})jF(KYnH#_^PvXFR}fc!=MTMip~-jd>qWnGkqE68A`sBhFEhP5CGuHZT@2eT*1k q&hP?;j&Lm-dFKGbf8nZ6U-#)N%puNCrsyk4l3QbRbD!?JF!LYpmz7Nb literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSCheckerFactory.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSCheckerFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..445498dd18f4fd6d4f2f24acec7b70d817849065 GIT binary patch literal 1275 zcmd5*U2hUW6g>kAlm(?$t)kU_&{nYG`cBgq5)u<4O=%kYI7|oF0y~>!QTs3aDSkYV z*u)>;k22m_SGw9UzWT5`_ukxd?>*^`;^Bgk;!j3pH{0nd(VL`m>%GN-=VjKXp2X-KKVA(BdLg!9{~1yYG5#c)*aZ z)=n6#raGeNct)W8|`!chC5^K4V-QmxZc1NF%#`Oua9IuX4=^6n z!ISg|HIU(z`t|DH2%Go6v@gc-4Y0dv76{pL^}biHU6$v1_#z4@GHjWZPqxsR)gtn+ z8EXGdk8dQy@|8xN-nkSZL){GjbAyW#@BgzKc!EuOt2xlJ>9e&a^sX(kNlg0RAkU$b z(V2NV2m44y3ODJWje_eak*!lH0m~7b;TBdXqQN67o~5&NiPY)dvwGPoXXZ$Mpir_* zB`S09Gc_(lAl$~CsB{T;u}TOXyNCNoM^>3EE3zKoA+^tA4Ugi+YY~pPe1fIBvBc0d gV*7Z(uM*V-3YW;7&XN5LOS4P@cF9|(SPC0I0Fxz482|tP literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSHandler.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/OPSHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..c408c47d23041b34c0b47e96f7186c9b448e9bf0 GIT binary patch literal 6817 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 JIah-Z|1Yp|XAS@W literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/registeredSchemas.txt b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/registeredSchemas.txt new file mode 100644 index 0000000..6c4428f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/ops/registeredSchemas.txt @@ -0,0 +1,74 @@ +aaa:// +aaas:// +acap:// +cap:// +cid: +crid:// +data: +dav: +dict:// +dns:// +fax: +file:// +ftp:// +go:// +gopher:// +h323: +http:// +https:// +icap:// +im: +imap:// +info: +ipp:// +iris: +iris.beep: +iris.xpc: +iris.xpcs: +iris.lwz: +ldap:// +mailto: +mid: +modem: +msrp:// +msrps:// +mtqp:// +mupdate:// +news:// +nfs:// +nntp:// +opaquelocktoken: +pop:// +pres: +rtsp:// +service: +shttp:// +sip: +sips: +snmp:// +soap.beep:// +soap.beeps:// +tag: +tel: +telnet:// +tftp:// +thismessage: +tip:// +tv: +urn: +vemmi:// +xmlrpc.beep:// +xmlrpc.beeps:// +xmpp:// +z39.50r:// +z39.50s:// +afs: +dtn: +iax: +mailserver: +pack:// +tn3270: +prospero:// +snews:// +videotex: +wais:// diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/container.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/container.rng new file mode 100644 index 0000000..901d65a --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/container.rng @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-svg.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-svg.rng new file mode 100644 index 0000000..73cd553 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-svg.rng @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-xhtml.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-xhtml.rng new file mode 100644 index 0000000..5a63a6a --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content-xhtml.rng @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content.rng new file mode 100644 index 0000000..3c20017 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/content.rng @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/dtbook-2005-2.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/dtbook-2005-2.rng new file mode 100644 index 0000000..42fe625 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/dtbook-2005-2.rng @@ -0,0 +1,4110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + xxx + xxp + xlx + xlp + bxx + bxp + blx + blp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2005-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + required + optional + + + + + + + + + + + + + + + + + + + + + required + optional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + front + normal + special + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ol + ul + pl + + + + + + + + + 1 + a + A + i + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + col + rowgroup + colgroup + + + + + + void + above + below + hsides + lhs + rhs + vsides + box + border + + + + + + none + groups + rows + cols + all + + + + + + + + left + center + right + justify + char + + + + + + + + + + + + + + + + + + + + top + middle + bottom + baseline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/encryption.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/encryption.rng new file mode 100644 index 0000000..9cbf3d8 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/encryption.rng @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx-old.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx-old.rng new file mode 100644 index 0000000..dae2370 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx-old.rng @@ -0,0 +1,253 @@ + + + + + + 2005-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx.rng new file mode 100644 index 0000000..2b1d14a --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ncx.rng @@ -0,0 +1,295 @@ + + + + + + + + + 2005-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf.rng new file mode 100644 index 0000000..83b1cac --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf12.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf12.rng new file mode 100644 index 0000000..a63b77d --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf12.rng @@ -0,0 +1,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf20.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf20.rng new file mode 100644 index 0000000..f3f9142 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/opf20.rng @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops/ops-switch.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops/ops-switch.rng new file mode 100644 index 0000000..5dd7954 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops/ops-switch.rng @@ -0,0 +1,51 @@ + + + + + OPS conditional processing: switch, case and default elements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.nrl b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.nrl new file mode 100644 index 0000000..64c3f05 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.nrl @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.rng new file mode 100644 index 0000000..619cade --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/ops20.rng @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/signatures.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/signatures.rng new file mode 100644 index 0000000..9bd9a12 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/signatures.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animation.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animation.rng new file mode 100644 index 0000000..788166e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animation.rng @@ -0,0 +1,412 @@ + + + + + SVG 1.1 Animation Module + file: svg-animation.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-animation.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Animation + + animate, set, animateMotion, animateColor, animateTransform, mpath + + This module declares markup to provide support for animation. + + + + SVG.Animation.class + + + + + + + + + + + + + + + + + + + SVG.Animation.attrib + + + + + + + + + + + + + SVG.AnimationAttribute.attrib + + + + + + + + + + + + + + + + SVG.AnimationTiming.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + always + never + whenNotActive + + + + + + + + + + + + + remove + freeze + + + + + + + + SVG.AnimationValue.attrib + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.AnimationAddtion.attrib + + + + + + + + + + + replace + sum + + + + + + + none + sum + + + + + + + + animate: Animate Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + set: Set Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateMotion: Animate Motion Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateColor: Animate Color Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateTransform: Animate Transform Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate + scale + rotate + skewX + skewY + + + + + + + mpath: Motion Path Element + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng new file mode 100644 index 0000000..aeaf682 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng @@ -0,0 +1,61 @@ + + + + + SVG 1.1 Animation Events Attribute Module + file: svg-animevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-animevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Animation Events Attribute + + onbegin, onend, onrepeat, onload + + This module defines the AnimationEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng new file mode 100644 index 0000000..df313f9 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng @@ -0,0 +1,129 @@ + + + + + SVG 1.1 Basic Clip Module + file: svg-basic-clip.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-clip.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Clip + + clipPath + + This module declares markup to provide support for clipping. + + + + Datatypes + + + + + + + + SVG.Clip.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Clip.class + + + + + + + + + + + + + + + clipPath: Clip Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng new file mode 100644 index 0000000..d57e037 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng @@ -0,0 +1,870 @@ + + + + + SVG 1.1 Basic Filter Module + file: svg-basic-filter.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-filter.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Filter + + filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, + feFlood, feGaussianBlur, feImage, feMerge, feMergeNode, feOffset, + feTile, feFuncR, feFuncG, feFuncB, feFuncA + + This module declares markup to provide support for filter effect. + + + + Datatypes + + + + + + + + + + + + SVG.Filter.attrib + + + + + + + + + + + + + + + + + SVG.FilterColor.attrib + + + + + + + + + + + auto + sRGB + linearRGB + inherit + + + + + + + + SVG.Filter.class + + + + + + + + + + + + + + + SVG.FilterPrimitive.class + + + + + + + + + + + + + + + + + + + + + + + + SVG.FilterPrimitive.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.FilterPrimitiveWithIn.attrib + + + + + + + + + + + + + + + + filter: Filter Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + feBlend: Filter Effect Blend Element + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + multiply + screen + darken + lighten + + + + + + + feColorMatrix: Filter Effect Color Matrix Element + + + + + + + + + + + + + + + + + + + + + + + + + + matrix + saturate + hueRotate + luminanceToAlpha + + + + + + + + + + feComponentTransfer: Filter Effect Component Transfer Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feComposite: Filter Effect Composite Element + + + + + + + + + + + + + + + + + + + + + + + + + + + over + in + out + atop + xor + arithmetic + + + + + + + + + + + + + + + + + + + + + + + + + + + feFlood: Filter Effect Flood Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feGaussianBlur: Filter Effect Gaussian Blur Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feImage: Filter Effect Image Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feMerge: Filter Effect Merge Element + + + + + + + + + + + + + + + + + + + + + + + feMergeNode: Filter Effect Merge Node Element + + + + + + + + + + + + + + + + + + + + + + + + + + + feOffset: Filter Effect Offset Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTile: Filter Effect Tile Element + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncR: Filter Effect Function Red Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncG: Filter Effect Function Green Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncB: Filter Effect Function Blue Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncA: Filter Effect Function Alpha Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-font.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-font.rng new file mode 100644 index 0000000..eb68203 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-font.rng @@ -0,0 +1,544 @@ + + + + + SVG 1.1 Basic Font Module + file: svg-basic-font.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-font.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Font + + font, font-face, glyph, missing-glyph, hkern, vkern, font-face-src, + font-face-uri, font-face-name + + This module declares markup to provide support for template. + + + + SVG.Font.class + + + + + + + + + + + + + + + + font: Font Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face: Font Face Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + glyph: Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + missing-glyph: Missing Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hkern: Horizontal Kerning Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vkern: Vertical Kerning Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face-src: Font Face Source Element + + + + + + + + + + + + + + + + + + + + + + + + font-face-uri: Font Face URI Element + + + + + + + + + + + + + + + + + + + + font-face-name: Font Face Name Element + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng new file mode 100644 index 0000000..6ab7361 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng @@ -0,0 +1,74 @@ + + + + + SVG 1.1 Basic Graphics Attribute Module + file: svg-basic-graphics-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-graphics-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Graphics Attribute + + display, visibility + + This module defines the Graphics attribute set. + + + + + + + inline + block + list-item + run-in + compact + marker + table + inline-table + table-row-group + table-header-group + table-footer-group + table-row + table-column-group + table-column + table-cell + table-caption + none + inherit + + + + + + + + + + visible + hidden + inherit + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng new file mode 100644 index 0000000..2839f7f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng @@ -0,0 +1,666 @@ + + + + + SVG 1.1 Basic Structure Module + file: svg-basic-structure.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-structure.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Structure + + svg, g, defs, desc, title, metadata, use + + This module declares the major structural elements and their attributes. + + + + +

+ + + Content Models (Default) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Attribute Collections (Default) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Description.class + + + + + + + + + + + + + + + + + SVG.Use.class + + + + + + + + + + + + + + + SVG.Structure.class + + + + + + + + + + + + + + + + + + SVG.Presentation.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + svg: SVG Document Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disable + magnify + + + + + + 1.1 + + + + + + + + + + + + + + + + + + + + + g: Group Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + defs: Definisions Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + desc: Description Element + + + + + + + + + + + + + + + + + + + + title: Title Element + + + + + + + + + + + + + + + + + + + + metadata: Metadata Element + + + + + + + + + + + + + + + + + + + use: Use Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-text.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-text.rng new file mode 100644 index 0000000..3a67492 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-basic-text.rng @@ -0,0 +1,273 @@ + + + + + SVG 1.1 Basic Text Module + file: svg-basic-text.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-text.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Text + + text, altGlyph, altGlyphDef, glyphRef + + This module declares markup to provide support for text. + + + + Datatypes + + + + + + + + + + + + SVG.Font.attrib + + + + + + + + + + + + + + + + + + + + + normal + italic + oblique + inherit + + + + + + + normal + bold + bolder + lighter + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + inherit + + + + + + + + SVG.Text.class + + + + + + + + + + + + + + + SVG.TextContent.class + + + + + + + + + + + + + + + text: Text Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyph: Alternate Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyphDef: Alternate Glyph Definition Element + + + + + + + + + + + + + + + + + + + + + glyphRef: Glyph Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-clip.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-clip.rng new file mode 100644 index 0000000..eacd793 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-clip.rng @@ -0,0 +1,37 @@ + + + + + SVG 1.1 Clip Module + file: svg-clip.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-clip.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Clip + + clipPath + + This module declares markup to provide support for clipping. + + + + + + + extend content model of clipPath + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-conditional.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-conditional.rng new file mode 100644 index 0000000..756f4ed --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-conditional.rng @@ -0,0 +1,124 @@ + + + + + SVG 1.1 Conditional Processing Module + file: svg-conditional.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-conditional.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Conditional Processing + + switch + + This module declares markup to provide support for conditional processing. + + + + Datatypes + + + + + + + + + + + + SVG.Conditional.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Conditional.class + + + + + + + + + + + + + + + switch: Switch Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng new file mode 100644 index 0000000..a2e958c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng @@ -0,0 +1,49 @@ + + + + + SVG 1.1 Container Attribute Module + file: svg-container-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-container-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Container Attribute + + enable-background + + This module defines the Container attribute set. + + + + + 'enable-background' property/attribute value (e.g., 'new', 'accumulate') + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng new file mode 100644 index 0000000..c8f0c81 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng @@ -0,0 +1,73 @@ + + + + + SVG 1.1 Core Attribute Module + file: svg-core-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-core-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Core Attribute + + id, xml:base, xml:lang, xml:space + + This module defines the core set of attributes that can be present on + any element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-cursor.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-cursor.rng new file mode 100644 index 0000000..d9ce19b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-cursor.rng @@ -0,0 +1,99 @@ + + + + + SVG 1.1 Cursor Module + file: svg-cursor.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-cursor.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Cursor + + cursor + + This module declares markup to provide support for cursor. + + + + Datatypes + + + + + + + + SVG.Cursor.attrib + + + + + + + + + + + + + + + + + SVG.Cursor.class + + + + + + + + + + + + + + + cursor: Cursor Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-datatypes.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-datatypes.rng new file mode 100644 index 0000000..82aee63 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-datatypes.rng @@ -0,0 +1,188 @@ + + + + + SVG 1.1 Datatypes Module + file: svg-datatypes.mod + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-datatypes.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Datatypes + + This module declares common data types for properties and attributes. + + + + feature specification + + + + + false + true + + + + + + 'clip-rule' or 'fill-rule' property/attribute value + + + nonzero + evenodd + inherit + + + + + + media type, as per [RFC2045] + + + + + + + a <coordinate> + + + + + + + a list of <coordinate>s + + + + + + + a <color> value + + + + + + + a <integer> + + + + + + + a language code, as per [RFC3066] + + + + + + + comma-separated list of language codes, as per [RFC3066] + + + + + + + a <ength> + + + + + + + a list of <length>s + + + + + + + a <number> + + + + + + + a list of <number>s + + + + + + + + opacity value (e.g., <number>) + + + + + + + a path data specification + + + + + + + 'preserveAspectRatio' attribute specification + + + \s*(none|xMinYMin|xMidYMin|xMaxYMin|xMinYMid|xMidYMid|xMaxYMid|xMinYMax|xMidYMax|xMaxYMax)\s+(meet|slice)?\s* + + + + + + script expression + + + + + + + An SVG color value (RGB plus optional ICC) + + + + + + + arbitrary text string + + + + + + + list of transforms + + + + + + + a Uniform Resource Identifier, see [URI] + + + + + + + 'viewBox' attribute specification + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng new file mode 100644 index 0000000..9d63bd4 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng @@ -0,0 +1,87 @@ + + + + + SVG 1.1 Document Events Attribute Module + file: svg-docevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-docevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Document Events Attribute + + onunload, onabort, onerror, onresize, onscroll, onzoom + + This module defines the DocumentEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extensibility.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extensibility.rng new file mode 100644 index 0000000..097a9e9 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extensibility.rng @@ -0,0 +1,125 @@ + + + + + SVG 1.1 Extensibility Module + file: svg-extensibility.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-extensibility.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + + Extensibility + + foreignObject + + This module declares markup to provide support for extensibility. + + + + SVG.Extensibility.class + + + + + + + + + + + + + + + + + + + foreignObject: Foreign Object Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + any element in foreign namespace + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng new file mode 100644 index 0000000..017b9e1 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng @@ -0,0 +1,42 @@ + + + + + SVG 1.1 External Resources Attribute Module + file: svg-extresources-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-extresources-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + External Resources Attribute + + externalResourcesRequired + + This module defines the External attribute set. + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-filter.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-filter.rng new file mode 100644 index 0000000..a7250bc --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-filter.rng @@ -0,0 +1,512 @@ + + + + + SVG 1.1 Filter Module + file: svg-filter.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-filter.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Filter + + filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, + feConvolveMatrix, feDiffuseLighting, feDisplacementMap, feFlood, + feGaussianBlur, feImage, feMerge, feMergeNode, feMorphology, feOffset, + feSpecularLighting, feTile, feTurbulence, feDistantLight, fePointLight, + feSpotLight, feFuncR, feFuncG, feFuncB, feFuncA + + This module declares markup to provide support for filter effect. + + + + + + + extend SVG.FilterPrimitive.class + + + + + + + + + + + + + feConvolveMatrix: Filter Effect Convolve Matrix Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + duplicate + wrap + none + + + + + + + + + + + + + + + + + feDiffuseLighting: Filter Effect Diffuse Lighting Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feDisplacementMap: Filter Effect Displacement Map Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R + G + B + A + + + + + + + R + G + B + A + + + + + + + feMorphology: Filter Effect Morphology Element + + + + + + + + + + + + + + + + + + + + + + + + + + erode + dilate + + + + + + + + + + + + feSpecularLighting: Filter Effect Specular Lighting Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTurbulence: Filter Effect Turbulence Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stitch + noStitch + + + + + + + fractalNoise + turbulence + + + + + + + feDistantLight: Filter Effect Distant Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fePointLight: Filter Effect Point Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feSpotLight: Filter Effect Spot Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-font.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-font.rng new file mode 100644 index 0000000..e545cfb --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-font.rng @@ -0,0 +1,146 @@ + + + + + SVG 1.1 Font Module + file: svg-font.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-font.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Font + + font, font-face, glyph, missing-glyph, hkern, vkern, font-face-src, + font-face-uri, font-face-format, font-face-name, definition-src + + This module declares markup to provide support for template. + + + + + + font-face: Font Face Element + + + + + + + + + + glyph: Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + missing-glyph: Missing Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face-uri: Font Face URI Element + + + + + + + + + + font-face-format: Font Face Format Element + + + + + + + + + + + + + + + + + + + + + + definition-src: Definition Source Element + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-gradient.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-gradient.rng new file mode 100644 index 0000000..425eff1 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-gradient.rng @@ -0,0 +1,259 @@ + + + + + SVG 1.1 Gradient Module + file: svg-gradient.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-gradient.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Gradient + + linearGradient, radialGradient, stop + + This module declares markup to provide support for gradient fill. + + + + Datatypes + + + + + + + + SVG.Gradient.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Gradient.class + + + + + + + + + + + + + + + + linearGradient: Linear Gradient Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + pad + reflect + repeat + + + + + + + radialGradient: Radial Gradient Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + pad + reflect + repeat + + + + + + + stop: Stop Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng new file mode 100644 index 0000000..edc7741 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng @@ -0,0 +1,124 @@ + + + + + SVG 1.1 Graphical Element Events Attribute Module + file: svg-graphevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-graphevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Graphical Element Events Attribute + + onfocusin, onfocusout, onactivate, onclick, onmousedown, onmouseup, + onmouseover, onmousemove, onmouseout, onload + + This module defines the GraphicalEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng new file mode 100644 index 0000000..15029e5 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng @@ -0,0 +1,95 @@ + + + + + SVG 1.1 Graphics Attribute Module + file: svg-graphics-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-graphics-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Graphics Attribute + + display, image-rendering, pointer-events, shape-rendering, + text-rendering, visibility + + This module defines the Graphics attribute set. + + + + + + + + + auto + optimizeSpeed + optimizeQuality + inherit + + + + + + + + + + visiblePainted + visibleFill + visibleStroke + visible + painted + fill + stroke + all + none + inherit + + + + + + + + + + auto + optimizeSpeed + crispEdges + geometricPrecision + inherit + + + + + + + + + + auto + optimizeSpeed + optimizeLegibility + geometricPrecision + inherit + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng new file mode 100644 index 0000000..d13ba49 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng @@ -0,0 +1,106 @@ + + + + + SVG 1.1 Hyperlinking Module + file: svg-hyperlink.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-hyperlink.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Hyperlinking + + a + + This module declares markup to provide support for hyper linking. + + + + + link to this target + + + + + + SVG.Hyperlink.class + + + + + + + + + + + + + + + a: Anchor Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-image.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-image.rng new file mode 100644 index 0000000..78bca9e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-image.rng @@ -0,0 +1,104 @@ + + + + + SVG 1.1 Image Module + file: svg-image.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-image.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Image + + image + + This module declares markup to provide support for image. + + + + SVG.Image.class + + + + + + + + + + + + + + + image: Image Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-marker.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-marker.rng new file mode 100644 index 0000000..311d59f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-marker.rng @@ -0,0 +1,161 @@ + + + + + SVG 1.1 Marker Module + file: svg-marker.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-marker.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Marker + + marker + + This module declares markup to provide support for marker. + + + + Datatypes + + + + + + + + SVG.Marker.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Marker.class + + + + + + + + + + + + + + + marker: Marker Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + strokeWidth + userSpaceOnUse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-mask.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-mask.rng new file mode 100644 index 0000000..929fc07 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-mask.rng @@ -0,0 +1,148 @@ + + + + + SVG 1.1 Mask Module + file: svg-mask.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-mask.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Mask + + mask + + This module declares markup to provide support for masking. + + + + + Datatypes + + + + + + + + SVG.Mask.attrib + + + + + + + + + + + + + + + + + SVG.Mask.class + + + + + + + + + + + + + + + mask: Mask Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng new file mode 100644 index 0000000..9ba06c5 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng @@ -0,0 +1,60 @@ + + + + + SVG 1.1 Paint Opacity Attribute Module + file: svg-opacity-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-opacity-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Paint Opacity Attribute + + opacity, fill-opacity, stroke-opacity + + This module defines the Opacity attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng new file mode 100644 index 0000000..9aea366 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng @@ -0,0 +1,207 @@ + + + + + SVG 1.1 Paint Attribute Module + file: svg-paint-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-paint-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Paint Attribute + + fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, + stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color, + color-interpolation, color-rendering + + This module defines the Paint and Color attribute sets. + + + + + a 'fill' or 'stroke' property/attribute value: <paint> + + + + + + + 'stroke-dasharray' property/attribute value + (e.g., 'none', list of <number>s) + + + + + + + 'stroke-dashoffset' property/attribute value (e.g., 'none', <legnth>) + + + + + + + 'stroke-miterlimit' property/attribute value (e.g., <number>) + + + + + + + 'stroke-width' property/attribute value (e.g., <length>) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + butt + round + square + inherit + + + + + + + + + + miter + round + bevel + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + sRGB + linearRGB + inherit + + + + + + + + + + auto + optimizeSpeed + optimizeQuality + inherit + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-pattern.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-pattern.rng new file mode 100644 index 0000000..899cc99 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-pattern.rng @@ -0,0 +1,138 @@ + + + + + SVG 1.1 Pattern Module + file: svg-pattern.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-pattern.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Pattern + + pattern + + This module declares markup to provide support for pattern fill. + + + + SVG.Pattern.class + + + + + + + + + + + + + + + pattern: Pattern Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-profile.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-profile.rng new file mode 100644 index 0000000..4bf6072 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-profile.rng @@ -0,0 +1,92 @@ + + + + + SVG 1.1 Color Profile Module + file: svg-profile.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-profile.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Color Profile + + color-profile + + This module declares markup to provide support for color profile. + + + + SVG.Profile.attrib + + + + + + + + + + + + + + + SVG.Profile.class + + + + + + + + + + + + + + + color-profile: Color Profile Element + + + + + + + + + + + + + + + + + + + + + + + + + + auto + perceptual + relative-colorimetric + saturation + absolute-colorimetric + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-qname.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-qname.rng new file mode 100644 index 0000000..2a13e0d --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-qname.rng @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-script.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-script.rng new file mode 100644 index 0000000..1ddaf8a --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-script.rng @@ -0,0 +1,64 @@ + + + + + SVG 1.1 Scripting Module + file: svg-script.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-script.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Scripting + + script + + This module declares markup to provide support for scripting. + + + + SVG.Script.class + + + + + + + + + + + + + + + script: Script Element + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-shape.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-shape.rng new file mode 100644 index 0000000..5f788bf --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-shape.rng @@ -0,0 +1,433 @@ + + + + + SVG 1.1 Shape Module + file: svg-shape.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-shape.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Shape + + path, rect, circle, line, ellipse, polyline, polygon + + This module declares markup to provide support for graphical shapes. + + + + + a list of points + + + + + + SVG.Shape.class + + + + + + + + + + + + + + + + + + + + + path: Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect: Rectangle Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + circle: Circle Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + line: Line Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ellipse: Ellipse Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + polyline: Polyline Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + polygon: Polygon Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-structure.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-structure.rng new file mode 100644 index 0000000..97ac566 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-structure.rng @@ -0,0 +1,92 @@ + + + + + SVG 1.1 Structure Module + file: svg-structure.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-structure.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Structure + + svg, g, defs, desc, title, metadata, symbol, use + + This module declares the major structural elements and their attributes. + + + + + + + extend SVG.Structure.class + + + + + + + + symbol: Symbol Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-style.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-style.rng new file mode 100644 index 0000000..ed2aa2c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-style.rng @@ -0,0 +1,121 @@ + + + + + SVG 1.1 Style Module + file: svg-style.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-style.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Style + + style + + This module declares markup to provide support for stylesheet. + + + + Datatypes + + + + + + + + + + + + + comma-separated list of media descriptors. + + + + + + SVG.Style.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Style.class + + + + + + + + + + + + + + + style: Style Element + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-text.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-text.rng new file mode 100644 index 0000000..6aece2b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-text.rng @@ -0,0 +1,627 @@ + + + + + SVG 1.1 Text Module + file: svg-text.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-text.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Text + + text, tspan, tref, textPath, altGlyph, altGlyphDef, altGlyphItem, + glyphRef + + This module declares markup to provide support for alternate glyph. + + + + + + Datatypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Text.attrib + + + + + + + + + + + lr-tb + rl-tb + tb-rl + lr + rl + tb + inherit + + + + + + + + SVG.TextContent.attrib + + + + + + + + + + + auto + baseline + before-edge + text-before-edge + middle + central + after-edge + text-after-edge + ideographic + alphabetic + hanging + mathematical + inherit + + + + + + + + + + + + ltr + rtl + inherit + + + + + + + auto + use-script + no-change + reset-size + ideographic + alphabetic + hanging + mathematical + central + middle + text-after-edge + text-before-edge + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + start + middle + end + inherit + + + + + + + + + + + + normal + embed + bidi-override + inherit + + + + + + + + + + + + + + + + + + + + + normal + wider + narrower + ultra-condensed + extra-condensed + condensed + semi-condensed + semi-expanded + expanded + extra-expanded + ultra-expanded + inherit + + + + + + + normal + small-caps + inherit + + + + + + + + extend SVG.Text.class + + + + + + + + + extend SVG.TextContent.class + + + + + + + + + + text: Text Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + tspan: Text Span Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + tref: Text Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + textPath: Text Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + align + stretch + + + + + + + auto + exact + + + + + + + altGlyph: Alternate Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyphDef: Alternate Glyph Definition Element + + + + + + + + + + + + altGlyphItem: Alternate Glyph Item Element + + + + + + + + + + + + + + + + + + + + + glyphRef: Glyph Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-view.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-view.rng new file mode 100644 index 0000000..15e790e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-view.rng @@ -0,0 +1,83 @@ + + + + + SVG 1.1 View Module + file: svg-view.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-view.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + View + + view + + This module declares markup to provide support for view. + + + + SVG.View.class + + + + + + + + + + + + + + + view: View Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disable + magnify + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng new file mode 100644 index 0000000..60f0ed0 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng @@ -0,0 +1,64 @@ + + + + + SVG 1.1 Viewport Attribute Module + file: svg-viewport-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-viewport-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Viewport Attribute + + clip, overflow + + This module defines the Viewport attribute set. + + + + + 'clip' property/attribute value (e.g., 'auto', rect(...)) + + + + + + + + + + + + + + + + + visible + hidden + scroll + auto + inherit + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng new file mode 100644 index 0000000..e28200b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng @@ -0,0 +1,194 @@ + + + + + SVG 1.1 XLink Attribute Module + file: svg-xlink-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-xlink-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + XLink Attribute + + type, href, role, arcrole, title, show, actuate + + This module defines the XLink, XLinkRequired, XLinkEmbed, and + XLinkReplace attribute set. + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + other + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + other + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + embed + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + new + replace + + + + + + onRequest + + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg11.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg11.rng new file mode 100644 index 0000000..d3ed76c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/svg11.rng @@ -0,0 +1,231 @@ + + + + + RELAX NG schema for SVG 1.1 + file: svg11.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + + The Scalable Vector Graphics (SVG) + Copyright 2001, 2002 World Wide Web Consortium + (Massachusetts Institute of Technology, Institut National de + Recherche en Informatique et en Automatique, Keio University). + All Rights Reserved. + + Permission to use, copy, modify and distribute this RELAX NG schema + for SVG and its accompanying documentation for any purpose and without + fee is hereby granted in perpetuity, provided that the above copyright + notice and this paragraph appear in all copies. The copyright holders + nor the author make no representation about the suitability of this + RELAX NG schema for any purpose. + + It is provided "as is" without expressed or implied warranty. + + Author: Masayasu Ishikawa (mimasa@w3.org) + $Id: svg11.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + This is the driver file for version 1.1 of the SVG RELAX NG schema. + + The DTD version is identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//DTD SVG 1.1//EN" + SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" + + Use this URI to identify the default namespace: + + "http://www.w3.org/2000/svg" + + + + + Container Attribute Module + + + + + + Viewport Attribute Module + + + + + + Paint Attribute Module + + + + + + Paint Opacity Attribute Module + + + + + + Graphics Attribute Module + + + + + + Document Events Attribute Module + + + + + + Graphical Element Events Attribute Module + + + + + + Animation Events Attribute Module + + + + + + XLink Attribute Module + + + + + + External Resources Attribute Module + + + + + + Structure Module (required) + + + + + + Conditional Processing Module + + + + + + Image Module + + + + + + Style Module + + + + + + Shape Module + + + + + + Text Module + + + + + + Marker Module + + + + + + Color Profile Module + + + + + + Gradient Module + + + + + + Pattern Module + + + + + + Clip Module + + + + + + Mask Module + + + + + + Filter Module + + + + + + Cursor Module + + + + + + Hyperlinking Module + + + + + + View Module + + + + + + Scripting Module + + + + + + Animation Module + + + + + + Font Module + + + + + + Extensibility Module + + + + + + The root element is "svg". + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xenc-schema.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xenc-schema.rng new file mode 100644 index 0000000..972a879 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xenc-schema.rng @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/applet.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/applet.rng new file mode 100644 index 0000000..dbdef46 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/applet.rng @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/attribs.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/attribs.rng new file mode 100644 index 0000000..2616a5c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/attribs.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/base.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/base.rng new file mode 100644 index 0000000..e0f30bf --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/base.rng @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-form.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-form.rng new file mode 100644 index 0000000..d0c4075 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-form.rng @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + get + post + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + checked + + + + + + + + + + + + + + + + + + + + + + + + + text + password + checkbox + radio + submit + reset + hidden + + + + + + + + + + + + + + + + + + + + + + + + + multiple + + + + + + + + + + selected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-table.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-table.rng new file mode 100644 index 0000000..5855b4d --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/basic-table.rng @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + + + + + top + middle + bottom + + + + + + + + + + row + col + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/bdo.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/bdo.rng new file mode 100644 index 0000000..7e5c7c6 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/bdo.rng @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/csismap.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/csismap.rng new file mode 100644 index 0000000..02004b8 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/csismap.rng @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + nohref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect + circle + poly + default + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/datatypes.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/datatypes.rng new file mode 100644 index 0000000..eac3e34 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/datatypes.rng @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/edit.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/edit.rng new file mode 100644 index 0000000..c9c0f13 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/edit.rng @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/events.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/events.rng new file mode 100644 index 0000000..a408c1e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/events.rng @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/form.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/form.rng new file mode 100644 index 0000000..80dd016 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/form.rng @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disabled + + + + + readonly + + + + + + + + + + + + + + + + + + + + image + button + + + + + + + disabled + + + + + + + + + + + + + disabled + + + + + + + + + + + + + + + + + + + + + + + disabled + + + + + + + + + + + disabled + + + + + readonly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + button + submit + reset + + + + + + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/frames.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/frames.rng new file mode 100644 index 0000000..c3887d9 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/frames.rng @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + noresize + + + + + + yes + no + auto + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/hypertext.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/hypertext.rng new file mode 100644 index 0000000..e880ebb --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/hypertext.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/iframe.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/iframe.rng new file mode 100644 index 0000000..07a9187 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/iframe.rng @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + auto + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/image.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/image.rng new file mode 100644 index 0000000..6bc5d6c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/image.rng @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/inlstyle.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/inlstyle.rng new file mode 100644 index 0000000..e7342fb --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/inlstyle.rng @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/legacy.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/legacy.rng new file mode 100644 index 0000000..19e1983 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/legacy.rng @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + all + right + none + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + left + center + right + + + + + + noshade + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + bottom + left + right + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nowrap + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + left + all + right + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/link.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/link.rng new file mode 100644 index 0000000..8361603 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/link.rng @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/list.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/list.rng new file mode 100644 index 0000000..cc5c42e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/list.rng @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/meta.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/meta.rng new file mode 100644 index 0000000..cf58c86 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/meta.rng @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/nameident.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/nameident.rng new file mode 100644 index 0000000..59b260c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/nameident.rng @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/object.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/object.rng new file mode 100644 index 0000000..70f4df0 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/object.rng @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + declare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/param.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/param.rng new file mode 100644 index 0000000..88e887f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/param.rng @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + data + ref + object + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/pres.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/pres.rng new file mode 100644 index 0000000..3a0cf84 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/pres.rng @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ruby.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ruby.rng new file mode 100644 index 0000000..ace6e9c --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ruby.rng @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/script.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/script.rng new file mode 100644 index 0000000..7d2017b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/script.rng @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + defer + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ssismap.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ssismap.rng new file mode 100644 index 0000000..460c54f --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/ssismap.rng @@ -0,0 +1,14 @@ + + + + + + + + + ismap + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/struct.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/struct.rng new file mode 100644 index 0000000..a68fe9b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/struct.rng @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/style.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/style.rng new file mode 100644 index 0000000..610b8f4 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/style.rng @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/table.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/table.rng new file mode 100644 index 0000000..4373b64 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/table.rng @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + justify + char + + + + + + + + + + + + + + + + + + + + top + middle + bottom + baseline + + + + + + + + + + row + col + rowgroup + colgroup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void + above + below + hsides + lhs + rhs + vsides + box + border + + + + + + + + + + none + groups + rows + cols + all + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/target.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/target.rng new file mode 100644 index 0000000..a5fc723 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/target.rng @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/text.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/text.rng new file mode 100644 index 0000000..fb14fa8 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xhtml/text.rng @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xmldsig-core-schema.rng b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xmldsig-core-schema.rng new file mode 100644 index 0000000..99db430 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/rng/xmldsig-core-schema.rng @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/ncx.sch b/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/ncx.sch new file mode 100644 index 0000000..64b29e9 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/ncx.sch @@ -0,0 +1,81 @@ + + + + + + + + + + pageTarget combination of value and type is not unique + + + + + + + + + first playOrder value is not 1 + + + + + + + + + Multiple navLabels with same xml:lang attribute within an NCX node + + + + + + + + + Multiple navInfos with same xml:lang attribute within an NCX node + + + + + + + + + playOrder sequence has gaps + + + + + + + + + identical playOrder values for navPoint/navTarget/pageTarget that do not refer to same target + + + + + + + + + different playOrder values for navPoint/navTarget/pageTarget that refer to same target + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/opf.sch b/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/opf.sch new file mode 100644 index 0000000..0550d12 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/adobe/epubcheck/sch/opf.sch @@ -0,0 +1,15 @@ + + + + + + + + + + The "id" attribute does not have a unique value! + + + + + diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/tool/Checker.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/tool/Checker.class new file mode 100644 index 0000000000000000000000000000000000000000..eb44527fb52fa9931295c377d3e6d67585282c6a GIT binary patch literal 2527 zcmZ`*S#uLd5dPM(t(7bc$XwwZbHui6S>Qkpj5%U1CBlF)Hs)SQBWYo^D|S~tl8_7X zmdazQ;2~9^sN$9IV3WAQ56F*7^37_E4TuNr9Np9X_18T;`sd%jUIEyThjH{_G>%@J zjN()r5uDa>CXP)wt0UWiFYsj)xhT%X5y$B`Vi;4O^D$h&MIGaDT*8D}T-Gre=QyQo zUC}We#Z?{GlqFicuErZWZtA$Dhq~vW|)lQ^%bs?nYs0Xg^}w zrhimJq_=NUL+hwhlp5CNOk0lCt9j{87s;)l|B}v|KezTf?T_Yq>kdjFGVnyPUb?yQWM1%4fKz*2&2+s zdR5v!A@(#4;oYb-XeNJI4IM?(t69eUS!vZYbcU-*>3XI^PU4rGx?7N^O+|Dfq-;=y znLrBt2@K>%M7aPRf!|xBNzg*=o&F$Eu8UP|=ov4M#(7iRNumD2k5sgzfmk zvC1vIi&4xc@D-{Fe66(m;z9VL#H#cvvM6Rvzp`?Q78{xS zrxc!9g=kPi|HQIQVOX9cj6y-ye0ov#9m{fNmE)3Sl)b~`J$+22Cx~6dMnqVmN}b3Q zBcjS%V3b**hte~FZb;r+>Wx@?Jh3dcgEkV^utk+kgRrpl#eu>7gNG;*%_?nm19>Bb z=ks@%R}C9`-@SCImFUtgdQ&W%_o!TD#WZuc(k3)S!%F4FY2qc@-0^`>HM|bP@9i*Q zGYY`Y7?xQyd=kqROlYfXb>8zOFLK1Gt8g1mY5W4arqA9fjVfDI*YXuywaox(O37k- ziSWv>|H?U&Mp}Eb%4@s4S7%wgMNos-VTGcd&7!OrBq(;Um{-qxL9;>AkA-kuqiOed7_~})%{$>Z~#NxQHTGgu~v>3 zQ!mkyTS8>Ie-W+c`jc%7Xn%|~16m{*{S$gCmJpj>LR`r^1{RSROD|x}BXqt%XL9WV z);+`87g(Q6a@zV5T`NFRe0o9bZN%J3r<)0{n^1-b<}*S$iI0%OK|a182VheTK-@jZ zb8VCzqJ(W7qxb}$GQ1(|;>p8&?PIESH$u?{xsLF})0fzgde!=*foEfgX9=68lbaW@ zB^Mdlo_h5Jw^G}Ok{>K!>tl4P={8Oup{$Fg821q;}vKgABt!bNcbLXpL@ zQEufPwrJ1(`@KK8IWW-H|6GyMO%Q6_9fHxG6K5k$fk|A(G`|H*VIEg-pYjK|j-PP@zu-20g@NCY#}gC-76mPKb3KBi^h8!d zK6l}#kk6RvzF`?$2y}qG3|}R5PXM?xxi=j5h2w`DRc5uI#I~}?0E?cg=zxPR)Ub_D j+a9=#g)c{FeP3ujrcC#|VIm%g>d-MmA%u)7_~K-q1!Q=|93 zhlw%qh8u4%@uCml1NaKQg?eU-KM5C1GIP%P=A1d-`7+;rejNdLiedsWJc{FS0`pji zA(w!G#Tb@i$TLJ=3Qx#w2E9-`WH5I84rfT#g~uDi3x@|S+vyRKs{5|pJG29#;%m^5 zr((d6ue<(*Wp{jsTf9GX+*9tJTSF;&){b)9`j=p!QfrT)T58|BdlWJ=kzaa<{K5GOL zO?)-+M;Xtw0_tvz@xh0gIoFx*eCN#9Zy!Gcn8At)9pibN$Mrl6lw_DHau`=IAl^q zGMt%nd?%h~=r>y3r7ecsQm{?Q-D{4|tBF_V(Nnwbrq=}x+ugDwN9aF{xp>cMGEA;D z0?)FygF3f(nA974yz#oN=Idt6J#rAy)ar~@ej1Hnp!!A4)BK$oQZmQ7=K*Ep$mhIA$0y{TAE8q}a|qe|0Ev!?FHm&lEeglJyfD%_gi8C+o6J3U z>^>`uhtTwMCoy^#iBrdF_bFsGg*S>ljHPhR49E#whf3)um;{ar8cCxaTqT>JW%Q3F V^w4|%tptNgF#n;1YgC$qvG1})7=Zu) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/PathUtil.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/PathUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..9e41d03f9f2c5f87df2182e92aac1972d2cbe24a GIT binary patch literal 2444 zcmai0SyL2O6#kmohsI?P6g8;e0*u3`F~opNP*Fw)BrFn4V(gi@Kugm-cK0A5dqQHC zGF5rVgDD?UsZ>#w7s<9VSvjF#ds;WeU|}{R>`^UakP=H)0V!g z&1p$PGpCXxuC1F>JzFX5TS*EOsvj*ebSpV#I)!}RvR#quGqYBXhWh5SBJb*!$q)j% znG^F=N-@)n=6HE+@k}giF{vQBuF4$iOv|3t41Gb!l<2cc$W;TZ%~O6vOw9_@rDvU< zB}IX{i9rWDOG$XBjksENhVe#RYety#X)D-Q!Iuz?t}!WD<79~N7Jx1mCJ8e6K1bxa z8p32=BUZuAiYvOTYn@C-R;W|rprQ@!#3`q_T6YMuDoj{>9vi)qI1@r%#XX!*aM;7_ z1$Zmiy#Z~?bcJndMxSk4wh9}LbR_|4RZ+m4g2oNuQU{b`S8*TnD&E5aWs@r2$DE4S z(9M)PJK3n7)&^(_nl@7^V3Hm`Q1Kx?Qt>eexzefP6MU-TGkmU~Wg~!;VTdWs=(VQ` zvTW;ppkQ0doMRW{4$9(nA5^i3FI0Sq2MRb7n#y>KEF?AUO4BXd_|iN+>U z2?SQlaW&g@#&y{<4b{5tmV$cElquZg*l_x?VCT!03Ff?$g0O3?ncLM?wM(lS=6w+I zCgujGp{fMuD5&N0!ptc+UM;r&@5qQ#$T;4pv-WMNRMoI*4b5>=a%g1;$EtYP;-E)f zV|CM-Gho@m8xdBTmm5)vm}1`bNDN!tD`*B;6?v8F&?ANY4(HC(WRkwT#qp`ct}H9( zx#0ZwMp!enDZF+0h%kg~t6mnop{*kEb(sn|<% z#zdfF1N!kfB?+_596_#B7Bb!h%d)u{-+3} zm#|}C6`_gaMTA!nc@~dFJ&6k)@=$wj|6??*LY-JaT}Khy;`|l)PFcdfHL7oa5j!ea zhdW|Bi-?`uknrEBl!-q@{W8O?MU1bpU^$ud*v=qZ7f<+uI;>dVxXSaVbs4PAIi~8G_8FHyRZu4sbOen&X zYSDvwoMnpV2<>^od4Yhu&h&eEx`->d1Pzy=^JL*F@AZBxAcc?kC9;U?_>PeOz|Wqa zFo<9H{40h$z=sj0tv*`sVvjvw>CO`HpoEQ{B+T`AOn(Td_SW?6Q literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/ResourceUtil.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/ResourceUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..395a2e05afc064c25db986883db5d077fdd223e4 GIT binary patch literal 1879 zcmah~ZF3S=6n-uc7H}&8O=4;rQ%e%wWMf~ou~tRXVv(dFrcK|MZh8qdmKNV^>6Zj0bVz@2#J7OtoxSK#ySS4{!EbBt?^8~&?MJ)FLBncu>v3k_+nvl7@4Exf;t%PFgP0VYtQ+ zuRn48Hur6dA$r4hZ2u-hIGfvHh?LzXXGm6Uht~$(2KTnjMu#Nns%x2@9n-VLeI$(d zZM)B~QYA8mBx4+sF$5VSNQOKo_qab6ZJK_YVL2NhSob~K*;~uKDk9PyL7--KC7DT3 zBO6kXc~PkP=xjYU_elS2&vPGf%ilCdf>eM90dTX+kUO1;?HU!QH}I7z#i4tnBrA8( zj%zl#$1oRQF0);g4`dOQj4}*Mr@J{)q|p9VhRetCYOcTT4xHw_eT(;e+jR&!w7<%b zsLP_S+oD*hagId~ltivHJkU{t!LT?{x#OG919HXbrC671k>9p7M=VRqtIRrSuG)#Bvu zTYRVEdu-|W0Y7T^NypE~>oAd5&R^eq4AT?vjfQ9j>c)vkM#-SHTu-%FT#QB89P}xj z#bC*{+n)QYn1Lg0I*}3xHJ1W8pFOda15{L;WaIH($F#`VY_?oJ(drCMuU~PRe1D_G zFcajYP}Xu4nu7kI(U)T+pemIUp`vE5$DQV}$i^svo>L-K2I{n!?DV*G zcmIO+JE9~RA~9W>HikG;ErbhceTX-PIQyU&E{@N&=Sc28#q^aSQbLx>({G6M0bwd0 zX^Fo;zAvFj>owvaIOUaJWUxfHMfyuwrV|y3Br9|Zk>&+t=@cf$Inq~*+w>A5i|i?k z&s7UA5z9Zr`GW$HnK{m6i4wU?v9C}Ta+1lc!b3qanWsOaBCe3Pm>6Mt6M3qQyrv15 v9aNtqOi@P)LrnccnxZ6AQe%?&g+uHp<$o1drCu8ENiV994DXX|2p{|pNy^U0 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/WriterReportImpl.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/util/WriterReportImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f674aefc69d4bf4c358d9c3daecbb3d38241f64d GIT binary patch literal 1240 zcmb`GZBNrs6vzL!8*5i44}(nIIhNx~f&cX3a`eGv~tJQVSWA!M~(hD2dsJJ3|!Qnwu4bax!x<<2rg zWJNc1ca>pG>FJTKFoa)Nb=!vtyK-O#0yqUGb);+d%9~3yL)V_H=FLT>++@ zMli~dJYV5?dv});vG}rF-Yn-*F+4$zq5rLG*(rk`aN`{VsJ`NzP>U=b!wQ}<2)UGq z)fm?Bj3K(SUM}W~uW~7d^j}YmVd#`+v%1e~bj6ds!Zll0gGtj%P`tTCG~4E8ongMm ztkV}}9rQ{3<4XRLQ^~c0>tYyHF8WdYh)?|I1ElfU-g7iex`SRg6-?9nAEr6R=_h!1 zLH~^qeJ7Bl^(v_ivJ14!nPad__A`W!qy&u7IzYZa3Sr6<#Z6ozl?=Rb9pj`Z&d*90 zgbCc}<~*c`FrAe$pCEii=*=<0@xBfs+3%3z;t|4G5)+3cq$7-MU#Du8Ej$B$I1i+e`A#}i7CP%2x?&3_byQjQ-1rmE=L`tg8v&eO{m#_ LK)p>Z2$=Z=F@p_E literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLAttribute.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLAttribute.class new file mode 100644 index 0000000000000000000000000000000000000000..fd21d9e14b886b68428071820936b8756a815b71 GIT binary patch literal 683 zcmbVJ%SyvQ6g?C3XlqSvt&h5}iXv@&#DyDC1QFa=yQu`XlQ_1~G%0CP`dJE!;KC2^ zqr^LD7eYa#8N!@7_i@hL`TG9&1aO4)98@f4F^3fcs|MB>v?2Es!BA>G@*%f;9(1gB z9C<lVqXk1)`Po91-1e$4^a!F86I7dGb6V)wt^o z7STNGh0EBqVFiR9B^V5v7T$MZ3(`8m~~E2`G?a<0jjwNPe6!5n)(Lv&ui` CVVnH` literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLElement.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLElement.class new file mode 100644 index 0000000000000000000000000000000000000000..c85ff9fe079631c4fe276689f2552098a55a63fa GIT binary patch literal 2042 zcmb7FO>+}R5Ph?&)mrPtHo}l7UU1soX!eZM&f)SkeVA8M^$$CD3wP35WG zL9_KpwVrs-I&JU%o!a`l$cjLESN2sm5Lg(MakH&D6h-lqyM6zu4AiC!q(HXzSU#0r zTXuK6@0yQQi$l_De%BAG0?!MH<85Ns-KmV@8I$}tgo_P<)JE@t5}2;}T~!}+nyP_%_E znwo{;mVlc)5hxb6ileBP5g18$sDqk3xK5W%g^4|Kk!17rAD8An!Dw3y5 zAU`f~Q+7#2gO~g3^Szs#u34&dsC+zMQ+r3^PA6}O!npCyc5l#csarlbdzuD6 z(&ie2y2zsH!o>*}Q<%2#m5Z;j?&2G)+t_fiiJLBNv1b97UCiL5!2F1}Dgqa{Fe0d~ zM{y-d_vMBN# z<{~ERv~%Wk={FdMu*{ciym?8kki?V*DH4eiGAL^TZkQ4g5IBzu5nP3`_GU&UNX*~H$D|lbYBKDV@*%B5Z*wQBKZExtnfXUylULpbF_+)9Axi5H^qy$uf>o} zo)iK7C)rpgYlQ?}C21>E#2Ri>o9g7dM{m`;rk%qQweSix;}R)ZpaxkqHe0%UZdD_e zq=918(gwJZ232;RIuMFe(Syb+3nDl%BowN=`5!9hHKd@c7bBpg%9*1uw~tl%Dy~Jz lRbs`xPM69D$PCBU(cT)>b|*n39oLrTZwX-tc$976`adabua*D+ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLHandler.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..67ca7426a165bc85cbd0f927a4ddf2612ddf772d GIT binary patch literal 310 zcmZWkK~BRk5S%S-1EJ7Lh!1cfTrhWz2t=eJ4wV3jljE$C6vvKi2k|xzJb*`4xK%|D zz3gabXJ>YQSKmJXZZJ)7lHin(s#-d!0y|GgviG|@zj`5@HI=bW7Mfq{Ca~|MV#34+ z>B7C{mQ5fWWNT^4ru?VQJ7*Pp-lKDb_m#u~z9Hebq5DYP_|SOgd6xBJY-Zee?; z_@U7;aQgN%f0U-w?5@}QgbQU`Axm4Z;I1!J&FVvZwOZ_ygxN0ZxmdCaV*+6iKL&Ds_)*3? zLlYAr(M9j$^qzCi%zS>me*ic@DTg$cvPfZBh7}oBGg!-Dogo|Wj_7r{D;Ns(d;Z96 zp9gLGDvrFMeZ*kM0fuxp61UzH6~|uS#U~7hmC^D4Ak`*`o`x+F&DXs^H2NJ!MAzK$ zm4(pdev?O@>=V$4@4OyEx$cG?o3}zo*rMBa+&keu*iRkbzB#WqNRZrS+9GZ!!}FEu zs2c_|8Ay(trS>v8S?((AN3J;Yq!BaGtjQ}eF^LTm8BCbS$&keaL+KAY3^PCXdEwj( zH)hZ))h5dH0%>|19hwxSN|TZ*lRjmGzDby1n4-$3{}P$E-oUKg0W@oG0NvUjz<42C z!!*SrsRAXM+$6O!VOyBPHu8j8Lq29OOC2exy-Zbdqoyk9L8qMs;te<3l;u>)dWG>! n#c)+xfjdfCnxuh5nvwK4vi6&7jU_LPCF{S*wXx))^0)X6TOxxr literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLParser.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLParser.class new file mode 100644 index 0000000000000000000000000000000000000000..0853fce1fc579a930a38515b5b4ccb029cbbbdc4 GIT binary patch literal 18613 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 Q5B+a;>~`&)FtBd;0lzgk(f|Me literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ErrorHandlerImpl.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ErrorHandlerImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ba23eae64b2eab06745efd101264eedcd120303c GIT binary patch literal 1367 zcma)5+iuf95IyT$+?YTwKq=RzC6rvCPPmAN0um}kR0>k zpb`&!03U^zbwV1o5A4J4c*ZklXU^IE{paT|05v>xkU=p=+Z_j4Y&f`!l8uUus*QUL z*|;a8VvS*=;e~ydcfz)C#bDU>dcr$$M}6Ntc++TcUv_vLsx5|G^J@_IL@Yh3ekubQ zKW8YH%*x9xhV*vW5e)MU8Hl&Tep{%0-u5Z7)CfK9x44qpp9IsoL577Lr9$$e?RulK~9x4M{W`w4StUjYwN-RA(>) zFV=|=rx^~FCtgXd%Hpj4n}_@}&*L2OdCVcFzg!!&JnGs$V0dhDi_VBZ`f6a;=Rw!q zYaa?PW>}dOV^+3PzeuMk%XE*88X!JWB`xR8*+b4KPPcTRWDqxF?j7wb?hzkFlLJto z7ndbXZCXp3DzXl}NKo9;{E>g2yhr3&WSvU&JFLnvQs2n4aDjGR4}8Ep?K+>buz-tX z87|>6Wod+Gl2;gKOlQwxH4#KpT)-M3jHR)#PDmDRlVqS} O5ldw(lD$C|nEMN_o-5P< literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ResourceEntityResolver.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$ResourceEntityResolver.class new file mode 100644 index 0000000000000000000000000000000000000000..65d10a5ff6f71dc0e23da11d7baa824e8155f3e7 GIT binary patch literal 1842 zcma)6Yf~Fl7=BJ}89P|LPux(>Wt%`@eioa*`zcBsgud%ob$ft-RFJY+xhdKUw;R%fTt!#usFo!rilyq zB#T=nKE-Ex`8iTlK)vU|#iBtEe$yI}fb6C8Ojv^(S`aX5&r~`q7>kCYDY~7#>r$Xs8376@lK_LG>KFy7G zLmnzO@FN3j2G$L12teS`fOQ%yi;HDl&qSN;lV~pr3`&FdUl z7{@ynMlq&On+*GVS}xfJzO=A~iiNN6wSb_aYT*I4E$rZ-z~#5pL8Cmf@EA1%PXx+? z^!i(xL}2ty6?f{-WkU&E>GgZIMJIbNYxka=7Dr$_hSEje>CsLNM2`tiPU`~n@ac3Y z(;F!#RM9uC?x%@9JzV^blN`0`QQXqnrc&(Joj3YXX(`vUUysmJ3Y_MBsa|Uy#$7zs z&uc#yV?CdeKifQhPu?WCJ9b@u=O$vZ>*&md&dhKmRqb@V`sRUFg?=%fefe;muj~bm z&_(`px-;XQ&oGim=ys(%LFpEy1b1_0_7@~(PLTYWQUaH_W@rPx&6l}a@!7;Au2K?s z7w^$ZBm70g4EL?M?NTmvjP#E%OQV@%WGEZ4Y?Y|bZ2$D{-=$Z`zQWK_DxdlTY4P$m znBV48Cm3Ez=hJh?u=44b#OnB;$1u;gDJ}D~!Z=px{SFGaixTeRCf3M*oth2)He;Tv z9WGs-WQF%}E#|((oLnPTf|eiflqAMge29;bBEk?+Zy=2+dd$$~V@&fjj#-{{leP=Ki=UpR~Fi(UW5p;BRye{Ah_Z;OBGRSi;atE^i0p$DCFaQ7m literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$XMLReaderCreatorImpl.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator$XMLReaderCreatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..9f8422b636b4a38678a1eb145872f24e58deddf6 GIT binary patch literal 2010 zcma)7ZC4vb6n00we;0mtSN*98c!H= zWBpmQ@Bp8fcxa&?j|TA>J~y#!VGv)KSkdyag(0k(STpgZiLV6G(V-h=<^(2-j^8NA z1HY;Ys(Dm(4wdt=aNMXD_BM+ZS$7X)1=Q2(-nc# zihrO4MvAVdN=J>V3U+0+PR-?_@5p*Z2Cm+>lqnscz!gTZqvU}KRsy9XS#LD!0`|J+ zQB{{=sCa9srzkSru$bA1qoGy%RNzK-y66YBn1)auYbuf;cst#cL8tIIR_=h7h+Cjyx+ z#_br^l3O&e+SZ|obpZ%$_gJ~!n4MqJ6*i99P{#4RKyTogc^zBXKMEYR=IT}$Bh&4s zyRZ4RaTV8WyoD=zwPE6G8%1o|DB+2XEo__Eu~Ei^iCs2AFU_3UQDN+J)r;KdMDOaa zbfK7?TXmg$20BXTY(2Xh2QSRj*%GE zY!&L#s}-J9UnnOM$ZNRhP`Z9oc}dFuZs`^X{|S0>&f@lEb+PYW(EY8>6BzW=>vb=T zr01}@lN_u6w_;C>g(@n^h6U#!RMz+h*h(;|Y@%gW z|1S%H%O+A2sP*{tTi! v4-?6a7NX{8Hs)5Z?xR42gk^(owdQdiw<&MZY7|R&o0=RY_&oPhehTAnuJ#Z| literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator.class b/thirdparty/epubcheck/bin/com/adobe/epubcheck/xml/XMLValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..2fec332940be0e2abdf829947314d0d4f42b78ba GIT binary patch literal 3493 zcmbVP>vI!T6#v~e?WW5@p*#Z!Q3|A`5GsPuBHD%ksp*5XlvdHY*=*Y_o87qCl!A!J zTgA7i~A@}B5(+pXNhMga@Mn#zd^Z88629d{)4Oh*k`=U=pthcwIyr z&T+~cEqD`C0^Sm_!P%At#6|dUPJkj}3nvDU;JhkdPV?oAfLRgGLK86O#d)q*_aZ4` z2Ul$fFa@L-z#v5oL$yM>oKCB0hSg!qGObgxkm~-HF;z|wm!-IeA_V>asBt9JMXYnCWF`b~qT? zql%df+Ox7|rc}cb7o3-MEg{=#a5N`}^B>g=%|6DkK2RyHW1PVgG83e%HL4lvP$n5y ztuZ;S=hT~utdGl<#@BhGWaTX%k?mOuf@2L?r^-pv;i%BeV8lpeY==xn6xeb;Gx(yW zH4|J&>cOHS>x%rr}H9a_Dk=K@eaj?i;Qscy&;egxeVua+3 zZ3g>ja6;uAA|Z@i-&z)`ScYZLz3J*gLPR`+1A~)^tx7+gl;@9;ZuAj;d6W;;Q(G>SX;_gv4|vm3CdS%*%pTt zf|rP4tCk__ew7n?a+&*z65=N$sK*f!Q4%^FpHmf^Dz%=I?cEH$bum^$wZ;Gknw@Sk zay3&pcZNEfoS#wc0>wd@U2f1-)}lplTvK+mfJq(I4_Dw+vz#I<`okR~0Svfyu$qL=8Pqea2iIm@zB;cfrcSSW7 zajVs3A`qI+uTi5s9-H_$*ox}9hQzm{mEONGA$Xnc_tzo8idQUB>& z0^9Ql4TD{e&^WaBPi)J=Gnqxx>bDqm$N72M~$Hbj&yGn*EVfW()6ax=_!p}7F z`4@^!0}hkV<5*8)lBgzHkisfh^mUQOUSudX^BBejOwbEzjvi2#a2a=T1^4Kw^Bt~| zoZBSv8t&sdNxXpvxQU0jg}-qJM@Z^9lGuVD&_l6rAj#jO7e~=Za?^MT$4KV{Vt5&^ z&=<%(vZD|El!^Pq8^UoKA5i{62-82x4Nl-B&HNwFB_rx7S~VboE}DBNgPp_=clEjkAf>a~Dti-ZJMh4a7{9OH#jKs|Rg4DcXuuA$c9{A{4(}4ulg=}^)023L?809hlJXMm~A) sgxEa=%iwefE-wZmux4IGo?r}XSdZ2mhB=|*-*;q}1jIfC6hfxrJKXk&^8f$< literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..68da85d1a766cd2d5ed0fdd99da3e9f5223e4d2e GIT binary patch literal 2270 zcmbVMZF3V<6n=KI*-g`wZd(>DO%*IknCj9IEhyV$Nf*)$CR_UA z$lw^q89q2N!#FCAXp!kCb$pva#$o&c{tADAAN=GOsL$PmQUOQDbZ+mt=iYPfInVR# z{q_FOzX0gMp&$a-8-#{^L3E=>{OhgZGA?}kH5|~8kWf2o*|{k=2S$by$pPWH&!FK%e}8J|kXYW6p!V2~ z?Zzee+B-%iD9J*W>FWn=#~PZMp0tY93mXRu88bg>7Hv^L)v35sc1c2PFjJV0x>KfI zIBz+n!b~w^MYE=By7T9)=v*lq?K4YOY-gYCn8o@2>P9!O$y;+a)8^+B`FvrPsf_l) zv*raenm3(Xbi^&%POiISoYj@wqJ+lBHzm|e&bwB!FypxY5S}7F8IB~!EQeUzOqsVF z_U|O8%pz|NIKyT(%ljm(%bO)vxW_!mxtFsls7e@mLV<&YVlG;=^5z_iUhSJS*j(5J zhs3znoZH>8ru?ImXRVA&4E&`j`wUB$FR;e;|C&k^-p9UKxc`FSn^b#q%E?-DR7+(y zk;%+V^N3lQ>!;0gR;8&247PU&B}qgg(38nmwGbTfI6PDRSf|mzd3ixQ#L7AGbA)Ypq2Ji zM-rR(Z3X!KDcC5=rL_^Y2!Y=bZ5ivhu3xj(xo%jqZiLEn?4J<^tte-Svp@0^r0=~H z8~9(XIPny1k(>wcG@3b!3tQ+B!3oYX=eo{2kgq{gmZ12S>5%a-Nu8HuL*?LVk~)OZ z%J86|p^{E|hi61@-}-udy>i?aQzEzFi}?-3@GoLKVkozv#8g9Vz@;zXmzRHl-%xkN zG(-EEVdxM~1IG&OR*sDvTbIyMmZh-&OEk&L@^bhy5ol=fvLuxiX=&wVOZc>U@nhi) z-(moNFLH>sMBCx2y`@zgS|=~J>h+b=jPoz3Q{n8xhR=FeHZZu61T_)G^#sCTiyQC) zVQ6RjT|{w^2p(mLW867`&6q$NUdI-gcph1v%rR~n5zL?yv)G2KjQRvG;ZwwL1G{k( z`#eyO5w2&Dq9``=t}gC8$4nZ9k!7|v)=-bvn6r)S5mpa!(b_k>qmAt;xP`5>WJZ6* z>e}Grxeng!@hdqz5u)d^;5XiSH?U739ln_Ai)p@Cpi{6@V+4$vMdZjurx74QJ7Pg2 zsNcViAw$#EIkFSf?_EdGpm8atl~u`5wa?L|>#3R=KSlAXOhVE8lr^2yq=FMnIgM?Wc$iQ2q(%=p*V$_R&va4-l<`=*1zf z4&w-MO5+urqLm>7Gqm5t5H6C5w;A&uMm$Ux*zs{@=;WwnmSY~KK{EJ;hiQN)p7SuR z5y-3x`f^p!!nchQl3Cfi*zRE(#3g1563sfiMV zf{hO;_Pc>2GCzqh%|+Bj!Yye^dTHekUyq*X4eR4K&{%c0D5tOVEUo;moAfU{!QVyy z-pBnBy|cxOO-JB>`g~DR|KIpr>h>&?RL{y4yxB9t^)j z6E9vk=*h%G@cz(0ps)@or4|s5LEDCS@{lcc}@z%-HD7D6Dpu-z&vCaK@Na&=?hrGiJ z4elKjo>vb=Em+I!Fk&tSR=puSMy5I?#at;yS%;DKdJ|K<#whOdBTq^nt0LZUH-mH46sGT*ChWnx;V- zf`?(6!WdF6@{t;F(+G_!Jt-O^2go+f(>UsMWG8?by8VHD444~{*1c?~`LU7fCXDU} zGW9dPXy&>_%P}1b;&YC<)bCZZPAg`j*f$(A2yp2d+WU|-(b?oF-#Uo4IOL3M0 uN-Fa4u&75Ahm??Lnr2WZ-$E9vq}CQc%UM|qF=iD;_y)8HgVC(2n)?GYCgS)2 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/BooleanDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/BooleanDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..0f83e045741e6bc51962e87f6c679bb91873629f GIT binary patch literal 1009 zcmb7D%Wl&^6g`ud-Qd35ro2ml0#01&29`lcX=o*+s7Rz_!2)UG42dh(F3zN+p8`L? z0v4rRC+%J`~Qd-*L9W&=)*-lEkW{;ESP0jQ(-W z_rtfuQm`8P{D?a~54uiMMqbdZmR?d}eHkhJ-!>Wau8=M652(J~KV&z;sOv<+=R;x~ z*Fy;&Exa(Ohk+DBSuIU)KWpy`S5kqgBbUMYR|Y%@pT9kk2`WYVAL^rV6oE3AxIaIR2B0V}cUMO;d>0y?8gx9s#8w2y>9f0|+g xDm1RrkZL}KesYSL6T%~G$BM_gk?YpiJDGOkc2iy2e6_7gJ2;hg{g literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/CdataDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/CdataDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..a081e56b72071b99dcdc2a54f0c1ef58f5cdddec GIT binary patch literal 369 zcmb7A!A`~uoJBZ~&?bbBrZnz}(CGFug6P{q6WXaM_1j`L($!Fn zrp#QXHdoV3RmS%RQn<0H2{O&?OuDf$cCO3XE~;G1LOJDDb1j#3A^X02J}?i2c(4<_ zn4R^X>FvAvPzeM&gqx#$|Dhk+i7tQl;A^|Dy$n|f_(%LB4uK}ukkLK!o(ZqT7wD5w afQWO<6|8Eq>V#3USE0od?{UgGK(Ym_Ra=Yz literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBase.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBase.class new file mode 100644 index 0000000000000000000000000000000000000000..ad91e27c748c600e4606dcc802862dd9dee4e363 GIT binary patch literal 4495 zcmb_e`%_$J8GgQHFJW04Lc%3kXsBsYST-T|8bfFamxj6l1PYQ^>0vp*NtWHs*~2Yq zZJN*;t5vI3O}uBO!&KvlGbwb;jQ;M7|B+*S-gC|#mSt;kl$rD0_}=HeKJT}G|JPss z3g9??9>zf!<#-m?!W^#4kdk3ehI9y-FhVe7la=9y45kdZ5UeojF&{=H7G$+3!;);5 zWw2K~tHeziZpnY&4B;)Aza?tlmf>~??}X8SJ0aW+VI_oj6~c?NhNTZ@wWO|~`V{t! zUFsX@nHV1I?CO~q9O@bF85-?TsO-w5bC#C2Mzz$uUPgzYu($B;P|sk3GV(7~1k*K; zNOTSk+yC<^>`v)RMp8?qmOE3a%wkTVra5sV6?#2eL2L-y{W-0D;sOzLe@nx$FGS-ov3H`UhdZZ2v${XDfa_ldH~8QmHy2o6nPctS>w5iq6{E|jo2 zkuhi5Og*J7(GO3DEudLOCe0vP`jTb)R+h6&v3#533ciJ;Li0|+n8f6)p1l75u#0|& zdzO-VR;*?4Dw3wIS-PEch5rA=v9i=p0|&X{uy=S{sZ(nm_DX(pP+SnCb|+{+ZLPG(Xm zEt}iom||L07ppm?(;~(ADucVp`DumvZ4O?XpPtrDF~h|oD=0x)ROZ2lEzPt(hdwOU zJ*J*bk=cd8^w1X6(bG&Zc}|J*d}^&b23hRhrK+=>-wQ zaWsPG@TCYkaWR4zS|jMfixHf~iwZ|d_Lw}3N8Sj!@p1%xg7BIQ!x&MhE$%i>kwx$x zzAcLHMerTGAHjEVCW7zbg9yHlQxW_CKaAi*{79jy7(k?c9KlaS;3NE0;Z#ZcX7yB7 zH*?b5i^APEmrV)C&lKYSO{d;si<4=E!~Y2(A0sBeJU2g?v)>uUq`9xJWP90Co;2Kk zmDnMJ$yv?pWWCEvK{f?R=NW633oR>LP>42nZAbL@T%Oadge$Vk$~ee;GReZ?=(1cY ztW1~aGfiz-RJI6#1I<^vyas_--(S>buEeK^ehk%IjT+&35OTTttV)HZKJN}iI(xN4`Y;v9}` zK*a)|!uMzHd}!nN4CL2EHFfSqIri~46%cW5;{;A}CrGDUq+Uw-c;X;MOCZ$}sg6kX zHd3u~+d~T5eu*uoamK}L<18nE*kkw}ap4#iv=5^N1_fLgC8TwQCuqJn&=_l7M_EEf z|9w=&TI1^o+(*d23V+!qXxO&rAcBmtc-rI$d-gTr%Q$B%Zp2q`p0^dFcY(9S@$0U# zY8yWI02NOV8sEUKzZJ*xc}Czc_ApzUTBuBmR*VU4MHN%FskqKlT<0mSa}`%fKXlclI7@Qll88TW!M`K? z)3PFAFc5} z#8`}1tIh^$0&Wi4i6{9j=NIP}cIQfWZj!n20qWybP3x#0^LMNwQq~c#3CM0msnw^S zkPdr)jfS|)qI;j{uJpDwJg?o1QZGvvxJ+OAsdWGq7{q>jjSXXnq!^~RBgkSL7OvnH zuHrT(a0hSjog3o2HieI&<4>5jW7WZUT*NDQ6<;OZ8A>GBvc#Xq)Nqb-fOq@tHntzX zpteD~s^6u)Ay&l!d1c+aeCiTnqO4s4b|KpE5F>WDoKW==Egz|Ft|d}3OQd9O;@8Rq z)Orc{4Z_g|{}l5OeH49U$Lfy-P3T!N61c{Wc%6M7>af%dWs4bg{qE7rh_|DLBnhMy!_Og`j(awgv)%GC8A zZK!H`ZN;ZV^7PS$(~ev-|6eR8XYw7&i>yBV#}m|#AKk$IH6pA&U5RZb{Up5vZZaLW zxO$TmeuwF~gAUv!rB;x_J>1}W5%1$R@4SZ(Z2x2Q=NuC}K+nq57<6Euv+S~t+RSqx4%KPj*-?4gG3o-5YPP}+yte*@IE Bg@6D6 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..865952182cd62296530c721e6854745bd38c07df GIT binary patch literal 7875 zcmbtZd0-UP8UMXpJJ}47tPlYM1V|vshAf9%a>*f>HU|Yt#kR!B?ywo%?8e;*1be8p z-mPtEwH2jWv5l>Gq6tbXwHMZ2_L5%qKJ0zpt@QWa%8lINxr!;(8uAkBHS-E~r!%4Y5qv7)!o|Rv}py7)ezNF#H z^64u+Jm<$(@wEzk9pCVy9^drgc|RI)O2fD0`fa)GJ3f3@uHW;c1uyvUeLoh-^#^_| zk?RlrSc(_?_z`}r;U{wasfM5V@N;?S7k;e5i$46)kF|3Bl^^HhMY-wM8h#^p{8q#7 z z=ob7}e!L`MJEl1F)|LUCV$mWo#XQP}D+-IFw< z=0Iqh{FG5)3}gT!dXp)(-HNxy!?FI9wbyiIugN33P+O#qimfp)lC3L^3gk$0caJ1% zQPXa-dM#U^uNt+pu+C459RSrg@X~sYftz7D> z4!(@@=(6IN85fv9j@wzB(r}liuJnoFq-oe@I`su+H#FvVMS2U( zD>akJ1Pv^{%w$!XpAWrJ0jy%nNJbg91?_K@2c|LB_nJw&BN6W~qfD2*W-GHLDzk64 z2Y9CpY)&M54ci-kz6h=DHCV>4;=}6 zbD}>U@hVm{uuwo-9gexhv$#Q;>))OVT};Gbf!Zv}N`+C9 z1ZHNpbR^WKP39g)9qB_IeYj5-lSHMC%MjCH;Zl~EK0}oXpQzGBK%AxHN?gVA*Xv1T z9oOPIN%Q2Pj_Vzo70+awjvLbZJhU4nt&GviJkW8AhiCM#;$DIM>V)CxOc8?iL$HbpYy{k>*Vl~;zn=c%htmTw)m%WeLBJ(g{5?=!-L zyE6OWY-0ZQ$C)jOXq;U>l0A8c!16r(KH_cRTO9zmnJffW*iO6BCnoD+im3L9vvo05 zOe6eay1;p3v3vOxiO97mcDx*3hfux1e-?vo01e`9zBd z>0%+XM=X+$i^URMoGX_4#4=qhmu{KmsmyAM9nrqn;qu^@d#ljV3pV^E+}M&k*|((Q zt%Z|)OImwRE75Te4oihsIOj)RU()AuZzS2-m=!Z?fHU0))V(5hu5?bL*^{azvE%GX zBs6tGul@OU+TpnVQ*R%**?Y7zf&%an~Kj8ZRD) z>7E-EI}v9wHS%5%kMb76>jkH#Jl@Iy(Nn~oW1OTGjr)+g0QB~$5n;U-ANQg#EIOC*Gu54@f>>=;8Jb|Ia?s(N>L;z;Or?w{v71cnvH{_mA+T}0ie-7E{mYT6 zc`Sf4si7|Cl~k-#wuf!Ju*p$_E-JvaIY$U;g)>#}bZ%^m$7zWgeI1C5RDY5X1q;xj z-Bg~C}Bc_O}f2Bu~S(+1HV3{1}w&Kbn&V4x;Tm@$Z8Ffh|01ZEvW?I5NH1G8Pi97QM(%ncqx zT^6`YF`Z_fL(pnag&BOBiMg1CW5HxHp{?Tn(k zQChS%5ad(yjAK~vh!R#q6C24;#?Bmu9 zosm-QN&$6{P+$Xk>nZ*d-ZZIst>2J(1k%_DC~j=Xd8$lFGFJI+8J@56cI zEzOa)ERVd4DDUDkkjHDCEAMKzD%8uU8^ZFF&;l!%SMpH?*vgItCs7_aPo~&{hZz`7 zfK6w_0=xO*yo&|s5=?`^OzUP=g_Sx^PSj`IThEMga-!aK?=asi0Zb<$Kz;E>(`M-ziX-Ab=2>A>URV6yOH|cME!0aw|)Ze#|K!&=?m-WrRT<`0E^{(a4JW;kvh9ez;-ABl78P4N>D&I)`WtVMY?f@Sm zLiaEd4l{%9#n~JeX5&7N2Os6``?>o8_TPt;0kSBrrZU&yE@k(+Ozf_6V|M~ai@V9O zi2a-Qa~G!$uF?mArehEf(}H4JP(uAnPpCjBQ9g2Xa{N0nnJW6L>Vc=2p`2(Ib;cCds>d5ouGCf`yaZX B8iN1; literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..348bcebf79632a9bf9fbb57ea66841c9728123cd GIT binary patch literal 942 zcmb7CU2hUW6g{&*7q(a`O0|BpQomp+EZP@S8ecR`Ot$p_)7ZWZ%LKMrc5xV_`~?4k zzoI5;6HPR+4<`O7;~h#osYksHaDBSpXu!j^M-?7TdGuf{O5;fKC@&JZgU zcNpR?qNX4~*AK;Zzta%%4Q~V#$-0rpgB>n?y&nhTs_pj}He4_2II7M4s4K!=)R&$( z<2>j!r+GKIry@Cg)#(N#A?HcKm6+1TuwHQY`FrjJoJy!G>4&Xa@uGFb`qI~`|3hG~ z>LZ1lzOHL|igrR;MdzlG#+5WI%re+*rMl~mGZ+jigSCow_-VEJ#Cf~r*1fjq@banA zJrgTw+{XikwM%-VO`+N^nKdDsVg9V>*NuJQDTdNT+F=ZG4&cOh>J#y<&jWhw+~ljA zz}Jd<$Wx0Z!H}ZQ&~{P#8nh<&=s!ohXQMq}*+*bD`vT+B=uU?I7M+0*;*>v6t2E{4 z=v8ECX1IpyW0Vhw(Ji2yjg`J4{t*dwXzySoSr~~ckHru*auj1UZqTWLoBseZ C@$%UK literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..9be05e42eb6c488515edc592b4710394eb430904 GIT binary patch literal 8627 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 L>0kKk!CU_ido!+G literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype$CalendarFactory.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype$CalendarFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..760f53c63e3a0e42456132dd508ace74496999ce GIT binary patch literal 1116 zcmbtTNlz3(7=6{VG&F-Of(png=l~;)ikc{KVGL$)7!HFFkHt&{n)LLL?j9rm!?Q;{ zctJQ|H1Xs`4#s$K`!DLNb}$nT8e=6@-_qam-dEKJ-(S4}FpaAgEKD?`8I$_Rm^g1C zjtL7>uoDc?%QA7n#6yy2e5qQo!wuVW1{1r7(lbCawtF`d`ul?NKjRdh7Pm+NLUzPJ^qs9Ynl3N;ThCUZ@AS=(w)F z6J95IPyZ_f4Dq2_d{s&Gq6H~Fv{qUMj?r#wu-j>OG}xWAk2ly|tiqWww@HtUQomJ> zk`;TY*_47ZF|iNvf{KAYp2^7h7N@D}<_thTLFqEX7@;R8E= zL>ixv!Drs<7hJOE;>BL$3VytuSH{r=T!Zw55>R9#= f)71H0Dgj^qUHlx#0wUd7Z62*9-y!a57s7`B1mRC0OOb(yKqpvS*jX7`fOYkW`QYRy1T2M?|YG~he0C}5Gw+MO*dNicI0Ll z5GOVTGIzYdi|-1I75l5KY?e02u^2XZcBtwF@^O2oCR^)n&1a@i4ePGI;kG=rK1v#K z(<4__$xuWB_DT@Q)}rr5k>t)owI1#`antp}T^U4SyH%GC+i>I8yV7|THIfb#lqHhn zRHqi(%E%XO*JqiITHg(}oF}zyS&tV=Y)21k+e%tuNbjbA8OBZ7qBeTaOqR)c=nSIb}CTo#Dx0ZCY>?w!FI?6k(%qUqlhA?Ym0680jux*?` z-oj0R+yCv1g*h8%aMs2IF7WdEyQeQjb(gdM${>*c^J!s{FEPtEs-vJ9ZS`sO4ot$*xi1`h7bneYpzQcS6Q{S(AgSlG%1Z|q%Au?|@UvsV fmvQA7W}{#B^JBmorV@Qud9mOl;m=1)#*q63N9gH8 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DateTimeDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..4a2ba96682335a2345ffd254a636b7c6e0761d9e GIT binary patch literal 6147 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 Rvwqs6?6^!@2^1QG@i&%cqSF8X literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DoubleDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DoubleDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..c5985fb8679b1901b8184a10ca68a4f1d95a79f9 GIT binary patch literal 2271 zcmb7GTTdHD6#mBE^%~=HcX68=p(NPYU`$gd1VTz|NFa`(K&e_OY8QKJFIw!>UI<8) zP^GGs@&{T-pZbDS@sPfN)Jj#K`)m5xhbrwi-i?7I5(H^x&N(yZ_MLOq{Pp~|KL8Bl z;{ZA_=Erydw=m(yZ9hJgyf1>i@<_n*u8w*NU2PszJ!4Ry-<|}5| z7Vt}nSu{y1B&R4T8uqeotuwvcYrJPG)ncM*So$U-YNSI2lZ;s@rz>UK*tEx@$6}gW zSvB%D6ZCB41tMoPA<)KH=BfpwxL(h`$WyD z;0CJ%R_7d=NCnV~X7sU^{dfxlXu%*_kwTlefle`vE^!YbG0Qo8fXiYYySaHRBRA|TE-DA;(8_|XNuR^jOK^P;XJfz=m`1p=KWX5sV$E@pQ zRE>t!A9m0ljdE`dt99;Wzb$nn?z7Zcv?Evde~l%R`M>y7#Bt5_A7^Vw|9%!Th3nL9 QXKUUdr81^bi4ku84>)nII{*Lx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype$Duration.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype$Duration.class new file mode 100644 index 0000000000000000000000000000000000000000..a65e13ba47cef445dda859c9098d63c30b875c25 GIT binary patch literal 2061 zcmcgtU2_vv7=AX{WSezqp-^nZk18!B+dx`Dv=oZafCN$*X<^1XUTl(`>~@mfnrs+* z%awlt{s1>zsAKAk7mnWgqa2_2Y_>w&8@;fdocAN|bIx;~_dV?&fBy0-fE6@M%;2(# zk8q^`6Cca+i7acfT$N?r#5G(OZ^OW+QhHM|x5V2NZ__|cL+-$J`U4H88+*=b3l{x!l3|+o*xV&SGg$7yz%nQeqEr~BCH`x1|ndgS@M z;Z$wdcOpLwG+6Z@aQmBGXD|>I)*G#`SB*T!5BJ?*K#^K*we3Vsbg=JMza6xz3A8p& zE+z>IG!?iV?)!wtYr70PZuDi`nE6sUT^kJrR&9;DW6-au1_}0V+#^#8k~T@OopkCS zyC%x8SME1Mr^_47mEwcDPSB}7XzsbKXuV8w*|51MDye~a^-B&%7*zsX}oEG zTd)0R-7PGmV&NX{TYOWi8jeq1iI*+Otei@F9F$6RjW>Gz`>~c9R{kwD_LPu)r|<5B z8j9lvB#$!bQMrxc*RUO9$cG!8K}Lg59L?25vSAb=61dITvQ zLF!oa15e4|4A%|CdDUm~M2-iOWKWn4l9H&8{5O{rrQ5AY!#G5ZxR!@(82 z%{?B*tnm(&ke?>eAMj4%i5?l{i6U9$i6*-8M3tQKM3=nsL>YtLSuDo7@N_;zW^(pV z$bL^Jrk+>HHATUS3yvr(rGoWI@by&ixm0j&5_~fid_EPNp9J4d1(#C6#w56&3NEu@ zYLH$NtS|}QN&#!~_{QKLDX;X&TmBv9bL6rwmw$t~CE8c`Im8>!Ad$|90$c(A^H aMW>bV*%?m1jNc`^M{Dv#ldt1ln12EGkdJu) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/DurationDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..6ca0233ea2c1091af338b71878f426f696cf807c GIT binary patch literal 5659 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/EntityDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/EntityDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..b6aa0cc2259be101ef342f5a43ceb9dab8d829cd GIT binary patch literal 909 zcmbtS%Wl&^6g@XDyNUb2ZFxTm3zW1~-F<*fperjZ3K8mV;*8R%oN;7NO8P5&1B-Uk z3Ko0-ABDK%m?#JqL0Gcq-m81gJ@b1z#*R1QN!H^?%{qNRXniiLkEu>JSNm$ zD6PyZLb=)M5h|TzAPMWC(y}`l^=0}_^kc60VG@bBCsJkeqF6DfDkB_*Q8Eh5sZhyS z>MWV0kqidH2y-!(!898LZ?sY7;&oAK6B;6plaEvRhrzK)l^(Xk zBpn8+jK!2|b20`fPE?{hi8gX-+N~4To|)82{DXv0I*$m=WyuKcP?|zj_kUC^XnET| zlab-2>&Lk@N6H$y`MW0vR=WoWu7f8YcJS208rD5*VViL9Zw4;`=ytkdB!B%8!t>?q zCTytey&j7+lY`j?gzdi=)jHuFs(jPzQ|6a917U@ufKTGHx_bk<;-G{&e`~WM8XS8? z>|vENSSPq*!AIO}>D>LjFDRApnd3#gljC=0Jh*p3j>G>LR1ic%TR_4GdMFPxWbkH zKqHBJH!g4ki6(}%KT5rCW+(+s)V_4)-t*qQ=iK}5eE;#~8-N)sYv@5<#iWJ;iVCLq z;cGwx$FvHa|0GAn3_m;z!CAR8r{KPVd4|NYX`B8NhIlStW#FsMroqr#Hf^KQ+^rez zhNxMDq{>cRSXJSg(vLvyZ<`*2UamX4y1y+zZs_a2Yub&avg0;%*RaF^VXZ_IV3K1x_Nrt1#(}?- zZwq}^+cD}s<&Jy4EA{@Cl_9oYXUP3)b_UJ#%7*7{Yzv!VqFrdj)oe4AoOlXwj3+0=hsAj95X1o4$;iHjLGpkhqzRG1?-8d3tQ1nQ6U2|u{T2Lqs^b)i<3dVlgVYe} zY=blj$@7I%bRAQcka+|O*(y3|4bYc*6I~c54LTLDNF_)`V<9Wf6|EqH;XvgIuHyz} zVib2PQduQms>~G5z)z4YhOc)Ypzx32@lP%8uC!+b6NBJM=|McfVeRotVM SrPzL|d7Lax`X+*Ea=!q`cM(ni literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/HexBinaryDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/HexBinaryDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..91a0d67d2b3543c62e6f2a6f5acb30078064172e GIT binary patch literal 1837 zcmb_cO>Y}j6g_V~JX6=DCNL>6F%Tfdj;Wn~U?fr^B~DQ-xgk;_BhgBDVh{F2({VMP zqz*y?q)4!UMOlELT~rZL1j+(71tG*9HtbliV2OnI4>9MBoivbAii)N8aqoTa+V=+-8e$EmO*}Rf6cE#O^Fc(!JzL!G{lMmY4h!ID!WZOeSy= zrxG}gGYLF}rv*;_=N<^;|Lx9Sn`Rc!VCNNY7l#&#pu}hC%qB zM`B;@F)xxS$Ur9tll70X@+VpKIO{%3YZhr-z++gT9vAs4x?JDESfs=y@>#-(h^r}? z?P;7a`NfpQO8qrL~F5r1$k5QoooMC>G8ph@4G0^T8BJfp- z8>ugt2jUY>Qp?x5|7bAilm5uw-QVvjvF``tUEaT!akm`r6XQ9A*fr)qFjC3M z#&#Q&3U*J+jJMI-X6(JC^v2;I8Mmy3ZC7Fu;lbfyt7k+>rCEgk9 zYb6fc*SY6#hWq;V`~u(vgBU*g5q2W%5;|wP(&n7t?;lJE!Kf}2p`YqXWy^A^nz5YD z85yK?F6R^3XgjaLz|3?@5NTeQ!px+u7piLOWs@sWNF&X|LW%pf5J}Of>x(sVO6cAw zlN4iKJL7~9Upd*Oc4oi$!&`YLdk7E`j{oIE82-i2Mwu+t=hv_YkFR5&$HA816LBZF y64&tX3AA$Sh;zq*J~p`TeGt$^%oAbLAy$0ElNEd6qs{nMhCh_vmvYOow%-B%8ek~^ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..be2fb59e67c3a89c7ebb31ed06ced1eb16b2138d GIT binary patch literal 813 zcmb7C%}X0W6#q?jn>FjU#*aj8lWO&n56D_UN=d0$OCb;nZ6t@@CYvD{+3d>hq}4yA zCy!pdc!|(M|A78c#W(8)#1cXm_A&3x{65~B`SbVJZvcDPwUI?phjkkp*wo>q^@TN3I%j8J>wC4#$xv+&))aU7QK`Jnp+6)8qq>MYGyvFptB&U|4F) zKztsLdLlaEJ)bHo?aMYrh*cy#HI;3WV2`938gnV8 zn8YeM^u@U(NB+f;?}tCgMWNC@<=?sM^I+h1NGBLHtKS$5($xO{*<`Rg$xJ>;-C=2l z$%Y0xuuyi8$FhZ&4z{rE;1zZl-pm{E3|5ANdB_g6CmxTCVgEm`wWaSh|G0a4C%y;< zYDfdBR9lpKLmnL|x{*q&dW>y6q35N)4E+`sz>uTWA&mPfgc5PfUAag(|&xE}#ppnNv5Q4L5Sq#zD}kRn`=0Of$hVeKr*Mu}b78wCG` z8y7A}6a)u;06z*b>%_fKWYv~tXJ%*K+nL$@{paT|05{<`U}LL+ZJe*8h6`F;T*3}6 z*|==u3PWuyl7SjBur7l=5j>w}f}tJ8=_F7?F4F^%WinPJEuGeih?-%q5~0i~j>@o}b0zb)QsgD5OcREURygACcrfP4 zAb1{)M65dP*9>MFjdTtFY%(-n7VUf@b(LGkA9PRWIdE{*#x)1mvFo6LB?pVB+h{px z!(+HxHKgOg8SYdi_V{=z%0kOdFx)!fg!O=LRB@H?y3y2~fl%|i#o)J2auIi{n2vDk zL^A8meq`;5 zO45ZzauEvzv`jEA0i7bx&MXzD$)mqD`qv3qYns#`Z3CNgs;6XYPt*Gf)Bk}51Eg6W jVOyVInV)IPfTpVz5Gw`6<}BriqKPKX&_2W2BL3W8kk}nR literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ListDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ListDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..57f72e89a0d2e222d4b2b352cda9c7ad7f516f7e GIT binary patch literal 2515 zcmb7EO-~zF6g^|l;13)~NF4%+(*&Gg8-u}3Xo|t%D+CflDiN`0R|AY-=wKszpk!B7 ztgEiOY1K_PEK;?lRi&ctD)lFH*F~lLiniy@JO-B_L1oXI_wKxV-?`_W`+ooX=OX|^ zct4IdjK^>ZGE@7ud!B`QHv?FVU;wrjM-J&Eo&Ig{6E+1vIc#+ zw#Gx-D|Xdd+}T>O>MzU{hn9{?ZPj#^&AKgXWz^jbyKxbS6}#ac!z9G$y5%mL&JN=) zW-6QJu32!*>Uv?xt=rZ0Ql(a3FVro^+@mc>l@2x+cC9*HtGd>nTgo=MK400iR$a!{ zY(DcE!VR}Bu-}NTA+)=yA#>4F$f#TUh}3Ji`r%pO3@O&>uK}KR$J(<=o%3?iacUoP zU-FEUvma<^!Oe)TAUm&SY~6VPL}&K*>km^Hj}~_T`N{~-Q73^Rwb1c zdTT42|D`v`xWjI!3e8xQ?3z_|xj!SIB=Y>4FKk*E=hCj|V9so8_{s}yur{%Vxn(IH z`kHxAXEase7!rf)gf#5GiY%H}6|VgWE%7C1bncA(ds|Ln$F&{RaZB5d?Yb8G#c0TshcvUU+A@2F`f;20TpM^}@aYipcn8M$ zbl@s2Z*ew@5P!7heuS3m{{f+Ixe6i4u?=C4G3fM(p%vG-y5{djC$4iP(Il$I8L3w> zzk`7mT1x#tA-p(n^b7P+Jv?G0jV}G@YoxpMq>=j`p@F1P%pby75<~Gf7}~3SL;L2R zKf3f+boW8@Aj)|gL$*We-^t@LOkjv96uEv#r~<6aBioV14cz2j9v(m}A%$BW#1h^n zB_Vzv!5#E4J&{N+(o7K|8RG+ zQXe3mZl6M3D2(`sbRzoe4Mcb7-9v7A$wHd>_b|`99-{mF5~WoTNxqo?Q6}Il6L8k6 zI0ISEDQtPZrTC%TNyS<`OV&Ff;eS8eR@t58L64Mc^JL&Q!;8g7CT4WRH^Q2vtyB1yFS{&C|g7%d0klQ4cGJYWlq zu(A)E!nFtCc)_S}pOZ_eS59R{0eM9e5p||K6(x1bsP)tGzEtdW>f|I}Lu0JUI9sbs zrXI0gWmaawJ5?$s+B&XSE+8hSh>3E)C^|&{+qmy(O_Q5Xp*tcvY0fEyZZYrkKT1)t zJ--xbd%Y?eyX9-lD0&@wh=i{*Y0^KNbas!|1299>kJ+8Gyb7KW;T%;qPqv<7l=BHZ t^D>Y=y+w@2eL59nFok!$(h?iJ2AM&Wp6@Z2FryB0E`6%8v!&z4{so;C`I`U$ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..de24b663b2040fac63fcc3405706b6979fbadadd GIT binary patch literal 1134 zcmb7DO>fgc5Ph3CF?C%M+z-AX<*SKPYB+Fe)dK-efl8&y0g1!LS(>dJyYgYxNkcPBIV-wXTfCoAIbG(j(rF z$m4aBkVie9N^_n$Ej^TqVZV_1HJ`qmhS6Bbi8vHWr!v%eHPnRFr-~SM3UTtBtOJHM zMKe+#q)<61O^ji^xuCgsG{^~$#>C^i&8GfJn#MLSs%^(i+=Yw#HXgWmh(|6iVabJq zWgA;AnrJcX6)AcV1;ewV^qwg@?=T+$!_)s%+~~Vq#FfLF2{Y7>g`WEz4Qs1VrnwZ- z_i+*HTmlIsRaYo=G~}e_)&eyb>5B&4Ih$@{37!#&cAn8G^MEv50mEfFy{CvWy;uGA zH!#2b6{Rzj{p~YYpR?c^Sq~Oj2NeQXp=6J2oji^6R9qpCc~)ty5wO`AvJ&mqu`#3S sP_*&X{4XfC$ynb}DdQ8lN-#9lEVZ6NZ=8qzg|6W$0WwsQ>@~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..867e3b4f4a51d8935c4c5e728abe8ef091e3bae7 GIT binary patch literal 1176 zcmb7DO>fgc5Ph3CHA!6>+z-B?B|sA=t>M6_RSy&)Aq6V6RgjQ4Y@DUp%CRf&CMrJ# z{s0#)NR$c=`~ZFwV%Ck3BBENz(s*Zf=DnSHyT5+__zB<<)+@M#n-$!`?J{iKG3M?p zRxX)0Elb%Qz{B{rzeBI|VJ{FORhe;s(9@kvIKNkLp>iN4SaZiL?%Q)Jk z%1{oZW^mg_e8l~bM~D7y_ecbqHfOeEB=t7KPCXa+*_h=iS7P&DuttZ$+KGFDVZJRR z@oG5eisXQILyEZVIN)K2C(`)ipr!j#F>L2DzvL$`q97b9ITCw9=|l!PI}J5qb?HP5 z8@V`HP1*s&qM{k8cT%VflqSZoRG-q^8ye(@heP72?59(IE=^;r7oBaxOx(d79@u#3 zU=4K#WmFu@!m-hC;GyZDg(kyRo~#$~Fg(dC@0hb^ZDw;|c>JHT8Geh-I z=!rXNSR1)oO_Y$x>v^mb1*DQxZK2dbpOd6(QzV@(a#`_#NQXsF(54p%6yO@wXyqE= z(g;Y@%b=T1-doBj(tp8go`HGIZz!Ci=(SE^eMyt6WL;QfD<~1f9D%rGuTW&=yp;R} z@(2WrSR!DvGGql>E#vB#>NRDXNX`3-Vv~&Z9i<{ZV%|%=Gt7K|ZGD1O{7h*D80wi6 XuA0&3x`{uFx=kKrI0PdqzgN>^-Y~flJ6>RI}`Vw|< z!^TY;w-_q1Ncw8Pz&Z@}Nbqbj77WcGN=LpLaG4&9BugjbNccUjxcYc3{FAKb?@wLZ z1o1>BQaxpO*eH#9F@t!8u@L{)ova#m}xlFW&C%@PTUY zIB3FScw9QFdA(qGR2JLi@kA8m7X4s&aL!TdN#85uD&TdysYiXGW|xei)i}?M+%01| z!>tm@^q$O_V}~9~g&q-Lz}0;x$<;&1Euh&fgJFfVBl0k5U-Mc&z`WLX7^g73ty5TE zbLUlBU0Ad(Vu65`3C1O$3uM`uhT#l*E$6 tlFEWq{fgogeW-Fq1_5-l*%%lY8JK|10n#jt49pBHAQl5FkYr+D0|3i&EY$!2 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..d8914235c7c56a25659ee4fb4e7a92de4adddcf1 GIT binary patch literal 1134 zcmb7DO>fgc5Ph3CF?C%M+z-AX<*SKPYB+Fe)dK-efl6(a0}_Xgvou>dcIDkf1R%Ou{W%t(%;X7IYl ze8Pi>$49|l|5${YK2~>REcGr!r&$R6YRdAGE3y4ASgXfib&`Q#sC8v5-i=3nksk7X zL>{l3ggol;RGRbDY3ZR<47-KQZ)N=YG>pbdPQ<=YI+dZ$tDz>WK2^l9Rfv=4WF0W9 zD4LP_D22*FX<`hk%{k4zr$J75G$tPBAe;IdX&PI}XrjfiQ>5r+6bvtl(tD=tyu*A14A1{laii~M5mydxCd^Pj5_;x$G_0*cnPyT* z-={^aGYKS+R9&Ie;gFM>8*|j0r!N|G=WM!-C3r?8+IdE&%mdPJ2@F^1^noJE^j`Mc z-@yF#SCr0C_BYRAeaV7rWIb499aIQliIP3Cb@DVWQgMwu=2@n-LcnHc$V#+Z#oCmr sL(#@l^UsLk3|9L)DrI~oR|$runx)n==(UT`ztA;YCqPE)Mizhb4^){sqW}N^ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..e8143e72972dc7cbb81a69dbdda4706b790a2a82 GIT binary patch literal 1176 zcmb7DO>fgc5Ph3CF-ct-+z-B?Z3<27w1xwxRy|OJgcPXMRzX7IuyK}VE61+9P6R&% z{s0#)NG%l{_yPPV#H<@5MMSlbrSZ<}%zHcYc7Of;@e{x!Y*cXtx2w2=yA_zYr_KEt zEMrA)teU8sSYs$faZkhyUfYibUef0>IuW6YhOsZa9#44k;Y4`vRnObgiTfhpiHyQ6 zstn{nCJc7_n2)#@@bJjn>mCa~q0REP3}v#zu-nK5el})#%9Ysq7p&P~Fm|J!V3=#m zP`nxrx*|U0-GCx?JMwwZ;jz^IIA|n&sTg*0nP1BAMd$}ZB}Zaks3ewtlAVT{FuHUi zhRs}@tS0S%VL{Q1)H^9u21*lSSZqvb?hOrc#DgL6R1earKbN|(mCMeysV8n>77t83 zw6Knbg$k+`W?-3UT5#Z6Xu)OJ&Xe^r9)>4*j0i(FBBAktyc6Ex`s0tMJwHCowP zxHJM1^(yG5llPV~iu9j%+;cF;{f5FBicaec#@95tM%IQwwu%x#%o2!A_8LW&FG|Uu zCyzj|fJFkL!OIODYB4PC1O!II30sp~5Q~&?~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..292a2fd70bc8ec7189e1be3ca9fbe741169854f5 GIT binary patch literal 1078 zcmb7DOK;Oa5dJoH<0f@ma3A4ON_jT1Q4L5OP!I<|ND(ebfO0_Muy&SYBgd}n4T7J; zi3=Ab3W5VafFFgJb>d!7WYv~-XJ%)Z~^^oCiyE5v@9O4nrMYq@KGnkLl0THeTG7-8)UNGFNitY1wD#~)pelXlQ<*4d@Cky7-qsLOGM+DU1=)RNW=phsq&}>%0utwTj@-S%MaJ?U3uJ;|aV;JtvG0d-p z^E#~#Oj?(*L_n(q;}Fmpvh2-5ah5Fl+n|4wfVHGaYb0%9drtL?bZu$5-(Yw@u~Y*| l<|kO@XPCwpI;ug_)eDHVf?|6XazfEU3+L#Z;e6qL;UD;gAhiGh literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NCNameDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NCNameDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..97148258467d3084e3c97df28a3d09921a9bb367 GIT binary patch literal 560 zcmb7B!A=4(5Pbz?aRpHj)SK}HYA9EOF)Z-HD#CV7R7(^;z{Gd5AdUm z({&Ryni!jOrt@arylMOT_WS~%i(MB5)LhiD<)Go9$xu8|p)#io`Br<#Q0PZv$x!uF zDE-B3B;!jl(uCB!C=hxmVrAnDESRZE7`k2%&A6Eg70qRsM2k3(d@PJGcXP>?$(Z|n zU(Dor2K7il%cY`*`tD5Y=$4u^THdv|5nPLK!UrZ+;iT8TqPY?iTlpVJ26vE3T_`(X z{kulT)|at@qJ!-+c2HsH{BKN#qdy5>ZpEh0U3?-HLK}bC8Ay407 zSB^GK3I>NxoIJD0!6Vp1nl6#GXih?Rtttug{=mC@iHz%}@co+cII;3mQ?^*KIDN3lSz! zFK!6G$u-x53*q;Zrhm-4;;Ri*iC&4mBsw+ttW@;&Q&7^5A- zILfpd@B!Hj+5FCLWUk2>20JNu?kRyt446_efk}eVY%pzU4lPY_=MLGQ$c-|UhM0&C`Wmyl#JzIc$aE^{|JucsWkuq literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NmtokenDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/NmtokenDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..91ec5db81d31408821ac4d330280c51bf4e08494 GIT binary patch literal 827 zcmb7CO;6iE5Ph332gfDQ0{wutDNu=&wp)%>P^GG<5|Wi3Ksj*RB&%e@+D7)KB>#y^ zFKxvE_1qs-F*d6z7$k%x@6685d;4Z)|Nc9_0Pq2?T~zSQ#VXbuJa1VB@Q({@(@<-yk;97(Oeqdr1 z4qDA45|)@az5m7`!`wg`UxouS%)!5PN3v&H&3%GL-O+WpJ!Gf}eJZ9&M`+d08bG(X z2buh@DlK{`r~7@X!GnXUgI6BbQD<1l>+-OHO$L6?o-n+-3voExLx%NR@+X1jW1}>0 zi+~zPEmDasf@ZC4uV~i$XrN55BK=DAQ%#_3@;F&Ww*2N7*bj0FaA~bv1yLj4v%ZH1 zv}2e@oz@imk!*o%dHXjCXXMO+oeaEkl|UpZm{PHTMS{_g@W|5aTAJ$i9~6J0lxM2V kFjfCERk4KSjA;drEz{d1J%I*m-vIKVtyBfWkg$M9Z#>Gx;-b^O*dC%AV z0bq$?j5x+XV5Dry*6vEu0@GPq(S>A9`Y5wQ#kpJkE6Lu+w&vXCyjC>}OtQA%cEdF} zW%Qz}5SZuYBwb0$G_38%EemqwZVk(;E#y~7VEnrr0Rn;l)?+BpL)bC&{S6Sk0jbV7 Au>b%7 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..733115e351ec477644ef25fdfa6c5b7b12446d2f GIT binary patch literal 940 zcmb7DT~E_c7=BJyR<{*~n}E70gR6Zg#Vcb*NKoU|qPUq|a6xj`oot76?b4p<_$mAX zZ@eMF7`^ZZ_@fB#>4qVYr6EmE&-?j2???Y#{`m`F7u#8+@i>DeJjvlHN?I&icxK@_ zgEi(#iO^?w*>Z!CqlR1tW8p`^By@$-=ZdS-v2dnQ-wDM)Or5qqn+)ka=}WcGa9mA{ zd_Pa~mPewQ=zSBX)@3l?1%1JgZ%JQ#oQ!%R{K9)4X$q~tg#6&qV9+9;sN@H%Od3$iloCPm)v z7Q?H1j$co-kpy#N1!zY{T)9ILp+Y;Hrk$qF>8j~w(3?S)G&#C`COJjlT)puNtp4IB zjPuyZrgJ4W>E9qrPY%nZtIXWVmM4hqL~Cn!@NIw*hQKaihem&o55D+f zqG)_DKKrALcXnA!FogK9vvbd!Irq+)JHLK^{{i4G9wm{&l?0Nw8pE|D{jVos;D#P< z>fx3i3P}`EilH3CZHB~fBwEsyj?KVo4ADJlOZ9|dr%-P>150(ebcVuqo$;t8tTtC% zy&DSat=qN^roldUMYUFJFod5vZNacom$rC59yG=16>s(l$<&<|?>G2J>Uauj-$>yGqMiq9g?f*la;wknj`gD1 z6D?IOzGg6-W=|jEpG5|P{)#TaL>hNYm^ecx@oJjWGjS1{CMvK@>Wpm@JGf`!K6YbxVB#SxhR4h9 zcVP((yUX@Acz-PBOJ~^r&#ux<6>+I`$P%NVEldxbQ*q=-TOG?zS82a%#YL7Hyh#nV zURX$oE9Znd%I=Vj0n593AEo|U{d?m9Gujt+M|F{>7nY)zM}47hf@TJNX{->kO0$;; zc}S{M{t8yw{DROYfSNi)H327(Lluu?S3P^OA>g(L@|A4*GT3cyCy^KIt_c+Uuq*vd77FCUlY1>_%t#Mh!?NtAvmku){d{eK{!91=z$fMw(h=Pq3 zf!qJ#-$vEJ5-JW(R%x0jeQvP)qR+s2pKre(i%w%S!nQeW9W$ux4+RGyCFVTF3 z-cC$;Y5n!mB7Ty}E`N?w^ryXW;hC4aX%3XN)&X+b0B`ROb#kl(JM^4-QLN3l4V+Eg QoFg~5Q2rC#!~*hv0HsO5m;e9( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/QNameDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/QNameDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..bad289d32bba935a05a1cd9e8d1f6b1b4c945b00 GIT binary patch literal 1650 zcmbtUT~E_s7(MUSu5(PqDbuOwK!uG>isI*{h+>RO7Szm;=#^!>VohmD+u{5zdhd-F zdV^nymzwx5{3FKmc4eY2QDc+7pXWKx*J;0ed;bx@46bG{gvks_C}%K*N*dK6oW!&N zGlLXn)Zr;LoHj6P;EaHNXVF@d0@;S^N`Jwzf9s9q$?|Qrj}Nu*kxdS>+4k1V@R4PE>(ULpj^CE%iWOSn({*Wf zgB3IKeLX&@li!hDn|#jGtB&J6A;(Cm`Pka9OviFp%~t5!?rOb!pJ4@|ue|?uDUe>3 z;gaQa7~SFk>!#T7E3sAp=afsy6Gsd}w#M z+h_}v{+3Wc*nArTL(Gub#X(;FpCDO^oE^k5Uze=&igd%MZM@2~qN3lhqgMS??P*oH zEOueHfwNhhL*BsoEH2=p01VW!sN<5r>_4^ec;rH{Ue00;SJW^saPpr>1gd|+Z%O8w z6|l?W1K`~?$Lxf*V^ZDJjDTSWcic$n!@p`qU9xQ5TMsGpQlrccP5hlm1oFNNJZD3y zk0@BT+VXa+jfnwW-7cwE%L0=FfZL?ErFnjYJA%$KWgn%JFEtti=|-5q@8&2%{TbAw z^JUi|FwE5~XEq%A)EkJ`TqLlEV}>*M!_a7y<0{(&VK4S^$IlXZj*8$SXNA=(Z;^P( zMUNmA8KfiQd=C&Cs|fbvKy+Wg!Ik2j8~Q9=qA!Nty+jtdO`mTUA&4gdSz65u!$WC*$-+uD!~!T`zTjMW--P9 z#&HD4P{ssKVUnsZVV=8d{7I_JZxTJitPe3{jfim^j#hP!>P(fh)laR}PpySf@+N5A zq_-lH#EsFqS2c%R8c&K_={`fQ+RG?P`4bH71+?Ukg7!LMl5Zx8YpQ48_gw6IF7`ba qV$Xv49gjU%Ije>zv>)8PW}VsA=|s$%zzKzAZFX|b&@#m_i}ZKh5^{q8 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/RegexDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/RegexDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..855c6fce90e4f623b1ffc1539fab73af3715f373 GIT binary patch literal 1245 zcmbW0NpI6Y6vzMLq%pPKB`FQGY-P{V)*vJf6oD#ePf-s|l>@hFGD-}N9oa5Tz7rQD zDpU?!k@!%E|2QFCs1%AV&&->7@AtOx&tKoZ19$@0f{B%B}T1lSD;wp zddls`EjLwkceOh0axcBWOI`^qmj1?;8v@xkVM__j)x1FM9CY_pv?up{?i6ZaQ~C`V zd0HNAW|NK=3%C=bNd3PZ#l<*GhTZct_jzfe@u?KHf;I!&(2?d;x)yl$9{>SstKU?; z#0!JiM41`;s_!vFf3WHM;UTlSute_!GI0_K*wR0ggSa7muf@GmnI~2~ZNPS#Sm8|0 z>$-^!98?@!!L$Plwu!2P1+1D_bFhwOwsTT9&oKW%e=q!?fFnBjXb&fu~NFAzXe?7nP%?NPBV*@ zFUb5rzEb7FI7ZgM5i;lb^Ncf(Me;GYT_a z_yhb=j_*lBDWME7Ui9=^&Uw!Jo$q}4^Y_(BxGu}00UO_ZxluZRA*}Sur_KJq(Y@4OBv*YH?biwcp?_k?Z@0Sbd zxnMFw|8WIP6IRLcrWB0DuNInEXVO`xz@+V2t7IC8HL!(KOBOXk61 z)GJzL1(^%;te9obwesGvRLaa;QQe}*)Aov%XRdA=c}h|iDbzOiEef*_rfu8VqnNIE zcGK83(za3BNUt($X=6O`ML`1<$T7}rDu^+jvFnDtL+oT7K-O_L(ynP6`-E1D&j5=P z%PGw|CC}XV{6vx6yn^^;BNTLOnBKBmFx?gM1tvF_xUi(BLRe3Ym=C5=-f?+`)Fl9c zGecV#8XSJ@nxseTIFMMR_T$GWfjPjcRp zSJD-3^bu({9q%!$qZ7BqEa>RKH66XUtD_GObUeai9RnED5l2Et5-A-+5;20bjwg7^ zx?S`U2q#uBbWuocoq2AS`E$+dipKfksIQIRBtXFpQO!||zfN5DSAZEbAi@EDim5=*wXP1k?=wr6MgtJw)@jkiH(DsaJfeO!iLw z_?B?|y}I#iyCD9|snjr`|I(*oAJzS2G+%IOcN|NDiy`}7#!`P^*sTRoGW2zi%j8tVDjAO=;di;_`r=gh=c?=PPn12bM6*@zFgPER zE&&w-8H-QjVJJr5cxa#(f`m9ad?bxNF*>>@6~nukL~T>wSE2MsMtaKHB)X888MbBu zOmoso8A^(4sg9*kQ&5@23`@13&(F9&;PHw7IqZu_H|s|Xb`thY3s0O3UOS!3fiz8) zpRIGtq!p0EdI2t85POO<(Kw*)15JY??op;x9kM QKjN2A!V>uzmecr^zt?rktN;K2 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/StringDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/StringDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..105d6c02e88f05094b10ca9c4d2e1c71d2bd1aed GIT binary patch literal 372 zcmb7A!A`5nR)x>&CBe5e!YJH7~(XBkK+g@5!!_CMrmbl34XVi6M{QaNQDkCFTboLBc;ij`M?5b09i^3>z$>q_$FzVHkvE{rG_Os^63TR^MiY;_lF{Q}w z^CB47I(RKnH^E~atyz|H2<%8Kx62Q>VR5@`PENF3C_v)KhP=eT9V6&A09rKQ|M;L>#LtYb@2mn-o$z88gEQIsggcTi*$ z`&S554J{jjS8FcRBxCVQ-D?Je>IzbG!Y<27hcitvad^l~6zvpt&%4u7>$ijrqwRdn zb)7Po;w3j-7#+%ceS2$qWMvMRT zC>W(Ki~sw6p7JV;TevK|WwDNmJ;(6G;g4RdaCc2M9$}VIvy-1v+R&}8X^re3SqPn)k4r|m_~rX=qg2;SQ*R;%NO{l#x@oGZ5X~5 zh7YLMJd82A-o!|G`)(M+ZIzs1jMGFj^9g3Z;!S?)U?24|ryI8y*p<>76!nx((p0C8 zL?_yK7aa`knQ3Nz0Fn*`>Ew6vZ=_Brug_Dx#f`_J#Dfq#p;^vBuv2 z{uzw~N@t$UqR~W?@O}!Nnud=vaB3F6n{*57B+YpmR>3of`e)GzO)<7=OCxd)dNjl; YkA1+INA3tb=)>JSRsq~EcuvLs08aNOWB>pF literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..ce6387c3af69383bd1e1b6256b5b48ea14107d9e GIT binary patch literal 1128 zcmbu8%Wl&^6o&taow#)ZZbQo@+`>I|o4PCzi$E6?u?j(=C<}HIXGkYi%%;F4VAo; zBFPt-Mr2q$Z6Pbx1KYdlS$HA!&Nj~6oK3wLH7sDUhD*3ygM%dt_iMO{YYdO(9jr5% z3|sU1a{KvyGi=Oj$xHRoFq`xzSoEU+Cf(#7G%dYtqeK@_ao4|reWAA!s`Rwetc5bw z)+oL>tHL>)r-+X+t#yHfN;;(7^?) zq~9H^W^%N?89JnDZM@-rg`w$YuYH25+dfA5Bg*WkeN?E_(@KX%SR&3cG3u$JJ0lc| ZjY6@JDe8_ZXuu#T+D;-eTu-?-ego5U8v+0T literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/Regex.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/Regex.class new file mode 100644 index 0000000000000000000000000000000000000000..57725028792a1531fa4d1160b6e198ecd1537d68 GIT binary patch literal 171 zcmYL@Jqp555QJxA%u_2H@1O{-y}gwnn9go}S@J{vNS+d}X5j%ml$fNk8D`*{VLsp2 z8^9iO17k2Fm_nRQv?Z+8r%WEgxs)-7u1U-Iu(=WzVRdh;9@AX=aM4)1-2f7{wkp^q vl2)~r?MQJXPTaFr?%If(0p_tnSpL_~w@j@I2n4Uc1CURcz#kl@y?O|K(T^NW=FNMV z=j;9eFvC!wFAx$$l3j9rX2NQ`IjNhHXJt|u+d`XkIoY_ev`3}0oK2Zsi-hGtS!L^- zWmO(z!6{dA*W@K3jH-llt20vy3>=PI%DNR8wOf%%wc%+aMVS9_{zD{;elEBB6DO9i i_~T4m8>_0X&wxPi+)n`V2_5(jcO7bK;6k|GL+=ge{9bPW literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.class new file mode 100644 index 0000000000000000000000000000000000000000..b3ded9d25623d9929bd1d61f7db6d3f0fa5ca50e GIT binary patch literal 728 zcmbV}&rTaL5XQgR%^%nV0wke?(gHUKQkQcAARwxwFr(;~La>YNeK$RgD zR-3^-@r=)VrRKpMyyn&~_>aJ4w^e0#HHOz6bZ0s~hn8kgMmYB#gX=6k^&0X@jL$cJ a!oTIjgLPVP&20y?$Krt*knqAyZ9D+_wUy5R literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.class new file mode 100644 index 0000000000000000000000000000000000000000..6ffdf0ce1a2f8e42803a8f8d460ff494b54e8c9f GIT binary patch literal 2592 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..08e0ee8908ac0d6ce243cd45a5061edfcb3c54bd GIT binary patch literal 1015 zcmbu8&2G~`6ot-UeJ0Jia@1QWOQaL0y)yEg7&)5d)~ zu;5yFXyFmV!Xb~{5m!p2l3~3y;D_8Ft0?wU(HBSl`^i>=q0~N>DikUT7)%vLnY+!f z(+ZNIuR;B6Aa}RefaHo*cItM@5Yo_ZY2Sa4|p2sc$zHg(=mX-*^^SF&6sDI zpv>-E65TqT*BWvagc`O|nMjVg?E7t%MzY_ib{GnoO0}@O6SJEPb~`utb)=XXmUGKUB5h#Y*|1opDbiRu2$l3)z z+L=S-!LwP1njufy;`3O@Ks2i7y8R}%H6@47k*8bvmpgO^Ou7sVmtkO88%65{x-X!J zygQ2w$}FNx@e-|GP<4UkvR69+^R`Z4c;8X@N+|e#$NL7Oc8cODE`6bRma&mDRws2+hGwo~gD3`W=JmI*LbDcc(oD}EDRl!> literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..6fd22c9793d9b715409c3d9f798caa06245129cd GIT binary patch literal 1182 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Empty.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Empty.class new file mode 100644 index 0000000000000000000000000000000000000000..962b13c1ee3994f332961ab8f8d257e05283586b GIT binary patch literal 1021 zcmbtSO>fgc6r6R^*mVL4ftJ!1NNItD0|p7ip{0mK1w~2$k*ZQpXya^>E%w^7*C>_v zQG6UCQ3>w+D8#c9wMZ40R+e`6J&$MRjraGTA3p&+Lc@lI)p-Yk|{gjmFGQ;chl60jXdZIPr(`!N_ zp6Sfh+wC;9g|nGvX+ArrHfnTtExO*6T^b>s@-WhQs8gouDcx~KyZOK{CSYIbXrMx? zO*;&Yf|1|~)uky6)r`c#Ra~1&HhafaL`F=B;%jNCyr zKf&BDs-}8V{O3$-af+I0rCzRMi8w6WI5EDSVSwT>3I`LI-(jTY{}qo2vYZL5ph$a_ P>H^k?&Z1`xck|X?nZowy literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Property.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Property.class new file mode 100644 index 0000000000000000000000000000000000000000..eaf077c469f9f62038d4d0b6b5c48b16b1893d5e GIT binary patch literal 1202 zcmbtTTW=CU6#iy_<XC7O48IOG_4ONW`F^6vmY>t}+BI(UlCz^6FR;$RM-8L=LTVt5dPP=p4^tfy{=y81A zwB&~0tx0!F)H(w=yDmE0!Zp=>WDI(3v&RtGbZtkv-adm~u`KD9JEGT<5c_ex!d zAv2wK$!|8LTU6NxYJQU;JyqH$gdt&CgWMiW5a)*IWxMNiWLH{4o>+B|>s?dT9-rj3 zs+y`pM@~l!GdfNqMZAxkXJO=Z6tJSiHD%f)(<;NA|Lp+7z2ibuO;uF6Ert`JN~SEK zY^9=Fm->BMhCQQ|5e|*6!LTyj`eN?ytPP8+paoY0AT3CrjuT{= zCG9=};L4H@@B^@X;S=~fx^u)y&XO1W1vLH=GyD}2WJ?X>aT2HKrmz$)BW<31L)0~j zQK(wJ&_`f`7gJXL8X^AX5SBK^(y)N^0E_lyg!OQQl`bTMeS~%j`H$cOCGoruZD)d> zRJHN92vY?K{vHeb!y%URm?b@CIrAr$@V~J1iRFM;J`>BABUv~y)CrEWn4>dES_I2< Ls<|v98;tw}bu<)j literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Range.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Range.class new file mode 100644 index 0000000000000000000000000000000000000000..6152046a5bb69b14d808412dfbd8e26040e1f2d3 GIT binary patch literal 973 zcmbtSU2D@|6n;)V)-}ep#!aW&oF7xVIE;cgq<&l!ghIOwS0>`ee4DTFi=T?H%{g{83}syDi6oKieq8gTzL$1H5DjFQM0>F>y_QHt`hFn2Vbbzq*_K1E z+j@Iv_paB7MVRzN8pSJFzcRyX%e1Z#>!nr3oS6!Co*NHDEE^GFu2k!acf#v225+<3 zm3~@Q$;2_|?+~Mn(vFM?)^>*INucNz4yWHz?QB?Bv5~{HjXb7vxK4QZUvvn?<2VVk zhptLSX}oNv%l~5iALsEEF!%=WzM#QT9Qax|iUv!AKMSWgYP0s7Gjx^(_bbR<*oWpW z?nD2~E)A#obW{P=VbBKhw22wo!VLQ_kIPWt4D}SUF_dX)kjC0s%udF5ELF^Ozd#$Y zGHyPloV1-aw8set4d+fQ){hrIJE53x4(GX@BKToKuzd3ejJg`X#@|Pn+USq*38tY8 zog+FMStK(!%@`dS>GI}4FJRJ36zLTldW|L8#WKBtO9E@u#5(!7Ppu-bga)I=bHcP;50 zw`-0s>+;w+s=Zlxz3OcFLbV$r@cg+yA{QA3tDXvktJ=?+Ee2L*82-&{cq$}gUMFaE zf)J;(l_T+1I1Qod&Sv1ds{X8Va3KAnPB*gOIbfK$%!OgJ7pmmx1e;Rzf+k%RCi?PR zC%zeG_1x9P8adBkNvkIi$DoOP0tGB2kj8idi&$c?cE7z}{Bd%!r~fz%eD{@!Wri33 zsa_20SB=!y%~&5!U0h8XCDEeZ))>;+QttAC4%cN+>hEAAo1-2s{N1MFKcYOmVphg1 zU4$525x}6Ax&j(jLS;ng0nB`Q`ZL%kf*eDk3n%Cx%9k-r_H54$Be2P$4H(531<~j_ zA@W8FEBwE}}ahkt*1xMi*;NAxfH$VDTbs{sfbJ4Kw^H=J|S`cIHew g)6=Gd()3bB9Mj=?1J~$llWie`q@l~3LC&y#0sT!AWB>pF literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$SingleChar.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$SingleChar.class new file mode 100644 index 0000000000000000000000000000000000000000..32c164982d57f93299927a887ae6ea97cf121237 GIT binary patch literal 1085 zcmbtUU2hUW6g@M*ZrQFvQLz?3s-p6tE+!^E)bxQhS`2EGN{yPB0fw>_cFBI2`cwQ5 zzL;n=KKKLtQN}w90b=Y+yUEPGbLZxqbLZad?>|3(0jS}Y0UhVl&~U+^?V^E8ST}GP zS9Dy}QDk6US~i1r-*KIAlOb8M%WX2Y*OLsHrsK+|(WoQ+ZP6K0B-ix1V%QeGqt4S{ zG8{MogVA!_-J!Gx!e=lWt}A_eD1t!J-GgS=8(HB%INn&gffxB*Y4t=X!jEHV?FT)} zm%DP`+Uvc)^X{&-?F%;;iqP|mbI=W<2o@+3rE-HI?M2}@3hSdWL!s2%6CZ>%6z;Co z3VlkhNBzF^H&juHPSj^uJuHPG>$tJtXLCfO6-#~SsNyqoS+^CB2?N(nEFo>;9P&DD zm?)vFqhg|pn+)~i7tQeK=pduthB5#6o~f?};!n@rDZ zhW!7VKw~Dx)cu}nlwCfo4_K#J)oFlf+SJ>Um!xH2nIa~6TS$PDH7g1J9jsFL2L6T4 z94BZ$Nw?rz(0BvO{4t$@{3IV4LR4SeGeQGS;q(;MBC8^)%2)8uRM6G@wttt4rc>H!jSF@}or=ScAv3qrIRf`+qLjZtZSrdV&LSOq2I2a=y)RI_gn zklLxLh;rrxIrTRDB@Eui3g5vRf3-kVm=P7GL>y~zX$7p1%@LJGKZPv4vrhI}a_KJt CgX-A; literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Subtraction.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Subtraction.class new file mode 100644 index 0000000000000000000000000000000000000000..486e425c39fa6f497b32f3b9d7cdf8cc84a638ef GIT binary patch literal 2726 zcmb_e>u(fQ6#w13kJ-mS%a$!|L0S;%c6VW0z@jY=VF6v;7Nyt<$YZ)YZKvIxU1n#o zVEkr6{0B^oevz8=vxyWci5R0K;v*5ofNvuBim&(}Mx%J{>~wbxsUI3X%$;-2ocsHo zd++bu-Shvv{0e|}Jnq9{+~dO*Y!y~q4BNbD!gew2@ZnzECt?W??ibDj!bwW#@j*tf zaCZ7A@j*Wx!Y)7huv-idOBfK5N5rtlhdS&P!#*)=6R}4n?3ZwW!I4UJFnHr5iV@E! zg#v?|&~>%ssN}|zsa!T@jwo6#uj++d(MYMWv|=je(YzWPFQj9JI;@VzM$=;*2iL`R z8;V}YC}z%BQO4}HXx1>eH)y(MZen;UbPG^#0YqCrgEO8>s|+x1*+JFVtqf); z5=iD!N~T{iG~wGpr#Yh0uK4?kgQlUROf9D~Y@c%}RWP(m-dxel7tO8NJj3Epa#T5@ z#4?IL9P2X;O&{J`92!!MZc(&jusFofFk1>kT?s0l%jPp`R@Fgovf{sVTwwNI3nXQVU3I7D2`F1&K0;ygA7~dic;=&hWW#) z8PDmaqUi-o%Z^YR9rgT*o_iE?grpTpB*cdWRrw`#+TTd%^_5B0O+a!{@^l}iMWe*q zX77XO&27~EKj~B{koEBadfyR_Oo2t|F;9b& z?I7DB>{D=tBPZbsM^D22BBgSypfMnT_-k0gU&k{323q+!tfY8L2@b6Ykw?H5J+mxP z04Ix@)TY7jCdqjGHNZ-dI{sEC* ztRieK6E>F#>6R%G^0id74`3ZHLJukjar5-XQOi( z3mBe3Kv)5WS5epHnuMEmxg4GD=rk5GbV@;YP&$E&(V%-8L2e~^8eQiQYjjPazR@#< zMJKR)7O)$a2yF7k1uL!7E9MP}d5c7#egb=f6tfVTB4I1PV%2{mj8?o`7ijK z|B7$w fs^!=$R!&XrptkPEZB7r_{nT9^`j^;`4mA7=d>pHR literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Union.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator$Union.class new file mode 100644 index 0000000000000000000000000000000000000000..bec599ed2de642e95488b33292b4cd33fddca1d0 GIT binary patch literal 3049 zcmb_e+fNi{96dANEW0d&3yUDjMG+PEqAp&F7cPp6QgB5D1(d2CV1R+Wb$2ngX&cj+ z^rdfovM)BKiAmEmZK5b`qV%N?edwRjJ~jOh+MaJ_*aStYBf6{}i@_o&VDZC?F*WI|Gz@0Rc(`GiOpeDX(+%lrec`Ff(Te*C< zf{Gq1W##)6RK^yJY%F2qxK1BRrA((|vO5@@iqE8z(fop8r88zKmtM}!n9*4yZ{*+4 zn9^sK4C7q?R8$g)Ir*_cjn z#2-)37>RKsYsr3LP|Gh^Jl=IBWu;RJPHq~69e`w&TM7o=1Q+U-PfG6piY4hxHJEGg*!-$kM$fdv-a zW&@2`Qu1QT$a}+xjwGTw4j`&Pow^}eFr#WmhmN=8m}hG3&i+52KfkWy81}o7){((` zI}@aEjm|MLyptHA zIT#DQ+LT((`hZ3t2I-u6+d09Z@(qPU6&&3pPjX}27mQnDrR+QPLaAE!l@oQUwYwa~ z3kAF`m(BaUk!Kb}(zsoag-mM8PIR1)Hhw><`N83>D$UB4hySe{SFn?|(#cS%}@}V2@j{7eR*c%JM0M%kVoUIM@Co#MLLz;-a@D z{OkehBH@-pt8l59xT`7;|NbNL9alN$G{D7kJUpioHG-c$zS~5VeP$b@d3kaK`|Q)( z?K35bCYz4JD6HGU=_6b%$@nFi3jVvFz!Q!L%Oqcx!Y1m8XQ z0@@mUkrmWDL}fr@qt;g9=Sa$$U%}xlQ6Qj*t^%jXT_wkIAiqBP&`NDbc0X zYb16`606sW%v=GN!)#~3Wit!3+=CwR`&Up$RRXR8&AS@&ytW=?@KsTQc9bvB#wfm` zwh!Tr__xZ40T-pJw}Y*=XkVf_;%|`Sa>YjFZeSagYlkX!F~7S}FZN)M=s=g)ixVP< zei1@UL=flPs5pQr5yg_|#E0S_?ubM9R2;@TZD@6LO9NGSqsbJwTECzR&Q<&7mZFUJVj%V4du7yZ@9X=sE3$}VHWi{;u$8McoC1rlN~%& zEZ}uK;ldrI@?z?C63->#86}=e#54BVcvSS+98Y2g-%V7g8Y9@Q R$qQ+O#_-S*BN){@{{W}O|oX7Bf(A3p&s;i&-wGXogFJsq<-+&7TI105v; zS=*NLAEQd!t z`qUEEY3NviI2NbYiSuFk-HNpra4&RukB&sJnk1B}$43m4|8rq5!V7_?O7nCndG0vdzDM+3VkQ}kb_)P4Nyjq7i+=A^<;0LtQpaNxPq4zU*)Q*MjTm0_3#!RxtKC7W#B^;} zG?`LGwdwfPnyZRD>+@{tVO5511*vhU2^cONv{OG3HkJM@iuA?|dUNzHk}A?HO=Aed zq{-84iyodv(kyGKGqCdXH)vmItzm?|!(@f_9$AfJP^;q_=_cC##2cp-?NnT*EQJnr ztwS}=kvberpCR*$>}_V2e4vR7EThXZFo_$99aEU@uq={^CR6?j?ejkvsW4{Sp^LeR zTb<22$f$4&3+KolCWK_1LH~}NhJ#+FM&hP5F`;=EA}e%}1>D9Rf@&zL5bokS$tlWn U0CN~aj(%Kon5Xy+l8fowUq!knt^fc4 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.class new file mode 100644 index 0000000000000000000000000000000000000000..5c92a8e1f12769a7106ecbbd54f7c82b48364afa GIT binary patch literal 19682 zcmdUWd0-U9@_%*DY<3bBl1xY-;Z{&cxJBgFkOYV(A(9{lgt#P2vas2Wn~fY^LBpX> z5%qZ>qKHQnK{3g$?gW?_ve@AKR>cleNI((S9Mi& z^|1fr+CvT-ijk#yv^X9IMGAA9gF6FGI-Z1-ixC+tLA;K zIT%M}qM37t7|91t@gb)lG5DCfe!?9-CMu@liYJl!jBr#?c5F=alW@Xq0q0WqYUW5JzKWd>oCD3H*8@ z1Cv1#gN_W68Kf}i#Go^SR0e5GwTn}Bjia+ombII5Lra_%gy%VYfc zoGakmWJ4Cl%CqGZrd?#nVy>KO$a8qbrfDRIG)g#f#E|D2vc!&hV*bc$B-4ARyw7ZNzFCnJnre^VN@B?Z^(cls||U9A%ljjF=WV) zwT8UVkn;_>z>o_KxyXkPTrke3_s3PaW#a)}|A8giK-mmBg* zLtbUbzZvpsLtbOZ6^6XlkSh&&oguF`U7cNlW5A@4NgIz!%N$h!@Bk0I|hWP>5^Gvxh-TyMw+47tIO8x8rOAs;g2CPQvE z^c2}3?<$fpeX zv?2Ey@)<)uYsmeEe9n;18}a~FUBjviZ4iUO3?>8UT&HvHCCteI4K@&i&FuqYhlxfiBaC4kAZCpBFPN%93lzG%po3~`zv zPBrAqhJ3}4|6ty|YRK0N`MM$BaLP9Y#bpJms(qd+k3S^HmFxF=f>}OyO^v5UkYlRf z8}JKiS5!MY6m*w`RLLj|2C6;5&_Y46S(WbK6t};^X&{L7KpjwcbH`jfkdyo&b1{H;Zz&%=! zRvo}7MK1dJJpPJMr66ZnZP21Ave3b!I!srHYHEF$V&`KJjjx?E#}fp)xH5OhQxOPy zdG77A0{)ti+aEf|?W^?&O0pXlh6l~PvS;L#1*!&xD&1bJiN7XL8!Yn-DtCw6p@r3+ zK?`ci2Vn-D1%u|6&l^%YY*2B~?XU5GsQNNHWvR)TT!fV(te=i0&e34uuxfhI z* z%GcQ5S&*8Elc$uF7GhPRN^=B_En{WS8$#Z@wUGC2VN-7id2c1;y)7Z{9T9R&I!aX3 z_J*Xy7A^FLDm@`D);wm6*Y6FD6O`OHs;9lf`<;VT&kB@d`^D#Z{hor_s@a}kv3s@; zHKvl!bKF5Mm+eYDROtn$M;@{@6f?;J1h+{B}5S@Q~z z=@m6VYsDr6f>rKNcu>5bYpbEcZPn&b1<1cIFrN{}snl+auXYD(Jc@440+;|n9sBl+ zq7YHWvuhzQ?aBhx3$t2uaQpBOGedzYwF1z^?W^4LqILg8ZLIRK6ppRwcf4F~rF#Wr zUW56-;>|^_%8Q&<8iHPHfwQ+rME_D z>Oa_dV3Y1w9bMj1`jiw3UJLKyV;a zbcrUh-YMUA$%Ep6pq@vK;uvCrx<|Sc1k{MKJ#(xP1%rX0O9aJbF4-&(xx^4L)Fpj;@YM1;-e(Vy% z#HlW^nDM$SZR9C0h12g6TgAgJaXC7R6%4KwD_!CW&eb#6AU3+h-^A5U`H4$@DnE0{ z!}4Enm?E=j({ggR&oODQ|3diB<)s%Wa~xV&inXr*6FRE*VQVV~jrUe$!ym44`&{x1 z31=*B@Q|UW3_ErBX(L9uDuQ%e@ue5F`J$ORN#MyW}_WTbFncIguywVPF(q zWna#L#tlGGo^hPZ*t_NQ=91sZ@161om;6!wBxwBc;)@*Zm_r){Wgagk){9DK0FnF| zr-S1~1Pubm!#=K#Jzgy8@XJH_g~6{bF-7FNL=l5x22&ZF!(bYN0tS;AoXwz+!CGP&mCPi}%)cm)OB|GPlMhe-jNXOuxItnIhLEkI0`~;w&-NCGHgs zka9+){1JO}G8g(ak!xEG+a)IPN#1DL6fII8b>zn~Xyg)`u`e_sKY*82g)_akW%spj z*_LWIx-<#JqiLG%(i~dMe<_zrA7WidvVhj12TIkCP zES^h?xD}k-UC@!s?=Hex2FKE=CL)n%`;t~_YM3>eo$Y}{KF^2i|h}i8C zr*rNJ@gzbe1pyYItT}nU0$*Njepx|zQJ|eA9!=g9MFIR|5$5K*(4UejJw=B;cVpk$jr2~c( z;h5DDXp2{MISWD_f4Qf8Kqen>xp%l`JiOrC!c0}Ju?~_cMb+*y1itbE<>~~O=Lv5$*H3F|?RT zp4mYULL@PnLHBHR9xp;aH#_&mm2S7+jk#odaDH`H;Ghj1FdlI>m_A^cSR1UWomXjP z=emO!KFCcDdKcm)N3pxg3y#GUdwjJOV50LZx8LtBM^kLR+vi@0rwX+&9+k+#odP+$ zujRP|s4n)-hM$Z9I`bF0{Z)K0FeZ8e!3s6%xJj_KwZ1dmRp@Kv;K(1SRujvr^aKO* zJTSy3KzZYoT%LuIm*b_(*$C@Zc>Qi)(L$e(r^;(HxuTLs;h0kE=l30FRaWu&H#R@u zuL$@Qtxm1jl38Ak)eQg**rQgqg<&}TO!Odj>h=}Z`pZJKSPhPxrh@6<5tvdPs&V_v zVVUd#IF4g-(Bm&#ShTQecEE=Lbq+I9ac@o_7;Z|mxb5@K^Mvc#MSK*z3>F3h^N~r; zhyUS$6T)IJ8RR+Ki29U#Z%vs8v-f)fwKc__vP#UFXA+N4XDAr(6?!r7pmN10BYJ^0 zw#cxfp5PQuS)c-e8a1ip9Gr^-HJ7 z4iK-31>Tk>K|OQJJ%Ng#ySma_mJO5148Y*S69TTzz-3bfXIin%nB)yY;#vHSvk=Uk zXJy9+ssmMlIgq+emI#7h)mZ1*UY|F#(2~a(jAV8#Sf9|+J0c=oS{4qJ?cEE?khV}I z#*={BRtVveqso@#@O)~*Iw2El*j5K<(GssE=RRKOxRR)aiMK``)tq)T-3Tch$`p^W z8@*+P5DnZCD9PrC5-_J)YU7v|R%m8em?yb?b8L0Q{A)Ew8&P5r9AzIDR6x(q-2X%5 z(2Yis6>LVgG)6z)TMm`&FP~8B^QpXzH+HhGJU0Y|#Tsp50IC8RCj`P1^xzQJY5c-P z98mLn@@t{6Sv%NUvBS|7J)(D2wBUzd`QMp^LH9m-@{xs(mSw%z%_qya!l3s;I1y9% zaN1##x1zGB#jikXXRe6!h;C}17nmO@yR>dvcebAhki#jZICzG&d4aqT8`RWMrTcg7 ze`Npe{g3Y7^IY9?i(gyy&OPtkd#L_FAuiv$e(%mFw>-J^$vsciJ#{7i_B^#`U;VzT z_if&{b>H@VJD$1anXUWp-@oz2oAI|Ae{1k}2mbDS@y?g(@ORBi*Sx$Ee`{V|^UBq) zT>Fm=|JeBYve%cr-Sqa3xA(lg=bdZuxAVPw4&Jkpe-EhN_9X`!mmX|-h<`iPZ`W-H zAE`UIdwuib8=LDFt6zO{J$}p8@2ci{{H{^I8=C8PHP`P}zdgUVeZ68!E}zx$e(;J3bc$%f`74>d2@+`Qyr_1oUO zbWQWpJDQiSYhHSP^V0RrOE)wx-PpWzQ}a?Z?NGm6%}aMRFT0|7+4|;X8=99r)VyqS z^RlMq<#o;L?mM)2&!PIe57pnNej5(eZ#-20(4i%J4lTXngSw?3)HQujxATMg%^z;x zcDSzY@by=Jb$8uYdv0Uj>3VGP2+P=+&-dq5F*n-{7&xkQZ{rKg6uTY+ySDA!`KMUc z^xWF#9z3x0z={Lw4($9>>{}jT-&;4lb>mSi+|-(dmmh50+9nIZ#efH0JF)CI zZzqqrpgr!9s1rS$su^FbtsC&gLwjbb{3hi0aK7D)$LdZxX~wL_>Sm%89|^$NCobol zK+uX<$8y*!%U#R*uzz%L5Lg}W8An#@nbKx8jpP?5WukKkCE*&e$6GsOpBD zqoBEM3=|XSps0i|Jg~xu_a3!QmJE;P+X4sU0q!K5a`?s3Tzh5TzaZrN7ogy=O!zCt z!ieJ3wM)%3FMpMg+!nvFj4>WW5ZUv0^qrxuP~vLf{I+~Gq1WJw9!p!puFA=MbECM{ zvbM)op+5ru$B?vN5Y(*=jiA^uH8f|)aO_7f9BVs%fp|w$2{G&F;!yNOD9Yy!UnBO- z%3>*GVZ;L9!l$Oj%~8>mW94nM>N28@hGS=RtVmuLZPaQJI z6bR)bCpq+w)Z~D^DkA`|Qrrfpdc^&arioGLFT`kWqhgd1U{dwtqUsA#k8qQ!KLhw$ z`Y%C!W>k48%Hu)DZWmc7XGfKDs51w(6dnW-RfRVkvqDn-CorHJ{e^xUX%lwcgwBjXk`P(ClJ%TxwccsP3T~e?0{}Whd}NFYEK_Vp-&bUVb+8em$(>& zgt!DH9pC%Z;$7TQ*)yI`G5p~qjZA+SlYN-t*HPDWr0vs7P%&LUA8W9klDAPx19eh$ zs*0B-C0)nbMCP9cR79UrJNk@z)4ymSeNLy)7c_#tQUh~YgzR}szUH!Ln~N3UK_p?O zoj^SHR*FkEJ2z75o(OsqqbK?X@LQ1hj!gPK3T={ww$&_gXJ!*9vI(SuKpF_7BwW0f zI-t;nD;kb`6(N&C4v_f?WPZky{z8fLD|q=^6sgoUNZ}UFCY6bq@LX6px~{@J8mU{u zk?$h}6wlDZDd1xW8HG5$4aB(5vk|Yb=P-%K{{Sf9Ultx-m2^D)@nqQP>2`V%(jh#} z%?$8#Pfxg{k$R{qv_%Q7aL`~8i*J+T=v3jNk)l0~6&)x`#M4BP7&XdCZHy8Zj@Br} zRE&og@LG`QnJ33)G*Pdy7_kdm=7ebt)S-Y2X7BCPXPRO}|Fz^%gJZ5-atEEuFBS~I zYr}Q!I)LBnx|(8>^{(q!EKXvvXrRHPRI`Pt>uuC?7oA*!P12Xs0Z6w~zuUw8H)HXf z*q5E@L>fo4$c@yR{5hy4(UBY?87%39?b4Z&MK`FWG)fg+=|s_;`olyF7Co^jy=a^` zk+MZ^$`^fTnmCDOiT>mkeeo4|KdKVxv`l2s3hZd!>61V+72ky~5lgXAv!RNXK{e`B zhCR=9I>u5cmSdyxHon$cSS;UF;!0Locze0H3UA0(VvRdpYq9BXm=&w5({25fXY$rf z*-ja^@yz@4N@Z9z1EyhJ6RZ`#18PjI_Sz#agDp||q&r9w2pVD-b%a*!B8F3MSiQbt z1dS3S)ub%-b-F!RgH99Iz#g{NFSw7k^-Gp5wTYmpsBR}~C`WIIu~_+WlmKJND`)A7 zM4O1@yKP&*%58*)c?$M6IEXj!jj;Mx57-;e>v;O&S&63~o)vg_n{dk8gwug|p2ox5 zh08PWY{PRNp1bkP#KZNo@Gw5!PF%j&PFba{z&N0#&4=_Ab-8E&m*jn)@d5hx!jm1p45aJOF0rBjjp|FRi6lmC^FonY%$$GM59rYTpi-wh?qo6y^ z-%h7C((oO0nxtv&ay)fUP|8f`Tu#|+o&bs)UL9{wm@ z8}8`OBf=1pW7g69{>cuIAMQk|V*<&;jbvxCv6ece>P#)!8AU0Zn|Mrpk7=|kjHuoz zTsI0Bl2L09sNR89S-y+Ll>7HJRACE5n6*EZ5>?IGHxZ36r6p*`9buzxGq{xBVc;XbTw zr+;gW!l5;Z4%!aUL)$4%(RPao+E$UL?NQ>e0`5yYsHq#2!b+q*;_t{gC=W{RM&x2> zBrUaDPp3M&^&rg=H$iVW=`fuqZbr_a=V-C&=b)GABGnIW0(?C7p79U4Ta>cn+$!WG zw9ia&t5^-C_zbNPw;`uv1K^_(O9jYx&;qq5yI`ZFtY;)7eh1*~jx7msZT+AvT*vwU z=3(5?@9#$Wz)^MFzOjwEmiNAlYFiVP=k|AxDz`P47Cf9nU5TfTdWY-pX``;vuKUPN zp=ia8c%U-Fb9yZ*&v?T0SvBzXI=_EVNRVi?usWQ9hEOv>{Y^1zR>1I9~IUX1b1IXtw?TpCgxt^_o_Jr_h zPl;;nX|YIqMqH{rE0$}|iL15e#ZB5fVwLu;Sfjls?$i#7d$eY8zxILHsC_6lYafek z+9zU%_L+fnmh-U34@sakk_)Pm% ze4+hEe53s?e$b9csS6paYZ3}irs|G}8I@fueJhhGM%;npR%nTuZfB_nZ^B~Op@Vo z42ROcjoP6ZZpYL;$$Ar=v#Gy1Z9AQ-tmCZyP^~4S92#rR^OyS!_4QEQL>)3UnvHd4Y|A6r8V!@+8zzY!MD! zq{mVW{_9;k-9_(fcce-^g#vnKx=>H0#d;bo*SpZQ zdN*3Fcc-;_54un9Ne}8LP@{e#?bLhI<9Z)Dpr1tV=qJ-5(${)F`dLpG$$Edq zTz34Pgy+QCGlnjtJH(yHX|$RaiFL^7^f(oZyP)kH%v9UWX(vo^H(C**qc_AotP5Ki zVti|4dsXF@2Bexe}X&hE^3#Su;?xVorFxQG~FroT>G%2_~;awzpo2>W>Ire}rc2n_a0bB^h>-fs99(V{56 z1=pA}n%YUT)X`!@F{Z+LhJZYm|;t%$(KK zE*0L*9Oau=@FwC~RdqM-t4glw-+u>r5nwE5Zz0^ST!y(CSw|+2Nl;`GWXWFwo=c{lM;-NiFmf{W(hI4del`u&r_gY{h)&mwX}ms_ zCh6zUG<_P)($A&2dI?>iPp6god9+HONo(|3beCRA_v*9hA-$Y-=pNdqSI|p(CB3S9 z>0Ny;eXP%;!@7@t)T`(>Js^Z$t=KsQA`wrTcnF6RfpgX@oTBovt$NWCoSpKqJ)T7C z2$cgHZMJtrB*J>5D}5q1!Lg9^5}ji8i`r_EzrV9ZVKON3>Ffz!E&IITK^fwq{tW{h zfF~ahpC35o^FubCnOw$uv8!l+wWJNyTX7EO0cfqNuoN@$7D48G6ZuzBrj-k*Xh=0n z2Um<$2vna7A}zZpSkl$%U(-mTyatN@UyS0JWP+6;8lhhZR?P>S7Ezvl5uL4HMqd4L zs?o2YOZ0lG*O$E?lA5k&dOm5?uhP zV(FDJ!}Oo9mwtDf1`b~^+xjIJ3(9*O0k7JUEp#Cc3iB}?*sDfb5RpL@tkSQK+S1A4 zEuAd3L2cnX0RDK>Mq3QD%)OKrv@mB2{}As@3U5#AjWFI68!xbkMpnvDjQH@}rmz%jS(5c#uGc22p>XHic1EXrwyow5vZd7z#0nUu>cQ=GC)amq5q z=`1_F$WHl8%Jr9Us&9x=zAE6P-%3~O56}vIqne|oY**UKHl4q8wdYd+R`PthZlOhK zL-$c4r)F^)tb7w)RHSMn{IGCu2A{UTtZa?K-BlSn%#**YwQ)~{T4mfPZlQ}AcV|w` z!Zb%^ntr~c5}rvDT>=tlJeou!NHjs4?}#FCqOz)Nr|?y$MM7pFbikUs#@5n#8J6Q< zTZ=Snli9~o^HNMJV=SUeXKbO%x;lJA`9zzn4}d}Kg%_cLll6gk^z#QsPHpNei&wky z5wUJ;!;!sd359DZKEqtxM3-CUAT1$pE%gD45haP*_i#(CYP;gQa79`|)>_(tYCZ!F zD>1KtJHyJ_v73A)n)N#OE-Fz6PzzU4Bh^DoTPRzskv6Uy=752ZRZ~E|+fbDH_2+4* z5~gCO$4uvydJX=<Jw*$5NMu#6L8rx{`UvWa^k@HQ^OvN?!)k^U4| z_B8d@_aW%<3|y{fDO2B1B}hwA=hL63pniZZ)n9;`d690^UxFogg*ND~!lilxF4dd# zi~g1{^tVM{qyzOg#W4M!VygbWDAf;&xq7n_1-1mEpn9x>Du=2b6??FQGbmF@prqeu zh&r|M|bSJg!_00~ZNE<#u&{%UhWE90K?c!Bj%m5Fq zfX)DLm;*K-&f7snNRl0?I)-_Jp&mWGpu*g&A%z6osL%s>%r_#3mdElDJeH5)y?p|2 zVwIep zhsfDE2(NSS#6f4$1Y2VJ&@D<5HQYD!RduYs*4r+4EL7Z6@M3V&ijW8&A|!o8PboRo z=m&aONxKe-#V6>tmR$k-I0P1C!#b#5V())+>@HSE z21k1`937~mBc4u1I>3>jX2S+Q4zY3GbrPOfcNN%SOFJBX)nKFs4HQqS-4rYKiDztA zp097Pn`myjHnfSZ#n3n+sD@UQ!J}gJo6z%4N=9<&UDROlp4bqzECS@ZhsbVGuR zx6Nv{P%F*9bL4SRLj0xb6nb5~<3E^-n$d%3-cC10js-(u8pzR+oQ`Bla->k2qZ9RY zbf!}rX*Al=g|Z!8X&Ta*XfJd0Ag`mRn(H`>_;k$hS;e_DT#4|}K?gsl+w<>0Q^WJ0 zEB32vSto7;o@0L`%C9u|`+0jM3b1bM@R;dMBsb;lA{`M`2Ua6ykFt?`je;omD}O<}sQQ`WC0=j)I@1s@!!xmtO@q+R*4B~ML?Ut$w2&n!WR@G?01BMB z!YE#8iQYpcW67Y(7nsFh6Kv8}T4WX?>+q?<#k=Sx7?+#(QM`Fe6Rj%QN;fwUj`ue= z(yd$R!i3`8IHzgmYG^0(wxSY;xu&Qj#=O0##A)79RAQKGi%Jq=%sT;{<~l&bybCba zyc;miya%wIc`u;LYyfO;-UryhydN;$To0IFJ^+|#ZU8jRjetq!gMb~)hX9k!O@Jxp zX24G77QoKtR=`yAVZbzV8(lNH{glp zqkz55J%D}8#{f?<9|t_y+zZ&(d;+ka`6OVv`4nJ=`7~gEb06RU^BKT_=Cgo<%>96a z&F27zn9lRP!ak;pWSLrKLea>9tJEl{{?uq`8nVe^9#Tt{r?)371t7%StmQJg_9uK1p;?P4L#3dVG>dP-Qi^B$1dTOfJJZ^E8`8 z63^30T%2sB^Z0nqcq1;L3c0H3BK+E(y+P#w=53`R?35%44uWl^3H;_3nt-GIR+<<+ zH0}d^KV0G90s^HdU{GA>#06m7O1Tz>T!mp0V{qD&1L2+#H`E>w-ftOD304nzj{jPy z&ahCOp-^QeiOxwPHA$p3i7s1dywx^dwPhuVu1TU>lIX75vaPmk)t1A`TPPJc0T=N& zl)xG5j!WD=bQ+y3hfuv-OgC%u=mG5(+K8Kuhj7!eS^I>xYTwZ|M7bW(Pp3!q0@|z3 zpeGSdU^Da&;F020(F^Hx;5!Rn0QH2q8jF-a;TVJTM5M!z_C`7iX&>B4oP_jbl!Hk7 aA{~LWAL`SQX6Od_koMONF#zd6>ij=)Y4=9} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen$Range.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen$Range.class new file mode 100644 index 0000000000000000000000000000000000000000..d1383d6ad185f515187a3f83ecdf1d7e8b25ca01 GIT binary patch literal 840 zcmb_aU279T6g{)~YU0||)z**J8lewq9-I_>Q~DCAECdBB0kuUYn@cirI~#TT_+h-DjX3$GZc8axWW^K(nt6y_%m4DSxYmDI-xoOH?{gxpw&1Gm?v9By$?mLQY4Y_C7w9 zV=}U*ERC~VQ}L3_j;DPl&`?Q2MX}TEb_L@0_0aC}8G;29)(=mOosiYZU!^^#)Hw7b zA85b-KchXFs?RFK3Th#$&eZX!hL*sK>sVP}&GE~W&njOJr<7QMQrrEX{j2e##m}O` z&m=(P2InYpTd*&IPk{#88=Sr4iW2)~=NzTZ<{5&{))~Y%h603aBPIggv;DwrM_9!% zZZgtZwsC%oGbZpd!beUhV7Uml**h7@a_(ED^Buug4wmFq4-PzGxGcaOPq@xCV2X|Z XQi#h_1i0(v?qQ9+Tf2-co_6Ioo{zMI literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.class new file mode 100644 index 0000000000000000000000000000000000000000..1b91b6050303fbc12bcbe4a333f2b959f7bcc52a GIT binary patch literal 6251 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 VtYEe0A+F74gmlV#8gCB-{|kebBWC~r literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.class new file mode 100644 index 0000000000000000000000000000000000000000..381d55fd38acd2f9a9ef04ee500d8707cf7b8e91 GIT binary patch literal 5399 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/test/TestDriver.class b/thirdparty/epubcheck/bin/com/thaiopensource/datatype/xsd/regex/test/TestDriver.class new file mode 100644 index 0000000000000000000000000000000000000000..483cd9eb49e22d7353d6e43c7f9c8eae2d4acc3e GIT binary patch literal 7010 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AbstractPatternFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AbstractPatternFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..ea88ba28491bebf71e2c84ca95f9ba501b6d0474 GIT binary patch literal 3806 zcmbuCTT|0O6vxj(p-}E9C<+QHO1XuLh+L)g!Z=f@qYUrcu-GtZ(n+_7-%4L}#s@!u zAIkCUHb6^fv#UHb*<}9vJO7-syL0;c&(B`~umlGQh{1jW+94f>OdPUt$Pwt=c07mg z5@?@E9utVA{S!uDAn$nWuvRXz;D{Dod^4Q)ZR#G=z!A^k%NQ>?RRSA%+b>(ZL><4v zysBRdY-R<_r5D~O%PCh}D^;xWfZF^$<(vgxuIAa?@x3hq-8QYVY`Ma}5ZIs5f}}E} zY$fw&^qg8Q#W0298M8S8Nrk}Tzi|lk3m1nzPr0uDnVk?g&|A5dNBUXSdT9k+rX>jc zz$`678EL~HC5?>G!9n2HFrNm6k;+>-Xkvs#dF$bVaTz_wHE2+jYk8y>eNkFL1QKGE zq)WbIqnWgRh18{yMl9{>Xoe8z6DA5CD+KTS0Da{2KCaY}R#voDS~vuHPg0}&OJ$@1eg2ym1ma>xd|;;p_VgP9b&=8Mwfmug z5Pp4um&Dia=%Yu5PJEQzP0kTL(YT_mSrlzaFLXk@7k1$df%X6Fj|dFj>~IKJI#~Dt zmrYh|5?j6)5a_@*a2S8+3!l1hWZ|9Qy<_$VkZ(9>gKjAhFWVu3*WS7SdT<0d?t^~3 zipiU(Zo_-$?A&)~`--E+*&TBBXk8J`7NG}V5a$yZLMtYmZYAfA&fC1(q^jW{VKX9q}(i1SpQLwoYPN&N+LCc$X{ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AfterPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AfterPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..153ebf2e98d1870c2ba314c06038af5db64aa349 GIT binary patch literal 1401 zcmb7E*>2N76g@Ya6W66lY0C~_ZMMc~3Qwt!T0}*ps2~BU)VGQ2lBpa!vYkTzi3gBS zSswTRJ_>PdCn2hkVjk?dbLXBjcR8A0zkmD$(7aJ;t5B57<4u+QgO8CC%+O61uik)LlWs(pfG2A4S=b~l- zO@b!9eaGLiEa$y>L`as(hlI2k4y`l7^Vkj98`*|09lKTToQPAQTY@|GvUg${ev3fI zgw42_O{sV?!Z6ICPuPl`NLPB&cidLccjYwN5E^kWpTG&~>u~&gG8j~0w%7HbLIo8K zRn#e@lx}Se>DuDFxvMZZec`D+J#D E1NZ)KN&o-= literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/Alphabet.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/Alphabet.class new file mode 100644 index 0000000000000000000000000000000000000000..8c43924657f0cd69bbdd91a4edef0f1d8415628f GIT binary patch literal 1418 zcmcIkQBTuQ6#i~EDC;`FA)tVYfNXR^(H9@4CS=a11rjhz@P*u!8+Ng4m#z@}DgFXp zd@)fmlIYt^{87epyRGG|@xh0#r)TGU-*>)y+TVY^{{XO!rv~zPn1g{89jgX1STpG1 zk%4uTbd)EsVL*qaqoU(6L(bzJQFD2($53fFe#Z{mT>4$%_58EI5q2P4e&Lo>d6zWRFC5VgrSH*n#zAD^YpHA~j9Rx&`8hW+i768%3Ji9d>$SEo z9TCe{y_+WHaYx6N2^-rCFVZmfMK27bqm(tJ?{XEyS{W9k7t#oVpNk_g@bt(Z45jFv zFqG36M)NUDs|jtF)7I>@PK86qbC_;zJYV%6PcqfN;pw~*A!+dg+N9xV|4|q1=WMx= z7;!-EdndFuSf=oP zo1TDK%uz-)Kcl;9E?A$T{eqsoL^ku05;sBg8z6-kg!X9&(k4Y3^{fp*@>b;wv`fra z`k1kV# literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..b13c99a061728f22a430a198ab4e72606d00ad66 GIT binary patch literal 1848 zcmb7E+fvg|6kVq+O({WW@d92Du_~pt0TfWHAQn((I^_X|8GH*d(8HujO;aqN;urAZ zgO?daozd|{XZ$F~eUd;@WCS02ZrOXCwbx#!zkYxI3SbORlDLK25+)@~B@xB6815v| zjcEyYJ0am-0>vcF_r>9ZF3ez7!b1sj3=^86HX0ets%4z2%B{L?Hms(t=^0x$)RwuK z;kCMvnKO4PYE3VRV1`tAOWjr#Lp3)Q_o&Fwxx8aKRo&qlL;OBBxiiBM9m%dT#7fq4 zouQ}9O})~rt?TxRx^B=(x@>8xv8vi!?ES--Q{{9=p-h~Vc20`VNfDfsFef6A&@9tY zxk$=7_xW=8G6W;Wc6wzNaRfDLV z83}2(w7#Wlj!PwKt#1iI0%84+R9IDQR6PkvPXVTCnqGGpCXcMMO{9aat?~wUEW0Qg zB5ivcYX4EC{~Lhr=Zz)uiQ8UMG45H&6(gX(?AYAgEM`L$?OP?%8W*AmvF?Y8mo9SQqg2=m1%WH!k&F`Z3`56V!!Q_xR4kXvyuRUa zv2Dwikw%}4c`PvG|HqUvdeH0T6xxkk@Fgw?BNxK#W#o{TaTOT}i!vUgkD)i<=b3^b zdmN90zSFx4(%s^y{~MMq0_fF>hgwpb4O-{J)?BID)=Tj!+d3GWGK`&=f^R(r+4Y@Y zE{5nIsT&NZ=$8;u(VU`xG|&!0bK0M#l|nP4xnuMr;%{jY!5JFk-XYG?TK3oH&`&#t z0i35%Bu~*Cp*a$JEyhr0!p%JEeTA1PA}-(}Er{t z4zoQS(rUnmrdNyWKHx0Pf}@oC1eqa_I_VzwljH*-cG3Ym2{$l8$>d9n`e1o?f0XbS zLo^~jMnc%0ZV@f3&@5=ANB6+ql)oUl_7Sn%2XuTROdy61HzF{BSD0vJoUCvY1vf5D Q&KaY4&r=NJw2oln4~A5p=l}o! literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..9bc6f460c3133af28a62d029c6ba325ddcc2b77a GIT binary patch literal 1521 zcmb7@Ur*Ce7{;H|c9eBxAd^4J{D+|1iWCuy3C2W;7?TAqFvNIwR;xRtYvv7qBNL)PaFch%$VHiK1lf`%Q|xd@uB-wrx0$F*Co$9MhLwrDgx zd;K_gg<;^n@J0B5VZQVq=gM0Q+G_C9Wf-ms-(BxCYHsTpuX(gGS`8fTZSj_n^JGyA z>w?7HJ2lBee^2Uryz98luwUt*6Zjz)K2c^(dz{?fsBODW7)eos+P1XjuT6%*I&arw zGu2XA!nh-gXIM_HGrgBvqAkLpwIW-i@5B>^#kA7@4WRs@y+K!pf#i^j#%6Sf)`V>C zRC<5rWnCtQuxKI&)5LjS{bIVH7N7|M&&bD#rg#01I-kS(3pox zV-^~n&(i60G#ihjiB_N)or|c9XyjwUe3CE=m5)%YBd7}Yp=npePq;w zNbxshNcbTJdi2og?z5W4cV$BZ2)Ml3Uq zN?42ysIL9aswZGwUg3hx=2>q^RD8rKQLFoW3yI2X;S4cbX5GksE& Lu9O>5%WnP#!gEKZ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ApplyAfterFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ApplyAfterFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..195c1570dfa6331b2cdd4870fa4835b198bd42cc GIT binary patch literal 2217 zcmbW2YflqF6o%g^r3*_1!2%U;^-3>5xd~zcEl9zn0V9OO#4pqBN*A}g&33Bz!T+R* zmP8Z%?vFB_S+=Esvc)u=-I<;9%zI|eIrHoHw;uo|@mxh8lHKSid@*v3oeB2SSv@S8HUiJVHskXVKM&Sl*BGWaMdpA41IaS(l=}6 zg6{0_f=MF-d0XS=E_V#s_XdNaWK)7ESi_H|7VkX0Ba{Iy6K4Gx1URjih5LnAL&{bd|YZP@=+N7`4z zNeDx)6tQWGtZCZs^&-Q%zmVhU=Zcx}6>}Ekoz0dg$+%qd*K)3cgs*~zIYTFxk;1TZ zkv09&<`}PTyIGYpWJnL6jmilbRbdPu6UJrqD_9I;3Cm$Tk<9~)DtH=37Ap!?6+8=L z4Y@GZvBEHN9FQ+-mN3ft+JUB5WUMpvyKcp}482&v7FtOzvcWLzr~Rx(hIwD3LRC0i z6Q1LZoMY&S%OoH3wQorghMqlLY*loJTg54cRQw|6*o literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..6f8f0625cc5d921bb7b1365ee559c6f344a65061 GIT binary patch literal 2250 zcmb7G?Q+vb6g}%Wv8*VuEdu2ug@p3q4{DhJEno@>CbYCp`XePX^bezm9a~hEjUznkI=#EA$o8O&o5?uVuJ@jM?z!i#{m;K2{sz#%wvHlhj=cbW`y4_x1k9x}|7E4vKYR{s@eD70OlZx4HWJow4p^JvFx_Z{2Y zwF6hI>h#1yW0#3j}VLJ?l#NP1VDIVtd@+epRBmxTLydo?syP6t&(DSTe zb7#1b^sx47$v3;#3Zs2A<+uhUIP)4endk{{DV_|5m*pbgZ>TqhV1^ewf2| z2A<)2hEsC=au~QT?IUL!Si!1+AJAr4NtuTUSs1`DD^UcEEt)t5nZPmJO97eC;@I*S zila&Yaql&E$b*e(aEY|LVje|dAFsfPu+dufX4l@Z>c3t6WZS%r4a z(9>Por}jawz6YzaKau&JRvCOI_UIj$Ll!xlr6)t3#5tU&6~hHA$0*O~r0#!YpZKkY*$53kmE( z3`-!m8dJZPXj~(3p)nijF()_9j>*arS+AoUGh2^q)?!&l@v1c!NYCZ5I<OH6#8a3iPwPJt@C2hR559(um|K^f%R|_}l_7i;Z)o_M!k}X` z&6Bp#ZYz|QYi_gbHw?>dnNHj7cr~-^nYOXvtd*^1%Pybo3C}60mcnGB#&d@6o1R1Y zlsm)pihdD*QQzU%SV?7Zbz{?iI}ArW)Si$u|$`Bi9_!K^^ql{S%-_`Lwd|%A#QQgK|r;+ZXzJ%ER8+I7r|>s6YrM}Z#Ln&);} zTaOVodu*({#oT$eX{`5Q^eK(mRy)pBdKXE>TD!k)_(sJH8b*wOhM(y8Dc({jC$YIA zgVKyruW)a@*9o_%tJF=BY3ukIel9frLSavgn2sa(jE-O8S3Gq|h8KEy35!L?ukp5y zlQ^Z}H#&ZccQpJ?$5mWYIGh9)Vleytb-J?fO4Pm-c5gqJ3b}^SZgeMVsxZk$J4{1W zj@D^a>@-`H2^ zYhWupI?h_qPbZV2j+`Y`R{I1YH_9p6R(e}mv_QdT!?qPOZO^FB2DZnp>S`MvHEL9yTAGulYNUKi7fY3W=ItO zAx!WBQW%w~!qun@mf+6W!h4?AVHCi(f3Ds@7HQreE~Zku50*Berg;4o12>Q=maZdR zoVt!oar!#4A5d%nMSkx`hTl5&U{a=STB5Fmy{Cya`>gIUf&p?~&bLwJTZ;N2}e@Y9v~X%1VMvZ(`3i1TlYvy;m_7 z!0eM>KE&Ql?7xArF7&vla6gk%Y7+lgf!UblnPP!b-@ZaSu-XvXbk*aq%zy6G)M0t`pPZMblA7dW>##8tY zjt68PA$cFO7LMYHARV_O+Hd2t)Kj#0o7U#&gRJJMn<5q{EhzzUKF5_5<7LW74NR9l z!o)RXQty>M#KakieJWt)zN;9Oi20QHBee9pNT=STLVrD+fX1OYh*Q{w(|z?Y9XU3Q z1qROs!HPM-G8M--W_cGU7I>GPK`}J3iGy2ppAUXmLJpq~fcJL=Bj7}15V?JzF|FnU)Yf_WY<#3-k?E1!>5Ucrko%GvG8 Ouf`}VyhKL_u=+m(gVgK* literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BinaryPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BinaryPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..cb9a1c423099d8a695ffd43cc848930cd5216a61 GIT binary patch literal 1829 zcmb7EU2hXd6g?B~dK2Rs$24Ef2PrLJJ0Dvp{Y;<@2}qWbQUMATZ{zhS-gLcdt;dy- z`gclScxa`PR(+`Y+#gl-%-C!KLYO}6%-y^9o^$SZ0KY)%nz61= zVG19c<%W6v#4Mi{@EJb$@P&sj1tz-J1Zw+1((!d$hDle&y`-N8%1>1!2l0^~cDj-O zt<+kj@s>%rE|A|2<51rccvOAdc#WA#nH(^Tn0*^KC^>?eVY z4rLme_mR`l?XV}{kEOUB#xi|!TFzwLkD?*4c+BeBfq-ZTl!CSjzQ3=6e%cF@n0l%W zBg<{6u5Jqy?hFE2{M7TnwoH%WdpZpR>lQe!j_=K0zZ->t)M`gFv)R{bPiYnCB;6WY z%TCm7%cjy>Mwk~Qu~q{ukZZ}7!1mbmH&C-qX}|^QV_`BC9<~L}^<+nl+AFYL9h?5* zC~EA!o9MPmc>qlU9VvaUt5O-aIH7CR|1+a!ayhJp2X>(EhIV>h8i37X`GYLtCT@B7 zs)(<#Q$z{3i#Ug35$~8~0q+&Df{Pw@i`c^*fsJvO`^ zJcw$eVLs=1z3teSPvh=2k2#+LlLj%8Jzl#DJe|`3>)diy`PV7%r!;}GX(z3+=_vO+ zpAybP&;$Gk2QK%O`r^h3#Dc@+4@@lmj$D1?Ih^`}^BnH4jF`YQ*9zl7GiIFa{UW=##I7$>)rwWNIz-KsZKBHV@?Xuk8ugp5*0DBH;d3|V j;u_9hGVr{0Ub28DnE@H#`fHQjSCg;2CYcx3Qf&SQ38I~u literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BlankDataDerivType.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BlankDataDerivType.class new file mode 100644 index 0000000000000000000000000000000000000000..8e10020e27d23c56311d94ecca31bb5d5df19d17 GIT binary patch literal 1775 zcmb7ESx*yD6#j0vp~J9~Ljug^KB#`lM7kqC~ zLslm{uVG1tiDeBd49SvX$#*Y!)n&*QZMSNw153CyF6(Z?v$^SU$2yV~Q&ek?xnn8C zJ?S4WFc{L6>lg6EQz3d#9PS<0I4Mb%{{|R-r9yM;TaF-v>$U1xZwRN%y+SCkb-qx1 zYaLo9m0mG-l_zASP;|XYyH~y%Mas+;k#OaPD-}Odg>0i27NbpPqu`=+7sQ|x#aiIz#xV+tQuHD&Okp517jFBFaU#LHSD$P&dRVB2HK^y zba;nc4G#@G!ee^X!_XZ#8eh-nw;Iw`wD1g?s0YFs#!}szlzvSs9hP-l+ODjNy5dq@ zQq*7JYFpNoC2eZ_vmVy#%47x1(RWd&&u4^wG@QVr(U6VNpJoS!Ve(9}jBGq}2KJGh z2(HmJ5d@PMA>U{oz;%q$9sDs<#0P(%b8)iy>^UMQn96)Y^aqABnT5sdWb6#F&xrc5 zQ@X@2J&60UQvx>$XP}X9&~<>+4dNCloFn>qqRkPpFC^C_YYWL^0yhG2c}(IaWg;nr zoI*74rZE##J4>0Gf>-H`Uv1x4Bwn3CyWnpYJo!(-eQloGxYNS#ko8$c7rrC$9y*!6 o6YAaRIg%H-1_Sz6l$``?dKeaFBVgLXD literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..49916942d7b1c4a25206719bcb4cdf7431def034 GIT binary patch literal 1253 zcmbVLZEF)j5Pmkf5HdBuPwsoyzP>w*a#f%ws`76NqT+P zemIn_lK!+Tz3qsQs1-r73SS z-2K1CF%*8udDuP@4vpg0KP#KGoFQ4!ZP}ZbxastS$0t!wXoeUvt{y@8Mi0tn+{g`; zbnR$PHHfCG6qDso5H;Tug8}bS3(7IWSB;yS-5)VKz*fE)ZL;#I!P;sJb9ML zIzWORAX_^Dt8ITo;vMZ0D9}3}VHaUgT!v!KkZ)y-CbqM*qqvBb5!*Q|)0yUcK@kRh z3ty0Y`5s0w^$F<{nBT}ZW=<0x#Gx5$W9*EvKsnAw=LK9KOIKIGMO>n4R>?N#EJ^D! iuFzZOv+1k(Qne3Ayd~rJBr8!8YYdnqVYnKh)_wvJB1OOe literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.class new file mode 100644 index 0000000000000000000000000000000000000000..c41f93a2abccc99da3b819d43d30a9e90552821c GIT binary patch literal 1434 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 Lx@UN%@z4JN8lo$u literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CombineValidator.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CombineValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..be342e271669c9c35528adc9ba3d3a6aa9abc299 GIT binary patch literal 1567 zcma)6TTc@~7(KJS(RL|NE=5GF3ep=a1w|2JOdv#)qA_9<9=GjU7TYe_E`)#Nt0p!? zNqpqN#J^-bvt1~Q4Vor1-^}-&?{dy;fBydd1HckCVi-a$iUjgGKj4t2wpH*hydP*6x<) zVO)5_Y?;n;fw!6eZ0JA3vSoqbrd2ZphDv73czx8Y81}ASY49dlvZ{KctlOqMdzV3H z-)svk_bXr<4gI85*UaW&gTpo}%y^ZfkZrULM<9@qbw}!k<7Y%*CX@BC;P;b>L4tbJ z2uxiA^n46XRBeMgc|5XfrAAGa8kLH@bG6(y<)Gu&dtE%xk98H3NUIn@QpKoT=H&6N zT*ff2Vgf0Fg+A}&LhfzL{^%b-#Xa1Yd7r6xfLVd;Kj6J_B#I*~^#R;SyTGsL)dK68o7A|;Ck0;dqkFTg`;b@evt<&L;0MgE5kyjw&#yWu`RA@k z;@zFxa}P0Y61TWc@ubrq;69o=g~;VQP;!M10z3u3xS-oyCkO%y1X&=;^a&=G>8E*{ z?!s{gGdwYoTVA-9Y(QZl%I}ri;Vylt+*c^y5E7sf=o-F~NfwiZqwG1!eka(mET?wi zUO6G3hL>9NQiqr^{F$K&Wba`YFnt9ax&-qz^#Mn&gVTM$ihS4}_!sGs9M*GZ7})Dh z7QL8^#wlVQguC}~fl_y5T08l3qzdOG{|xG0zHo}c4kDkB=6zg>L3@n;xYUI9Ku&P) z>9UA8%g%D1hnVNDhz!<{#Vh2ngFN1&fITcwWDOtqH{a8%?r|`W7sRGGND-^dkaG3P Ixa?*B0BA;9T>t<8 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.class new file mode 100644 index 0000000000000000000000000000000000000000..cb4f129c0edf59b2afd04d1f81e5b17394a4201b GIT binary patch literal 1563 zcmbtUZBNrs6n<_u=xFP}%H}%?;@nzU2lE9P0?JE5oRT<0)Nfr^SxL9ft`qiC^oxH1 z6M>+Kel+n%8Bez|5X?mV(ED=kJ9Mr+~#qI$6W^gm2P;B+hiEaJMNn1nzp`KUDHas zr+dwssVxMHyj65{x4G25o@0!l-y42ctgkazF2RkgeshD`EAF8gs)s|?|Jr(`np z=dG&wq){oF?lZk;lSR%uhHkIwuI29oW7sQOb%vR|;Z!uQtXodatk#`|YnYvEtxC<- z=ABAS_pG92TVC@>X2dvVxTfxz`v(sjmR&MkhN)zJU4Nr%woYX$c&=4l%cZ*K6!;Qo z*srlq{1^m-u()ZMHP3RYL_hj#bcXEThoyKzp_TZO<(F%?TgGXhk%TxVB@7}aLB<&d zZh3*nJqc4Fu%6|Gr;AI}%hp_AP|BWHo6@w6jg9n1Htp+aB9j@{oO7_;+y@CD(N%Vx8c4W|As(|5Mli=P{XgAg7&xf+N^#vZJciM(JOcSMgp$4l5BaxS zPE{~pH*}j?6+7ISHhM1gl0iL5fI#QR_~bz`3C{#aFrgD0Wf-3 zI8p{_gI*=h7YfZG`r0G#23dn>sE6{->aW8@j8S)gwO*8N5>qOK4UlGT_%Nc73>Zi6*TyXg)@|Anvq z0bhKpE^=Lc>iRI&LZRq=wr9iMkXxQ}O&I)3+Pe3wOz^Thfv*o3=R<2}ObS zRjc9DAK1&Dz-XoBEt~S0<#=bj=Uo< zoQ;W^TNFr5dv#l&v*Nh+!1~tbjUd?JOTE3(9kuoKpIW2)}u>@6S!Dsu< z>H>3BDXP3@ltSQVHWp%06~vOBA0>N##c9-SzZmNnoiA3NTdS7YuvqbV={xRH@!$1` z0y&;L?YYu^A&a@g#)ulARYPt9ld+!rr6nMm0*8*wdL~=aSAE)(CWmgdCa_QY_omA! zsCmto0#~!~@ppGsNc6NMcx@lK%WmT(X68;yC<;znMF06 zS5yfN97oZ>QFLl38JNNy16}Aga2ovvj-i|NiMyA3kQL|&4R;OPLs?)v4uH*Bv3IaH za39kKMsSG_L!A2#PfkcyUGc#K-yQ+YX$3POFqPdqOozTRPdNQ?{N~)6=eC@dv|YK2 zYi7xob8bsoZjC*fI>aRI3#Oh#qNxDtnH4xkv;&J!#92P!9enPS>@-J!QbKhEH3+qU{<1T?7{*Mv`$k4+;J5hVN>j_We6#BTMUl2u5;&?@v zZ;?hDHRb$!Bu4vEACXMrH3qm%eMeV5U${)|Cfe4KQo1$%(z^_4rCTFNNM(p=fr)f7 zg&wAMo+)H0nIu&r8Aa`S7<7wT83Pz3B@)39&IH8EEYP_ituls*qKa_=7bD^mw5apO zXK0T}AhC%f+Z@t?Z7_&sgy*(majYYZSB#?yS}J^l_8Pr~uh593(B7aezxDy`Yc%Ph zN#8&wG8IBoegnpK%n=qIWUP_xN%HL_+kRf6Va6L{1;&xX1PTGCur;b0VQWgX=g3MR JPmBZ#zX9lDEL8vi literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..3f3f3ada014ee44d99798f3ff864461a28cc2ce6 GIT binary patch literal 6451 zcmcIoi+>bX75?r%vdJ<5ToOVc;Z=prW|Q!!spXM21W427K?@>>-SR($mZtyJ-mYEh|{rBtoeYSsGwht%)P%3o?32Mqdo$OZc)}tQSvBo(NWtCHEwKsI92V`}L?2J_Nn|*i&{IeCd{XAl!+<%JEGX>sG`XLI>^Jhs z>4U{g!XzDZHk2&vqx+{6niui5(#JV`#O&>(SR`4pK&`@9WWl1tLo?FnLz4p!&{`P#5}{YYj? zsgj!Dv<=c-nw501vQLC-%03ZX(g*L*yHzMG7ZT;sfinpsM|TFjnXHO038l8`we6M_ zu_jF;tx$75kX|bf`XA=zSyLWZl4W~~RV-Ji>)W)zOxj4rRn zq->R$ec0+-4kqQiUM=g94rhC{=4yrQ88+cb2cTSF(}A$(iIcW_z5ck#UtzOUg2 zm<{1o4L`(>Gz{Xd5MI-81+yA{jGt)usf@15<#qf_!_VZ{|u`(R&Asf>ADdRvoXR_{=%Xln}Tixaz z9She;#69yzD5#{&3SE++(4U#Hzrw8V5-WJto?k`fe55VT>LSr5lA5-kIgJ&wjjWV= zJkJbp_cwM1I6DLT9LWb~#*@CwE1BkWD6AwYm2#K#Xzj)BdCWS*^P9{IQCU*KlLvQi zMm+q|I8?;R90;cqM_pSpSq8~GoL82^LfM??->jv{jUT6Z4B zyszMIJ9dB{(;TJXLxA_D*mbB_=Qa3Z@oVtMx~?JcI-mP+E3c~&>F?&6FaT{mUBu75A%SbHytdU^xqh3x_$MP$D%FY;etf%I_vfRweozu)VyCBfie76)Sao25h#pt+wA*Nbu3# zoqW$vIPBwYVi9{k>-soL@dPP( zz_Ka@NqrToQCdApYYo_dPcY$p9N*71w*51X{cf6DHxi567B8a7h7l1W-bC94)Kj2+ zVRG9j9wON~HesA75-t?o6%^e>ae_93Oz;OB6raR{4vJy=BB5AAa{=*uJ#ol=gN0{f z)oVK`Ctdumsn}RU8=s;^g@=g7_U}b%mSWjKWt&EL**t355J$U8xMf#B9KDFT)_~<) zYarG&-{x9tyGc<`nuV3&CYWUb=NRipEF8Dm7AiP)5XU&}2f1(CzDn6A=(V3~TdgPr z_I7qh$?6?DNO9?JcmRk`o(%v-jowhL91sktmiWAer z7N)HgOq(4{3X|M`Y`zvmVyi@grU@!azUD{b><307NsS68amvxWhj)o_y=W`JwL#i3 zecYv~zJj}+xQ|&Y`9bMux`+OXrWOa6XtcH!ZeQGv=RjVB;+5R*r2so2dCK zcxfe&_yG7P#Mp65QB~Q&l0D<`&YUx|XZ`c{w;uqWz%IkYJrm1i$9ZFXmczs(90@vOWT5QQsjdv!2Y%+}F2NS|mt2T40$yi-xNBCsT zm^?dJsdr4A@GBjzBV5H9e)wK!Ekp11NVz>3HdA>f>znO;F&4Hfcy8M|R9?T?_QU?k zEF(6WCuk=?%J(*XPs;<{Oz$nhcq0cs?||8zawEJ*Wp`d%1PTb5kr_2V)M2EhGi?%b zV~1d6ZI@8qj&;^ju{!?|*hW;of(t0I#4<~>HS!$I6O9rr6SWG~P&ct&K?56vM&?41 z#t935dwkd3myRZkt+S11ZTP=8DLU1wY1|WS@WB^B;7(d63MTBP%Rb3I9$C-8hbVmE`03iExc0N@ kdc?J(OkBma7_W-!xWO4wYza4!kG)&C%?%Ll#MSQp0dRHWJpcdz literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..7450717d28e6b5d5baaebfd353d6328588206c38 GIT binary patch literal 5200 zcmbuD`%~0b6vw}JT{aLRSVgqb`ob326<49w7gzyBX?fUUQS8gG8zCB!HJe4PZEfxQ z{je|nE9^`Qoifwu&;6r1JvX_V-K@GdwZo9z+?@OQo_o%@kL=(7{P8D%y|}Al2hKKO zJI<+?#d#I4;8g{$DR^B)3TIWkfeR`<*7=h;1vwSXytx5+6$XE1;37AeSFr$7#U)%; zV5wMytzrWl6$M;T;POvu*~D9lxWX?UzxZv$nng*)60Rz^rrz-%0_HfYk2t#VXv`z0Q!$9{V zQ+j3?k|R#uU}zmTZDX>uIA^$L^f`-K){i?m-I~!|li!QRq_U63a-!eD6Oxfrvllq^GEqEMWa=c8g?*Oz{2VcZX*b-SI4=1!D)(oq zY+cu#KB+tRaTpr8H{)iJ>U>D<2sf!yi>*~t`P>m4f$(v4G%NYgALX7gPnAdehUY_@Z7#j3K!J=jByu2DJ>axw83x#_k zt?}x#zvGXZe7oHed0O5v_wcPj!!Eq3VJA8j+|ckA-d6CAhH2bn=>1Qk4E-|uY15v! zjEFM|-qr9PZgI&o8s5hT41F@rFzsiTBNz=I;v)qgYxsn-4&so4Pc?joTM9nc@CCk% zf%WS)f>rR9hOhArkJ7gazSD4rN5kD#TSwjYQ81}~k)gE=| zj3nzfG*|RoJy%{z$|}t%Y@Ro~NQf%v{_fZZnsO&9)Gpaj#2jEa z5qrLb_y-<;cFPp24=N1JG~%g(;p%pt4lJ4YgXFW&EKZgzD>(F0=+D#fkJRVrJj`%G zKAuRVAK|PioxzbKO=PTn40~mPs@?5qz?ERpD~PQBn4NR%BJFsF9WAQBlQFyK={7%H z4aSK2Lt&H$Y09g&tU#QH-lO*mh8-mCxbxx5Q(ipDmQ6@tXSc+J&$^5(9vm2!d#i3) z&eh_OeSO+;$`9NNJ*klsCQ>`Ys+!7>f?WIe7&N`xv!XMW%pA$694hBa4w= z9-PV!NAJ$t=_MSXmr1^R(YF@*--V~BYZa+6^s5p31gQ`Gf^>t%lO&bS%rY7$()_xD zrpevQQ17Cl_g?QRnn^)h#@dQVJN+5~`mLb>Z4{7=^w&rj(*Z6N?Ih7>NUQ-{ zv7h7s-tRnZJ|;dDIF#n!x0P!>R}P6 zR64VQb(IkWoNZN{RLDsYXVB*y#dEPZoe$+4^EpEpj>YMEC}+gy9LEX485HC4qx2X> zsdi|YDpXTAv?dzbsE;~{Qv!96K6$k#f5-Y-O16rU3@J&XjQN!3@q(Zn6Y0}dv0;`n z*S3Oc*)3LdY(gDH7{Cgef1Qax2B zQAa4!K_XMW$Z5PNL~=r;i-=q9K;s41!9yujo*JGq*MRh|NRZgpWo)ZZgOVJnqD5mAtN|}mrV^O>7xk0Jm;e9( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataExceptPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataExceptPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..7a2e4844f2c1f6f7326439a5f40785bfb53ab019 GIT binary patch literal 2505 zcmb7G$#xr65WP=R%dL)ND|irwjDl#e-3ew&>?D|Yz(gd0fEKKHYCWtrEwzsHlw;V#2T)fw6mVWP29@iHa_FC4L;Z~@VN;KcMNO_WYmG9`dXmcaQv>VJJR+0syFmU z14r2d<;jEIp6zz~p8Y^-tp>d{fu!d<0<#T&uxB51J$on*?1t}1?GNZQv+nj>eM{hn zN^s*Cq%F17hka#ljwfpqQ@)m|+7w9L@!LwE&~SU|-l*GBgKuTaqn#q_@tShr@_M|P z(j9jwuo}zD3b%s5oH(6mQ)DmS)JIv z=?-0vKS#xQ6fOj=PD+1lP8wvt?;Q$kO-#K#>N(o=du!FkzI-HYPg2UO->1Hy1pkl5MkwVzVmhSmdldp`hc!7RWnts7?#o ziElI~*CX!NwVFa#9=6m&rN>i zg`-)UZlq|OuGODG)RvwiQCohBp;J3##}tKn?Fa^=KSwr+6Q9iBc%D32I0agWKnu8tO9AL*l*gd! zWW%7@dhI!;68Megq0CHhbMX{XHbTncJ-i>BQ&H1>j``0NxipRC+TzmkGng!J+7RLh zxnD7JBUMV#PVxw6N~yn|kgY-P&rZ`@ zsE%K$9O)^ej-^0P8OvA+JSxMc|F)92MwTf$vuOMPt2AS^HjNzKG|PP1>3TqCg%`#o Kg6KIkAN>n3GM#Mz literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DataPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..2613dd3534bae53f149d7fa6f3b518886bbad51d GIT binary patch literal 2323 zcmb7GTXWk)6#mwi$g$PhiAkU|#iY<8+fCdH_oM}r3pJRgG{szAI%|1}6%@%x>o)l* z{Q(RQ^Z{m|ZD0n&I^$r}vkjfAt+4nt_%N+>EcZZ%SVouiHzz+D_=28mJAxZ_G?}=#1aLGtiAE{Qq zV#vC(FFc0o#9HJ7Zkl31?z%Ryt&Zhe()Cu9Q?&cxg5mO{Mn~$zmk$Q^0mH_`rZ35ZMzTrrgN|@ zJhT`KY9hpcm{(C!1{i9IFfkK`{KmdYD+(2PAio{t{ida=rKCI^ zW$m&GqJ~W!AL6Et7CzE3i;s1bFr%Z5PZ;X|qkeSU!j^{HIzB~N!yO&lxXW{3Iz8OyUqtEF}_MoSfFj&gg==01g?Oo@F283c5=qrevkIa{OWJ7m+3 zYCj`We}*X<9z%OX`{P!MWTQluX2z^6#8wt?77K(9oWo0zm9@x9p{|e*kxSu-dOjd9 zN95rxnBr7$^2``gE=J1X6}%ekU%eXSneUNFA2~2&w>Sn{iD9d# z(XCX(T?%G~#>&|r=&c;7vLpPJe}n$z?5QU>{l}3D!{}cmWrKWP3*c)ZL=0a+9hU-_ c3YM@OIK6@f{pm^L3SnnxPu=t?%~QDc57vuG@c;k- literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DatatypeValue.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DatatypeValue.class new file mode 100644 index 0000000000000000000000000000000000000000..26ea2bf931f8d6698166a715492487a0ab724d9b GIT binary patch literal 971 zcmb7CO>YuG7=C6KmI4b@YOA(Z>Sy^Vt_N=#W1=ydpdK_N_BOzzELm7wmPSt|{tWNl zdNHvYJs7?Eqm0iCTQrtvJnTC&@4WMTyzhSh@%amYYiQ)KgtJ*V*wo>iK34MB!ubp? z==EX-mju%LGMFlXa%&*>r5DK2p7*#jP~G^3fYplyDy=Zu^CA_<7rg7qSjI2M%DbCv zSmxaHM}B-u;Cl5q%0FJ$+5)LNVUH3@Eq|mQO@|#7J(Zonhzh$hXv@gg=Omem`~F10 zYjwk+7x$$fj@4)qPNS}xtMrHCV6L#O9a82}UrzcnD!W>HK;7#3R0hOaU7)+RD`1D6 z0b3NteH97ho*0sQzL9q1-=JUB&2v$}WfxiGT;$=pIEmE^uDIAnRiOD_a$VF=7g+vt zDAZKdE!+I-OauyMtoP@J7dm7MvJ*K}#)821f-W4NXKk1Nj>De`uu#@+xhreKTy1^@ z6v1I~_ly-fQ>uT2s5cH_)prhIzhlb6GGiGj#w=rwG0%rCPB61Id&c_}o(N!QgxP5# ziv(dX-XlVr)*_(ihL-hi?*6qu#NBB9R^d;_O{v(}tjYciiBbrBWT Ltr%Ov<(n-dW+bNb>tuxMX1`Rhk{`*%I>IHOhg- zy9^`3%2g*L2kWbvWAjQfiG#hwALCDTF#iWm7X%Q-Uompp1lu&+5I&w56Rh5U?~h6* dEZ=9~Qwbe?_*q?TsOzEs^104J_k@9};UAQ2QVswB literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector$Alternative.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector$Alternative.class new file mode 100644 index 0000000000000000000000000000000000000000..4c6c8005f2a4fb3c28b4cd4ce64f00c6d9ae8548 GIT binary patch literal 1778 zcmb_cT~8BH5IuKWy0lclf}a>cMJ;P(w>%0VArN9?BM%rJe7jw4?2={M?B0_47ku=0 z_@Ie|#0P(XKgxLSZV?_ZQM)fQcV_RLnK^T3fBgLR9e{^s1tmNwQ#>`IZp2CjHXIub z8_xwQiI%Z$MTcrAAX);GDmomQrM`?+qy?t7LapLR>fl5PR9jJ`;_Xl-iAn@sw*B6* ztGhDj^;MMg2C=W)ScP&Jy>o-(e(3HD`eEQpt+up|gU&#!9i^48d-3um;B|r0Mi2#h zQ=naM<%PO(AW+=y9kTG5b`Yu8gX4~h-^fl#Pp#eaWq2Utz}O>aQFjCORgu20l4RNQ zJb{n(-0H~-NWdDhvhx1>NOzSE{EL#CrsP-omCR>x&c>SO*;o~Tz=!;XG!7@tbu(gX z*fe5IU~@dMi&mQ+(b~DO*jh0(?x*{)8<^L(_~*q~J(4G~iW$sSF^O^&6(goFZG5f` z&UZJTwG)^%x!h24UH3Xi+)IItF|av@Lfwqy#s7m~i9afvzpw&orhlF+LjiTous~g+ zhxG6rUZ>TeRiK`C&M@IDoWe4q;51HA{6fFQIN&BGD5p_mWSOzkjGg0`IeM3}c+98h zL`w7Wq4Q)iTC{Hv!AkSF%xk_)IA2lx%tMx-lsd~PU^TmdTPfge-T@)*;O-R=g-`zg zv2Z1X_4g29`}apx?6K`4liSWh;|$`0tIMr8*_Gei*lentwr688<%R%c@BzWj8-0jJ vqZI4(T3L#>oXOR78e$Dd#+ErPrYSNw3(F}%k8zE<#=9jvgV~CE)a3OS=kl}} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.class new file mode 100644 index 0000000000000000000000000000000000000000..4234967d5ca07758d2cf5adb0cf02f9f177b0f2a GIT binary patch literal 2333 zcmb_eOLH4V5dKEH@>=r7b_9wILppZliRsv^HRANaDUr%BZZz%0e1DBGxj4R6WmJ-X#Tr#kt2CGVx4ZLmO9Rq6u z5HKsgFN1Z@ZntGyU}DV+W#HSPdnh^b?S_nesp<{;(6&0E>sh+O>TTz{?V zG#gfUV7twh^xMr&;7BWwp8b{orR6qSp0&|wd9GuJaxDx4cfS+L4H>?a&Uw^@FDCsFDovEs&6Yec(x6 z@3Ot+DpD>!nC3-QMHA2AyukGR6*Vz~SrgCTSrhMK-NXhqO>E(+KyFlJqudQ#Gf}~N zCbre;D&99y!;Zk#D2N9~J=`2B_zz5ch>rx8A02X#zGt&HclK|v3E44^jyG3im$u!n zNk3bbWl!3UBirq{Vxb_gJ-T^Lmwib=C!{AE(ht`daynbd^*+s^OxV5Fs8n_iW#HMZ z!S^R%G(9HK+BS%WiTkH!FQu~JuOEgV>%^}im+ba?6Ix5{x8$& zbow@1c~Uz*4oS}8nZhe2Lv0%x zH6Wcog2>-RZ0`u#ZRmM%8}T3Mh~WZd3OZ$+atu>2@H7&*NQ>E9%Bee}aAoW2=0}YYV^O^1?BUOL|&A{{t?}D{q?q@n4ZRM)G^awOill;^w_SIc;K< z!mQoA_lH)_aC)XYJ#*h|jkEt!IP-UKM!&@gav#ggD=?D&KQS#}0*ga9W*;Yp1x690FU@y~+Ee5kWMY!< Hb4dOJ5shk{ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ElementPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ElementPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..15a53cf50461034d08810c1a98fd9b16390df159 GIT binary patch literal 4082 zcmb7H*>V#{6g@4;k}M6jvB8)v5E6nc*@z_}2@r^}4LC7oF_sq%xFOxfpPYI zU!GD09}uciJcKGRAykFrB@g+iRL&iZ2iZ{=`(b)o-F?qJcj+_s-~asfJAiHYA%-(J z8$%Dy#jqZ4v~u>Q4CiHdONI+FT$DkNA%koLxhRYn;2E!8SnBV92peY!ZA zHVb7deN4A)qf*?Xu&h)uC&%=HF=*-4szS=w);mn=*5YH!s4-pEi#a1l66X}UvUwwW z*~pzRs&>W9+GeRp_@GtFDy$qWRVLHZ1uI?Er_-aQtZtVogbVLAi>AF#!AdNFhVRk2 zXq$TNolpo3mU4zd`>0to#%hI(Q8}q+EUt74H)}$#nDX0Q4B2^;p=|T@J8T&RqiD~$ zS6J@kWPV1b5+lAqL$$JHGD*gO&0J<`wlQSbMplyMYdc_-^Loax_eh|MG41y?X&^XZ zmMmRrH$0s+$}(Y@BH2>WHl}Ujjj*ISoh9Gvi~58h6k2qlsgU%A@#0a4d8Am5aJ~H$ zbpPHNXB`TWQU7|00aNvl=$bunA9V*eJtO*r4G#Y>D7~4Ikh`g;)GOBTp0xg>^aI)-M>2 za$FG2(9L4?f>BpRVe%0_1(sR0|FfyEhF_?<)HT`M?MLkYwMN{2tRanU8a~0N8g^rk zhR^Uh3*?77RhQ<;g`)V;77M zobe=3p=05dQHbXCYQFw)3nqFg*6nnZ;aBdkw;oQ6jEu-uIB|{>wtT{m%$x+XNA+CJ zjgtBBzvf={9C2BhXt?F$EO&9zStnJ}XfNp3GsbwsCFn^sy#sPsGpl1Id%&_v*W?cn zB2X*C#+90G@!K%Zkt-*1z_)_)C5>(zIrJhvy_AR-D_l+r(tb5qpmO}GWc8}yF&pw{ zHorTYDK2%Phks%MVFW}TIO`Ox;5#6~;k+p&&YNoD>{CJbj`K;N7yP1g_9GEOeD6pG zLmjJ9vrv6}ensFug2~`Lgk)$*rtTpuLnPUE57A`*J+$7TRRAfDn-JyLjxNX_*m3e& z!L^n2){Q=_!gj9q@kFxj3H{j0U-aoPRnAOe2skrg8RU#Qz!h>-9kgrV%1r-Xi1#P& zA~K5@UoAHfy0i9Y?f@_IkuwoKX+E3ztbK_1*-q^~mOXN2ZQiV1X33C5b{EmmLv)owv}vyB_oE5cgVV(X~4C=nk_rjw~)Qx_Zn9_@4l=^TCEZ$HCNNr{kkT_JVjbQUXbpe^|j-3)n^l=T;y z)Pq{XW)MmdI@IX0hwe7fVLzP++3q^LM=_1Pc*UW(5Boh50jGTZsXx(k6D`5psXx$j zgs#JVd}guw20DcZe?@;nByqN(HqtP9|ANy5&_BMnGV4=IXK z9C7x?aMVTG=OQ_`HM)@1adz8@2CT4$6?RlaSRKQ07c0%TtT>lsA*E9ej8;G3!JJ^j h*M+6gIK0sKY*XWtIMu|sb)oV3CdLXABpSf!e*xgu5rzN& literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/EmptyPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/EmptyPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..b3b631bd12087b553ed4ed52bdea271ec765266b GIT binary patch literal 1772 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ErrorNameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ErrorNameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..fbc4710a1fb60ec0bd014de118d2375f841654df GIT binary patch literal 1028 zcmb7CO-~y!5Ph>rF(hdd2&I&M@gXDv6^oGQC8!(_NR=WuQ035@;~Fs9k7##;=zr>^ zr>Z^l2lPiF#?F!k6g6;IdptYudEOiUz5e|Nz!p|YDB@Kaukl9Ut-w2hMZ(0ciA?s9 zP*`iU3B~>Rt0q)iCelZ}u%naDvJ-G-rWGq0v}I!KIZqa|bCVLbS}G3x>|C0-tD`jT zB})5=4&+sI=9{n^_yz>kv{n{;V?>Rf!hRYSBE-% zMyR(tLqg+a^j;Cx20B!)rjwB}@8l@posB`{%U~#t&hm1zk&bmj=ned6;-zD$qgaJW zG&R2Rj0)tZ@S~?Eap3J46PY(MO_d4z1SgRbRi=c8?WOn`v~x&kM(J1?LZ>o{Zz+9W z#VO%&WnElYxWi`rkCg& z*$mvo8qVhD>)0r1o|iPDdxARQv=WDPxVe&oOw5%CoWuE?>;g9`?zPJeGfj4P`vi>| YzMhh`y1-=5nQUCbWo95;$?LEF1<~Fu$N&HU literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..d1077d333cc5145a7f564d483a2c22fc1bf02d57 GIT binary patch literal 697 zcmah{O-}+b5Pb!duSLagy{I=u;~KpQ@q!Xa(2K--*_}vrw0y0=FAdR&w*0b0Un6D|V;tPT1e%mvl8~3C#ebSK` zSdUywfgI|4SB3q+ZTX$&K3&UxwQcOZI}8Iil0)~(T4S41`vKYN!JR;+ZhR70Y%5JS zgRo1sBf9~6mfOaY!JV`!u_w+<+*6T2ZD#rg$w+Zr%fB@P?Q4pndXKzE&MJ^sKjH)q zXHxxEB9Nk5#KdG_68n{6XmDIH}UE1-3e3B04Fz;X!Wr6cq zU7pS*a5^jae{WcRL~-5l04XNy@$fVJ8GsZ-B8&GdTP^md`OH=hkKQ0&Mt~ge1qK2+ z2IhGIyJHypi)?WK9F&+Oxh-IEM7xCYg!YWjArP*Y5F6TVwoik_V_n#lX06fBO1R<=45yY)9Qn($#9c%=#8Nnj9 zg18&RJ%+IC931z>KJPQ+YKGm@-7c4QUs#SkP=?TzF!|6r)Mc-4>eZ=nfnn*Hw50o- zp_#sfpP%W#m8SkmQBdU`lafNF#Skdj9l@|tla{CtdTpT&c-y3z)tYT^v&EGhjVF@< zw<{fnCw}--JJ=K4k>oeqNz>?x9;f|8`eOxB5NO8_bVeu1GnC-2XmL|^xN9qhx^Fhl zxMutU9E~wTpYceSCb|skHCr9(!=9--e5jX|vQ>p!9aE^0@}_rGdvcVX)Hyrceb0}0 z6wBC-B8*57J5k(6CWvelIpi6h{_pVrfhnHVv4rE4y2AJ%)Cl{K;qm;0NzILu&ye-; zoF${!c3i~`cWRuTGs9Fw`HQ%dB#UX~F~rJ^#>>XLO0oW;R&Fq?olNx9tlD9SRxL}Y zlF1!sR4wIs4s#Y~+n-7YS-Oneb1)1Ghr(qj&Y7i)3ajGFICY<9_o#3_DAU3gy+R>+ zmFW78s*ida^_LN)Hb$e@G+v56&s?v5q39Ke1V4|t|XuyiQ=(}GMK4W4tkrT=X2<;+^$%551{UellGzRz8IwP9Mj z+|4s++~PHE``dcO;tW%zef_nbYxt&>+t9tLFNP^>Ho(x_lzM?aCV7f ztYq5!aidn@Zp1oKatz&irn{z~iv|;Z)$|xHOZhJ2sw|1pD(uGY6Rt??bg{os3q_`kobQl`pK;UCk@8`ZjF3&Kz|oCg`e?rs~ z!?$>$;XBd!Uc(RgQ2~KeL~Ur;6*brJ5<439P}N{!U&AX{3Thf`G3=nO;U`oTP(C(g z?${%{pEWStl40Gic)qI}ew3oNVa3zJ1+U5GA94UXUwhmy*ExCC?h->beVo0Sm2pKH z$&~ea-TI~IxUG>FL!Y7M3d#0{W@wqh8zhtKD6(iA67hO6n` zSLBgz&3L^*;kSSoS;&r@+8JEiZjq~iAJWw$+(P6(OGv zk;l4`XZj-N0^~(3MaXMW!pEa*jE9Ktbt9hZKpbynVVttC93WoDjR6GRMmf{p(aSEyELWCmMAuf79OSiKMc literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleTransform.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/FeasibleTransform.class new file mode 100644 index 0000000000000000000000000000000000000000..8f042cb400828a27d9d93e219b956fc2cde9a3e8 GIT binary patch literal 1061 zcmbVLZA;uh5Pl|}#!F*;KecbRD)>?{ErK9d3RXA}j<%o(g?`zKtGAMD!X{VRzu>R2 zUs|Z(59p67&Yrn`P$8cAu$!5k=b4#jXaD~Da|z%L7Cj7M*2SC$2Twda#WNSrUA!R7 zG^EH>E0Ui@o=c+}9UbN>(FA`_YiV{Pk!3O?482oYytpmX%zITIWR(J z$BBvSglgV12xlv$6#HRY#-eEFLq|nN($q^)MSOkr-jS?CmbM66rHDH#B2Y@`C!M$7 z6|AAG%(YueZJdg4!bcSzVXtqUmwJ3R=D-rpyLjp26&46@`z9ug*}{TI@Ew0@oyssL zY(MZC?c^<&l~8oR!zt1<`q4loyQ_6_tdS_*&nsfTFfYtXe46+Ad)+i<{kav+=F9KcrvU z51r{3XKH5zrgf$t+nN5TPM@<`5`uxn4<*Cq-o58M=Q-z|bMDPQ|NikOfMfVRjvEOm z+)UtOeA3F%WCFJ^l|T=&aokQIj;y@?R33NaaaSJqWZ^S;OpE$V0-s}69`|MXMFJ1- zWdaZJRU5vBE~7cY&BZaV5T7fX*1X{=oSV!!g^ZWiO{ZwsC8zA>jErko`ZN1c#w--A z%(QNq^SbA_w{_1mTzjmddO;y(>jgvMU?YfU1uIkbOe-@*8OpX6T_y!3XyiPGArl(DdJv|ykhtzTWfB?-=ip0j zN?|0FLLG*}c42VSW@TCiW2$gHoJLK2Q!Xb%xx5P$?8|uGF>@rdg?*`rZb~G4U+O`a zUlNt9ZDieBj!PaB;X$cNZ%XAvXiVP0VM7u&)rNF6oJ%0PDHFvqIu^=i9a507SuZcm z|57-UO(`Vq`sc-jDb1;;L2DV2Mz3%(?2Kuks$mdAaTppF@JPb}9E>Bc!Nj7hJXYvz zaENHwhy5BpK%a(Q?9s3nNevbX8f-WkMv#f4sNowyapiFwC*mk+@UR$1S;G@NjpLby z=XjyvTaowGaV@22Z6U1MgC6$TnImQ~YcL@ht)jhXuN> zce5zTFIzNR-JU;QH#@<)3d34o~FNBm(lcE#;<*dBYbwz7|>3j9sKM>H%%tdiKBd*u7Cwp2Lrc(pqg({S zWIulf2%i{H+tG$ykp9=r_dRs6*JspM!No9b%3r_FO&In2+#`vy`k_O48CvT2MHJ(}AV)fu&}# z)KSB1<~kVu8cuT+rvSCfOl4%?WD6G`QTSD8i22GYb6`~g5dVtA^0vPf%ZFgM{p_0 zVd7_+OGBPA2#8v84DqD6?q#|oFsj};nYXT9e PVnm1`dCFU(XyN*QAx|@C literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/GroupPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/GroupPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..8ecb711b1d15f4f2752482c8641f006cd7035044 GIT binary patch literal 2755 zcmbtWTT>fl7=FGaWW%x$K%lml4M-dHcZsWT3=I-^(K_@f-(_uCLMm6=UPX0rPo-ox`g?}7dMpWprfa1jqpyodKq ze1I7fuVB{15UzI9>Kb2s$gArn<}h#IMgj{ay0MtR5{oUf#7)*JB=AuWKE_H9Zei8H zZ3A}%;A=LCjqv|@g^wpeCn#G2%7L>1Szfud&=$ub|V`TU;>G@#B}vpbNC;L3mCKTC1c#eR|1w++~Sh= zwhc%NMT{7*EtEj9=E7jMb0IJpCO+?YvbNvMv%q+md`r@F>Z=Xc4JKSPJ+Ud!|6+m# z5@lI02Xm2RsE3l|phyGqX6rnjE))uUbw9ls-r7z7;eC80$R&RzEUJ@ckwEvZe55p= z0$+Dr@Gk+a)551l8BVvg&zdd{-OYX5%D=%w%JbLvt5hIEdSnGVjXlUv7qQGanhK+$ z$y;+`P^al}(PSatq4rUy5{I^|A8|Mz&S87?o-{EqO8?)7=u-jcqTet^AaIIS4(+4# z9?xVCAihOkPQQ%UPl!ePd+9JjCy{4}W^;##{X(Jt*g~5x}93MSF&m^Dx2s4|TJV4@U<|&B> zu19nX7CG+4Ao}nIl9<4NhLH)(wqRs&p6-cHdcLV)43gYiwBo2~hLBC>;V;r-Kq~b! zJ%K#^I6(g6fDHOw_#NF32F*kC{Ha$KuQI8wA7I3Zu2gRF5WT7X`1d%^F&vzi*6C-RV;0Y8!^6bYDS~pEzT{H4PAqK_+!6t1W`mGaD-z3R&bR zq)C#G>2QH53L;4IGTm@6NliC{dX9l8j$s7J93w8rwabw}yyY@Uz^1j!OSs%LI!iKa jG?C3b$6y4<`H5@Ei8f1#mZb!);BC66FCEg2;N5=#ERgoM literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2f65f82e5401f2abeb676ba0466e1d0e92194ab9 GIT binary patch literal 259 zcmb79SXtx*>t-;~brZ5t^lBC!z(a|Xv{uf*@I8ik zFz?Uv1z>?VKoB4zL`iY23~zJGgvl-ybg5(SHyN8VSM!s;X+oGhT%B>9n*bxi+7uU6 zXF4xRcD^;Jimkr8qslL(RllOyk^n-ybB?Qx)!wrwj2peOTJH9T6Puc_`rnPIm^<=V UQ(b8Y_0VrQlo`pMFpxC-0^!z2#{d8T literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$Entry.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker$Entry.class new file mode 100644 index 0000000000000000000000000000000000000000..7e402d2c9188835570d2e5c2e3e965ebd38ef1e8 GIT binary patch literal 836 zcmbVKO>fgc5Pg%xaT@|H;iI$^S`dfAfo%~&l%QUsR*Gc7p(qD#8+)m@IO}Tdp!8>P zLgK&=;71|e8V*QsA+kKr^LE~NKKA>MuipUd<6#eNZ1>Q?c8vQmb_9{lk}?(CN=kpG z7PCTCdZ9?^y7WWAs?EIlK)(_Ul5_n@t9fk;H8JV0fGF45I1|WwLHD(FwmuTH_a09K zol%(?!CGRSc{86)jen=71(`v}Ure;O!T(Km>fG`t(Xp%jrJz4{&iGNGtICjmm89iN z)w#Cig>h9m_o-3d6nf##l$~7^YMh;xbC)?&RioUbAB}(1q#DN96+m#fw@i+MVQ8hb z*cZH5PR}8pUb;FrwdJ6Dtdg~#*f5BVzl(kvX57aW^kX~_yj-?z!Fsc;LUTZGr{~<4 z;Q12S4g}BsUxr;?wGMAxn{R|JEf8a+!BzB#Ek10Mo4HC)5xFKrPrjh_xjDW@+il1# ztnoX9hGgrwK?KFOnIeb}dD0>VvHV*cLjM#;*uWjiHpzxswi1Wb GD?b5BG1375 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdSoundnessChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..b3b6b8c31761a96378b5c6f28652316579c8c669 GIT binary patch literal 6707 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 Ks(4?6;C}(X=_MZk literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMap.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMap.class new file mode 100644 index 0000000000000000000000000000000000000000..4c3bb3866935fd017748ea96dc57287dd6b0443d GIT binary patch literal 225 zcmX^0Z`VEs1_lELPId-%b_Nbc2F~=<63>*7%7Roz26qjgb=p`6W literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0c80e2e88aa01088ca916032f24e3f48e6754d18 GIT binary patch literal 253 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$ElementNameClassVisitor.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$ElementNameClassVisitor.class new file mode 100644 index 0000000000000000000000000000000000000000..0f438f9bbcbff360094862ff79f4532537b095c2 GIT binary patch literal 3221 zcmb7HT~8cU7=F&O%fd2zxVltZsxU;Hn(tt z9M1~0>z?OYE1RA{ZhxRO`aFt7OxP8C;~O=sS6%(>0Nis>%u zD>i46GG}{9cP%*%CZjT8fn(FQSuh<>sy1corP7jBvXpFE&T&jv&6za37DnwzU3w3J zre1A#WR$7(qGgcZ&H6%B=#AB-Q8ksKG&#nwK&AmN#4JRBcl!MSP)5_#Jc?UXU|=fF-xW13qvfR?UnT$ ztEGTfpGU=`Tv7Y$9_IZny_E?Wl_lnKJ|lwgANVdT!d{W8q6J$!JR}Lf(Kz8+SwqWrtxEODs<&NP$n%od zt;TtU2^lT|PVu{>3#`P5vI4ON@f#;8%aCeWiB!ufMVsU70}1|4poim=?74^_#`btR zvjdU-0Fm^-4w}+ucMwgdqC1Ga%hd=T&yd zdy-2;^(31n)suXpjNFSeLHrxEk!ziq^oMAUV8CyxK|9p)SBT?l2K`0_JLS7nf_36i zJVrpmppU%>`~9Tkr}!pm%Mg?4_aJr=&#-NJA1&iOZ{cJQ2eG%2l55FUwZv|87YR92 zww6Y_XsfdFrTCW8e@7|5#~^;d1b*DZZnDB|5*bRtdW#VZPyos9EIoX7<7}l&F>0?> z10>YsPgLt?1={T!RX}6N@>`bQhZrWT4>ikHCK?L$3!#49!!LFKijFuJsP{NV1JHA9 zrLv)*zY+9z1*-W*0jR)vJP`mKncyD;`16niB^Md{LWN6)JR}!U)u~xc{I!RJsBpMg z-|_Dd$B29l6INc2OB7T_>`>>U-9H)~)$sl{{eyP=y9cQwpb)_reIrCU%{IwiC;vV? L%yx$D5)%IdYeYq- literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$IdTypeFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$IdTypeFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..50fa47bca96b77e2e5c043195ff2ad5dfd7ab2cf GIT binary patch literal 2182 zcmbW2ZBG+H5Xb-9)*ii9uqgP5g4Wmvpe+Sad6MTesX~M_(HADy>!utzuFZ98%D2)N zO4P&;;D<8KUa!zr%7JfgZuVw>GqW?Z_xsO}UjQ=LR-s}lM2~3|VWbsgR0NP!F@szf zvzSxy961&9$SHWK;1xqq92oUjhGC|lSC7)-Kr^Z}Zq=&|Tjyz;n_APVq>ZDRna-E@ zk8AvmR$FTrW|`Xy457VaOB`@v=tNpHEJG|a%*C&cN)#Ca>(w%67%CVRf7>`JaeH4Y znY1!osOp+o)NDiQ?qWa&&M?@DYO7)C!l+sdk-TMbd)?IPbxz+`uN+IPn<%r?wL0IS zJZ*+0@8othA-HWVBnpSxCoOGibbvdhL#_*Au^L0dGp06zVL*c)ON{?Y-x^ zpYn9wiJ;?cyWec;ye1g7FBe41{K8OjmkOmD_=Z5qK4ZbT5lb@{f) z5It+&yd`*r+w#Mbg5?NS@LIuY1Z!AVu%Td6!4|{HRWFd9Nn@DzBCM9`!q#-*R`hJ@ zXS{ayCLN>G^v9iRC!Uugh!;-ebc!{awQJx1n2EHVer?(tsd*vV%yEk~T}4 zkEEJReT6T10{<7%e6&Ye(g0x>H|ZI1-c{VfZPFO-;I2zpg5M#8ej@PRe}ZeD$)FSP z&H;?Jj9dT^!adw41j7T2xu{JS6_u#eHw3>!VK@g_>_A3Okx@cEbdZlI`&NFv$bo*y z4}Fmn4)QUc^g)LDAwTv-#s~$f!ZSJ)S%nRfev-jt>ICfk3XHcbPO}Xn?o?IQDS;#r aTJ`lIf=gXc5ouXk78NZb3Id}AOdt>*hxP`BOs7pdH5mVZKgI`5 z6cR~{ZzldI<2f@!DP|O^KJ?DLXU_S~ceXqI{^Ro(02#b&!CBl>X}QnKgo-vyD0rYE z%FnC{1&{bJrQop&71O*tVaZbkGYV!EJQIjI#-=3&x^g?lDic*`@)E`ZB_-&=!MnSWw~gS z^Hq-P{- zfpcDJErY_*ZAWg&3Q-Olg@VAse<7=LX=0|EWdWfpm=l1&{Xq0Tr*ZNz<5x^ zCs|W5R$klAwsg!qrO?RdWwqKnlF1O@+rQv*ywpLAnk}uHt)#NSOd>-=DGgQ zJd?i}Cw0Yb?>W<*xq57VUk~#PYUn_xhFj>>a1Q6Ge*z{`!Ms4W>A6|S(})$k)>MxU z>}WxQj^_d$uD8Z!)$js2R$0`rgk^!Lrv26f^)7(+BOl9~J2LMGBu|YgFnVg;!~242 zooUuc;7wo~G}~@LEql@s@d$?LP7~Gq2B zyNw<$*9c}J0OnM{=%J5G8{H-C^y}o-q_0m5A#P2QbkS)FVcG%hseMFJ2Z(O$BlZd6 z1Ia?@rd6dUFoOtYae;Q4r;m$B&`ID5uKHLGVMj>Tlllm80A*ufQ0ybVhnBBUmxjI} z8h$slht_wb<6(EY`g6o&9+$8{h`Q?|<>B}~2ocwCoxJd_hjt;dXvGcOB=#YmHhRa= zZ21fl#~B5%4AA>QdI!WYgkc}-B}L9TjHd<$iE=0y&&yAoP`Cz+koNNv zr+*imAC`@{R1bZOV$AoECeO?*%2|3(8?P9RguNm&O?KcxgfQ;v-ldFzeqm~^hg3Ed Ncj(Cu6?#rW{RztFK7s%M literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$PossibleConflict.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$PossibleConflict.class new file mode 100644 index 0000000000000000000000000000000000000000..1d76bd430706913b2e5adc8d3d83ba18d0f40af9 GIT binary patch literal 1713 zcmcgs+iuf95IyT$?4&6TfgtXeQfT6&b<*}N2niw~RSGRqt3LE?<1Fn~jvd(!N`Hqh z0Ewy+4}1V0g_v1NH3|-}f%9A7i$kF|Q=S-Yi0wo#8q3#Z2 zHL(hqUf{|&2nEWWAUtwLeb0&H$mxvD6qbFaeH}j+@GEoB&Eq8w(V+eP4x1&lGvIXXduu z+dmzs*K+W3sJ)&FS1x0=Osoq);QjyX$^3aYTii!u)L_wMvB6?fVC!$d1af<)etfKA z?FuYN*Huxp(rh*ee=xffv)fvonbl-;X)-4XY;Xb-ZIiXbf0NF%(GUR4LZ{}o}^XZ?Vcze^o_Y;X(mz? zo{`49p?FAtD3ktODU`TEx|O)x&2agT8C(|7iGK>ZlAITXWD z8T%7bALueJ>{qJ7*ntSRkRK3_ra~C=KrG|&lq|%bLl{^|GJZlWF zzVM)lNaBOhS3kstTMScO+Jo36ymsp zF$0$JMFZmk1JaW-DeLVQ~*iKz!9<)s?WQ#6rC;Tl1dXZcF|)+l#j)J$tkM%yer_&s?aiZ8hbR-F(<_y^3s& z?xV5izN+1>hDAj(*#!YzKJVBbk<*#Q4f};{dNz?(${W)0OWCIakw$q#)%(Yf0F_i&GY%?VjBo zTls9SdJZq-9^EaX}z?c<=(_Cr0I1xNaQNaF3_I$sl0$Ncn5c80L4Oj~@#SDWwHZDJ2ZO&N~Xj z?L5Wk38M)8P;M8|Tz&^yuCN2~fma%aXj6#Nj?+#MXp)bnkmSv9_zb6UmJtC08g4yL zibx{?CGXPQ4`Lvh`v~n5VswJ;^)~ZE9-W!My#PBAoReK_p+xWEykxd2*UEo`{uZ&w zcK$2$C52iDkc~G;D{w|6U}Qw!AsX4|3HzCWfmv2O$9^6h=*QaY$HGNi3Rp*QnLTP` zP2eiMl5K@mC|!(PzOakPzFc7&V*z9?Oxc4paE-#KHVw+BBvPmA7$MjVp23NY;%1k^ xWTwhhT50cjIH*%d5b6{oteU|uh+91&#PK0C+z#k6I76Qzu?~|yjw|%6@+W&DdIA6d literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$WrappedSAXException.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder$WrappedSAXException.class new file mode 100644 index 0000000000000000000000000000000000000000..bd2a71ab07386a6ea8d2cce8a98b257989329cdc GIT binary patch literal 803 zcmb_a%T5$Q6g@S}&`#3`$U|PEE?5jhVvQ>o8WTk)AsJmb1l`v3RG1>&)t!Er=C2^p zkht&z{3zq8h7e+8LBgV{@4bEQIrmY&|NQ&~ppQ-)Gg$M{#A6Q|9ySG9p(=ANusKY! zV_C(K%vB{vZ@+%1LY)>Sv9APXUmI(RHv*mR?XcY=f#!ZPA=$#vSpBJt$2vPyKQ{u5%KVvgS0 zB^m)1=rONm735pQ68||)Np8V!tM?t^j7EbnP}~K#YMS5@z@i+@GLJ*8)b}cd9Wk56 II_Ba31v+ZYA^-pY literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..678a21dd2806860d639a93c2deda18c80039ccb4 GIT binary patch literal 7493 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapSchema.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/IdTypeMapSchema.class new file mode 100644 index 0000000000000000000000000000000000000000..f66ce3f8be6d07afba54ceceee845e134ec1933c GIT binary patch literal 1382 zcmb7E+iuf95IyUp&CN}rNeYw#EwqpuHSijQ6osHfN&_TS5Km}huM&e}M{B1_{|XQn z2_!y%k3vkGiz?M^)0g$mdd``%Gqdye->*Lap5P#kD7IpV;C2k#xD&@++>2l*juq@i za6f_v3^CIeQr8KVY|*q>Ozyk;$yp~nS-IF)#uJ7hSle$ZF(;l z+Sx1Mf?P+QX=!gH1(n_jDJkVT4B?7n2!{2BX^ZA)&=vBCcP%>EXgE5zI$W9)dv+N1 z`lie9G>AU<25r4B2Au8@A5J5if(Z752+rsuS-KS56CG}u2KOAv&P4!Z9K3vmyflol#Z-%+pvV3C~x~EdSy=1l3vtidb5L%{FtjqU{6I1 z@d)-+JVY*nyov&f49_kvHu2krEnK(K7y2h5Cv=Y)w9ApRo|;Nw$Oj-6mo9f*PjcOx zJ7<^7BsEF#BHmdt#k{i^)~c=6>(+-_x%skDZ82<~PUzgNZZN2I+ZM87ao3%6MRl2? zE#mA2vr@q-SCM-T4MV6WJcja;S-Pl!YJnWV@1=A;QLcksnle$EI`ljz-9|fw_6ex8 zu95YY>=1nu`QlHoeBnEkFTPWf)};R{Nn>f9px0;xcBbxRT_=lxJ}vWi8%X)|X=G;f z?-2I=GhY!Z{6P5dH&))~zd@mBtDgy^P!JHgLTieYrcVXQEP`Z6eTpcfqjxpg7ZINYrcRlmXzcb_g_WjFO0C&-HVBvy;3NAXhgv$=D;Hr&v8yf_x zrvjz72))L@4gHSZ7b=Wokc4UM%1$gj@jjSzlplGWq43mL=rDdMw3c!3Bvsy6#@*(S zP<|SYC1H7>0{J}kM>2jTMjo%M4nkLWLlLX#JYOv9eU%WljUk^+f-si5DoIo@+15H% zqg2bJp9Zd0VbCSmqnQfALnCd`1_*UmB(mTW`sQpD)_FF%&B1|qCpw4z-BRKK$Gy;q}dRFaNk7O3C2Z|i}oR`Or-w3n+e^9If;uq>48bf z0$0K@U%Zt&ex$kT?IURT*>`MhiaA$v!kYT`Pepih`60pQK zcLaFfJlaBuFTiTGKZ8E;s04?fPPSUfypHqy?92)^)Op7CIDutm5KdwxXZ83!WmQ{; zC>>(yBade^i@$*5{UTKhQWdK>m3=>rGdbxI`(>)yj4J=hsn2n&f@879HTEZ*%i^B@ E0R~f}i~s-t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.class new file mode 100644 index 0000000000000000000000000000000000000000..35517a4dc50e32f5da50dc55818f86e3945be8ff GIT binary patch literal 957 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..6bb1d553dbc3f3ad5aef78e1884b3d6a90ad73ae GIT binary patch literal 599 zcma)3O;5r=5PeG#5Jge&13jC-#d7h)i8PQj(Lz!~q8GESt1c;R(_IYyH4pv(f0R0{ zN*Y6qo9xcM?7VqzcHZ7!UIBD*T*hG;tul@n>i&4(xI@=*FRyOAkvCvqEw^|UGoRb{D8GL(u&5*$8u>TRUp}$l65o^pLq$ZP;VRS&C+%|)&200?RTRrm zNApBTdoc^_xlw`b@tN#(u1V#G;>S{`dnJ^4{wJH7DsdrXY#7c~$|W-3i}1l#v-nHW z3Aol1rIm@2US~oDlpc{i2CJRAsrs4Ep$a6!R%$Y1oKE=@XXvcxXte}=QA)7`PU@rE zsTAa~`v*PdiI(;_J@1yXC7K)xv@I0TqP<4<5)G#S8a669yiT~9!yAM*bGU|LkvhUQ WK(UUUEbgL_#U}Q$k?&`<4?Y1|ZkRd% literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClassVisitor.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameClassVisitor.class new file mode 100644 index 0000000000000000000000000000000000000000..ca12aeeb8ca02b27de841bf539d372b1f4f5008d GIT binary patch literal 608 zcmb7C%}xR_7@PvK{HcKQ2qx==a_6EUcp`WpA@Nu@4U}}Zn{Jn^ujauA@S%)tcTo=< z+)F3@GT+SiP5b%v{sCZyNr0OGw*>v8$b?z!m54aOOSpa$09jfM61?4(!ONWL9`%v`BVy#~S&0O4hQ7cxnh9&Twm* z54`MS@>aSxL+3UATRfRf>qOvGy5+=vtGlz!MJ#DB*%82*O+{CeP#X%i4M>|X#nErKRmfW-^6JqGA_?4swf VkAcTaTzR~%>O+TCX=Kj^#^1ovvts}N literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameFormatter.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NameFormatter.class new file mode 100644 index 0000000000000000000000000000000000000000..8fd655b5809b0f178732bed42278554fb994ccc2 GIT binary patch literal 1175 zcmb7E*>2N76g`v8j&W&88umikuq0_(QsO zg@+*Vzz6VAh&xW&IFcp6k?-8O%ekxb>-UeJ0Pdk_z{HY)8@Q=RS;w-06;$%Lh1)vr z7`Th7j+#2_8dfzl7;?{~C&T9q>1u6{A+zlt2!{EV^u+Ga?TFwl?>HnWw0xU8dpwZp zJ`rZZo*Xb(E!%gku*ap}7v8`h2DY#Q;qYUxYe~27Si9U6JAUBuFcd+PqJD@j44c&? z-(%OYhM^q$HEXRye#9+@6IweAq}L^cj7N|RD}Q%q$U7=`m4m7y0nAijgFd&#yFfA+ z?Wlwu85KU0`?~TrF^BUS)=aF!GO63GEa*cVOwjw5)fT4_Y^x>)} zMK7%u=mR9qqLUU2+4^^|uaSCzXf6`waDjMpY=8oabknhj5=oTv5i&^AS*?$dY7t4l zZWJ;jWWQkU8*&A0bp-uHarp+Z#tGS`pztpuOH?PChe5w0rMEZeX;QfU2cG^pZ2$lO literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NotAllowedPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NotAllowedPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..3cc639d35c1279651da12312dccfc1bfecf48c97 GIT binary patch literal 1365 zcmb7@%Wl&^6o&svoQ#{8=28fEDA(pj9K?b}DiEq#R4FP*pe(wZxI^R0u_Jp@;Dunr z0ydzs-~o6j#IfTzQCQSivS;S#{NI^#@$WxBe*x&CTR8UBJSXB5%+MP;{nG* zhWxhe+UglYw%!;pXgl7KWGMA*R~}5qL+QU2Lx(KYzGn$%AbdMK$3{(!?114(-}1($ z8VTE*NH_4Nz9mgxI^u(SY}(_AV;*?wh2wbd<fK{UW3FrPmQF{&`7PK{Do!7iJ~M@#~RpytvtUM){CFc4h-G2LFaP1ub51nj|{u1 zL+?#pOWB^=YxGaVsW2Tu6@E25k(Q#0vUd!R(_SM%F%;fJE!(rhM%NZiiEG;lLmA-M z;;0*FpvloP(1yUJe}$YqWa` zjds9VGn*~*A7J0;kU@dI1zJOQorFc&88b&(FVG2CM=6H1X$>J6?MwKL)cMGwFDWyL zvW!Zs+$HZYN~QH3nI^rTz_riNva28?0@Y^D38;c9HljcmaVbVVr!_?K))}%4tND~D voAMHjCoqm0E=RB{xEjN@YDPpKsp*tYBS18ih1u6cv=9DOkjk zLgsStr^{H$;5Jre+>vpYLA80)^jh37pSyw~SJ~tHT(`Krt5R|CnL2 zaC*B~V@Pf~uS|x~im=V?cC&7}&v@OUm0ZO!xK-n>2<&(<={JPOuv9UertUYma9XDA zIc?W4b=S1`0i7+HElc0_wkf$yi+dhrF>E-t&xK8)3xz?k2TeFoNKEv9;I{P&`R;VUC;X7_Q=!d)?84Rm~NI#TEal3kcvt*?9G-4 zIy%W9L(E})@FJL9@Go+7XNf@JV776;Mk)-%EMPDFmD)J`UI9U`I zQW?>xA2IVu%v4LCAZbTP93go~z7aJ=UIDvHQ#&-3_!nuP;Sw&#w2hdSEfH$y9pvN( zB&CzQTn{hX;bl8K8kCr~8uEeRAiE=^PLifVl1g6W6O&jla&i2NIG?=s3ySs=@_P&= z4#QG^Kn|Hb)kYdllS(tBdcG&id?(91uHssl)hw>Zr)(H9^5QI2PmPzrQFAF`XXd-nUz`Oewo_n&Xy0gU32idJMJ2xC+XcT|kw zu8MI?v>=K}mDVN|ObM?Eu{3 zwhX?YmfiaF!iHUPbzUNn!DJ(pouZZ9a=9dC=_A1ez7-0#}WK$*);fDZgBVg zKQfWn&E~r;-J;OC>UCYoZ<>bdg(BPe&670=HW`|1w_sKn!Uf$a_?pVelmOKYAp*lh z!+aYz!a8@jYgcAPg_LdIU>Iv8!TA8h&z%+OI|d4e)Kpi!27JOrjeD0Hm1#t@oQ4kE z*U*l*h8Wru%xidn1qBZ^3?QMQ7k!k|g{|F)K*J!06fA03LMKDpaf|zMGNdlVJ-RYp zUZm1MgA*ruiF$m)^m@_1T@}vInM|F%Kqmt7?;OKu1Nd{5XK458R(nm34L#sXflqgt$N#oROO*Mp<=Z#V@M%QVDz`aZ~!W1K`4bzhm)!cN2-N$Tliw+FF^f` AnE(I) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NullNameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/NullNameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..51244e10c38f1cf146cd22fc89fd2416d1eca242 GIT binary patch literal 1856 zcma)7T~pIQ6g}Iolr~T)f))i)t5OOLih^1NwSYQy$^#5D`W9lK%cKdWDb~N@AMk|- zKW4y>8697A#vkQ)HwmO=I+llKcW?HdJ@?$R>7Tz}zXO=YlLTgPQ^G9?vk8PTCmy#G z=*3(QlDHGc-2{zA5xFPfeiHLoknljlLxvg6Q0w)qX4SGzRpr)>Zq}`at?5}?H`J!N zmF2Y^BU@=0Mn$dZC9#{Kzr3yPs*0hSTZ$VhGW4vzF`cUJaE&2$kDJ_?X9$ny))^ut z>!r?+Dsxk>G-?~Vy{2v$6iJsYO*Ph4n~Sv{j5t+JXDDSNrL>b$d{T-arL>VE264?Y z9hIAud}X{-cC%(E4Tn=El~T;TAZ8}b7%p|+%`k8Xzq+Gqe3NV3d2_;(o)WpLTCaLK zkSG+0>8~29L0kvNThv_H*w!`25;K*%a)PGfQ&^f$w=W8!xVY5(C*EGFIqu(v(UyzMjn$gE?~^dJh`hSEX#O|0ftin zL(c{bxvm%Fu=RBJf^@e$vcRTgi+eyfS6tST+Njffvek@hRoi+kZf08(gDAuFi7EK* zqtjgL34Jg|pQTbKS6qj7)ADxI1Zg^DJ)R&`Wg-oxEyON7bfq8Ce3NyNjzn@PZF4<-b5?2n0{K=VeIv;TACI2u#8? zjJsetO!#1v?z)rwBQ5oXe2lobDRhcxT!ltaUwYy**!%J~gr6TElHW)42VnvcMBN>M e6+Fd6i7_(76bkOXH2G(m_Iu7^xK8sBZu|pW$)H;R literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OneOrMorePattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OneOrMorePattern.class new file mode 100644 index 0000000000000000000000000000000000000000..8cf36ff0385d93b652f357384f3d4596af5bb798 GIT binary patch literal 2963 zcmb7GTT>iG6#g0(W-kK)0tsYI0-Bg*m#`$k7zLw*OM-HVfFvQtwRg7N9hjY&nwd?J zpQ11NqCV(DtWuI_m6tcmA7y#EcQULLIsi4(*Yln4e0@&u{Pp+GzXF(ml}10_m9O{G zn8B?ydNC`9b1CZ0%icm7w{b`I7B#$|#0P1lv6RHJoLZ3vt4Z9|@L>jPSkGVsA8FWR zU@pVxlHt^gL5-V^D{S9sc!nr?!s5GjwP@B|t9X|Of$;1phR$izHiMfCW4R++jgp_l ztWyyTCzecGtTgIn;cf7;MKgU%j=`->?wN8NP9}ny=`&o7b+KxTRd3nxL<>W)>vFro zz~dRN8#Phqq3x}PX;p+bbsRZZnc;dY%R}8TvXRdOFtpe_T_nT!J&?V__l|3>lx-UmpAM(s7GCIzdf% zl+N6c$}(JwPnIxEHcj7@iYXl)HwO$8vD6Qk%cxz~dcrV&WY-G~TOBv0=r(`Mix#H> zT`h0Z5mITg&ls*8l|}?b*;N(6sw+HIG=3{eV{usoQIRm5@dNG! zC7Gq%wEdD}i<0A&>U2>^$CR?*Z92%-R zY8cdD>e$8(!=*TgFlQJB9j{v4ty@K(?-ti*?zhC6HvN@`Wi@Zp_S`6CcQ>8rtgKKw z*m&a7(aKn^LLhNUZU=p#ELBq^>IZmUxOsM0i=&Rz()#6^Zp~#I*q%KrO~OTIbOk88WE6k!>C6^96B**kF*@h z|AiQfo)175%^F?)mpsu)w=^G$A1EHzq_u@GO{aal2~VVqdE zNAaa;bplstmlST5_Na6y{DI!jF(7Fben&4g-#|+c_xA5;Tl1_s6?Cyh#%$y|i>q`h z()Be=hTyXyc%~p>U!boI`|&l;Ws<&8-)I5MM1UEZzpen^#ElSeIs{A>@-J|*4f|=- rq;{hPDH$Op@fO}zNK=>&k&4txvK^AyL6~U;qc=B%F!YP0bh!BsU@7~C literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OverlapDetector.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/OverlapDetector.class new file mode 100644 index 0000000000000000000000000000000000000000..df7a87c339524d0ea10741e0ff3ae8a4c74c8091 GIT binary patch literal 2612 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpNameClassVisitor.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpNameClassVisitor.class new file mode 100644 index 0000000000000000000000000000000000000000..cd070d315746a97ac79d9622abbf4f692b293a26 GIT binary patch literal 1107 zcmb7D-%k@k5dNkuJ=-2FV*LRK0+xif>LCeFH9k;7lr*4LoA9`t8@uLiuesY2{j+>9 zMj!YC_@j)o*9Jm@HurElKW^sRnQvw<{`@`%u!F4<3Ro&*4$Bp+;Gu&x2agCvGgL`q zhv4=6DD=!wsAwd05{+YDda(?|SN+*j;VAIl3S(rfUyZ|&j5~x<|C=^LX_U_}FO*j1 zC1H0vBTjQbD0HJwl2Gd@Esw_Gsf<5}(||pTy~r2AK*Y-0Q)j`JOjzy?Bjrn5&XEXZ zHxNlOP>C{8OmN?5E#uTDIrcDHQH_5?bKjLSd&?w*a5B5$%knxi%eV@)yyUh2oY2mY zmFDac%KdbJ2P$Rp+T@;n5of|h5sr%z$__SMY~rzl2H|z49rzDTg#Bz#H;=J?v%5J9 z`;tc9OyT=-WC(j11~uKIjvd0&S(ja77wi1a=J?6+@>-5r-eL>L@yB$tU14pHZR@GD z+CM<8_D|%#r$H{CMGgWTW1e-_>YP%=ZI%}F&J^M!1LWCPYqx$OpTm=hxPqzL-}DX+ uy+@V$Dct%bWeUg1sN-&WMGf~@vsK+^&>S9Mf#o7=1*~!$xT{s}4u1jJ$2LI# literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpPatternVisitor.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$ChoiceDumpPatternVisitor.class new file mode 100644 index 0000000000000000000000000000000000000000..226595c3c5d1256690c5cfb3263fa1109e16690e GIT binary patch literal 1081 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$GroupDumpPatternVisitor.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternDumper$GroupDumpPatternVisitor.class new file mode 100644 index 0000000000000000000000000000000000000000..cfd2adaa478c174d0388873c8f96b145245511e9 GIT binary patch literal 1077 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..e3595c079384321784f0a62c202f82dd9e63cb3c GIT binary patch literal 1609 zcma)+%T60H6o!9u3xr#^lor}@Z=stGdo~0}5K?HWg4mnEz#wNlay*c}S{FP34~1%< zAR@7_y_tV8-+Vgfczm8;{yhQM!%hX?D)`PYk@Bu+bPDsA;c&N=s!n3=c%}-GcU7rV zk!T@#FTYK)P9YN_e{*Am&i8+`?)d{xB)4zdSN9?{`wTNq_)D3(ldX>O+@1%D7x%@1&|y6Wb7bf>b^YLCJ*?W11hv{SZo z(bi{5TWd3HeWShNN&2az=!o1f9EY`yKI@fIwRK~3c2%0VYTszDc-&Qc%nfI#hf8&! zS4aPVqZ++b6t@3}3oyXFYPtZIT$Z-|h|5Z(S4gd2h@P!7qICy`b*-!$r*oiJS8)gP zN8B(RgwMrtUK!1KMQpQ7&VJ a@-x0re#I)~8rCT{uxTq`*s{+dZ2t#mnFh1~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFuture.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternFuture.class new file mode 100644 index 0000000000000000000000000000000000000000..10f58069608e69df39f16adb5cbeabee2416f02d GIT binary patch literal 347 zcma)2yG{c!5S$GmhVY6)!zX|Qn1YUqf=H2&66qR5x0uz%kY}j6g|%#+l@U=T{kw+xM?XL^+!@SAu(;51k#kKmaGJkD2RYmCiXzaa>kZD zsj>hhBm@h7K`KCEWeKq;5=|teMyQKaV#OMX1kAxwvGLt&t} zR9wBYQe1yaK@}CE3w68Y7`C%!)V57OKsO?#<@sB87UvgMm*1his1R_Bjhd;DeZN$$ zZ{?j$!>Tt-yH($Amd$+AtQkA@$9Ze3QOmz=IF8x0$)#<#%nB)GDp^~WqY#|2Y|EKb z@TW6t+_6xv5cPD)vdyLKtqrre>hZ)&^|Dc0Gn$szU8m-3S}ld~ekBxb5n?teWiox@ zL!vL(Fq)<}t6zz(+qcC~` zsqBOS+uS)ms-=q=y22}NeHSe${ZO~C$638nHSQWZUcfmW2_$tqhnSA%WthRN!sR|2 zMMoAn9dmd?$0){hyoq^*e4nR})hNV7Prhcb50^KpW|>tBlxuZcq^C2bXWugEk(RM# zcB493y4KmV4X@8{8?8;Ri`mjeUePFTBM`tjoJNe7=?pC&;^XwV^_ghBq!lK(utx_2HU zxIjy=FLtp%C$^8CDHl8UGkgNi>5z0X?;-Fjg8Yl0?_Flj+Ee5s{Jwx;Y79~*t%Uh9 zgBzu+Np^*ZNP0v)5mR`PawM=zc*&Eaz9mACo+F`tj8yiF!b60FJ60lNHn)#cvu)(P zh3raA9O7cmTkTHyB476ZnCteuM&k$2I(c>-Y=PZsKpd$bKTl$oLhpU*ReMo9M4{r4iL3eiHol z*Pi literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternMemo.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternMemo.class new file mode 100644 index 0000000000000000000000000000000000000000..8acdcca9dec05d7899e5fb455896b594314bb1d3 GIT binary patch literal 7287 zcmcIo`*&2;8Qo{{7&6?DWI_@!C6y=;W)dS+KpH_FfkMoKkbq)Ay_sB+OXm?LH!)G$ z+SY2NNL6fWTl>)ZmbPF`(pA=K{i&?g{!d-q=iHk+cP3}n%%J^Y=A3&T``c%qbH4Ap z_uv2h`#%8OkCg~|aH$S$$jZOj2pr7G+PwUGCV~YlMp%1RK0YTOpO>}o%G&p2?fbI! zf~@^O)_y1l|0se@cu}_fIEdC^Rj&YsT_MHf)01=t6^M~5A18h z&my?TZGJ6`*X6@yiT6eX*YIWpKgTcRs9(z3Thi{YB=KL%+Hb;mTOd4RI*yf13+xzG-G5F=DZ z%@{Ig1X>0!n)7DwoMR_@kDIg8jyaLENTEGA{FIf*%v;&qtX9?Q!{<8G>ibQ{R88ZH zGnPPa$<^mgpz+#=?X>M25U{#R&RyNmk^_tF;m$Jx)kiXuWZE!jr>)_+)P$8CmpV}B z!A!zTo-wnweD)fvooSo98kw>j&$>XotCF+Vl$+`uC4s&&5Q?pVN5-BV4xGfQuAMxK z^;Z5l>@CAY{z-hg>0;Ad`FQk(0B^fqTR>fi6~dJf>2-W44Udje*d0pUi3u9K>%8+=pI+ z+3&6}erI3+j~e&}9x(7Ac8BqM1Ao9f2GSTdun)Tpyel8~$l4!eZLh4oCujso{tg&8fJegklK~5V4&yHdZs3A^;NKK(8u(1g`d55zU%jH|ddQRyULk+eJq-ONF& z8Go*|)#b99!Q?tNvm-zM&-I1bC$kiRd-Z(tog1~~1cB{AKjF&G`(L;dJPA*J6&|yQ z{C#qlt7hiN=OGQBwRE%$cbD4yJb#%}P9J9TLRT@~C8LmcF3NDJdE}^fPerTY%S<9O z!?(u&Xt(LBT})s<{?C!6jc3$zQ7R(jHm#u`G6$$*)Z#)Lu~@t~==}uUg+`_}QuYMGzXGAFdpTnl=FpaW$7XbI+HTITfu<{K3AdNQvsWIjS8C&_$N%Y01B zoX|dVE$C^2o+0zcN-!VSGH(blZ&b`1$h@JD`8gUnPv%c*nU8Ck6WV941)U&hg3KpN zFh9-pxxS&#yGG$yT&$oe$I^8z(*dBce__Iu=5cjlPUEZxbif0ONH-YeU0j2e3}8ik ztOzgP6T}F~7Y7gP3wq3IUeo~!*L)jIv0K=9b_FdRs#OHZL z+`Y<^_-mAS4c3bRtbB=|QWEp+MgXDr+7$$5}QRNzPnK3w*s>0BsMXjlXxp7UW4^^04rbO zgp!!=gc^xE^Ca$cCGONoe9x-H_vR$-EF$qcl=xjr{2nEKpAvsSi9e#mA5-E_DAlKw z_k|n-OJdSLv*jpvO;pRr>Ktu&ge0U7|J^$9|vs(uDue%WEp9;rKF&ce-jb4f&kRgu{ GX8s3c_gB;a literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternSchema.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternSchema.class new file mode 100644 index 0000000000000000000000000000000000000000..afa095ba74ef6054899b01c653e88fe9717236b0 GIT binary patch literal 1711 zcmb7FT~8B16g{&oEM1llDn(@l=1F%+gMpByv***+;h&ockbNz{paT|04rG6FpT>tXvhS^ObWAjpkWU4 zDjuqMq(Q}khCyUi7%CPS5?-^yuvVC;@?S7~Ug(R8mFZYYBqS$HC8dM^06x;Jzqx+p2Njl?=PFc{>A*J(I&WjWD}>CiEvV-#a5mUJxRv5F@;R`HZ! zrC)(XoL#pV*84%awh=Ze%fOds!LY`#)Q_Vl6b2*4zMHa*iswsS_1ovkuyDz9paRQX z#2dvSI#tOqQYe+)l-_S`?7k`%N(__#9!JM)yT+hzJC2Z>Hut=srV4R2)%E{>ow;~c zDu~UixO)x_^_BxctzqMmS-PnFR%1Eh?pmic1-JUsrBV5~y!FsWxpQT2t>w@6I$OpJ z_26M@%nH)M)u6w0a67^kMg@8e)M02=Ba0+`$Bm^EFk|r;ijg};;%jJmoyK&yKZ*fD zYlIvl>;$bFZ5(c3l4isZ>ag%HP*TFbo0vj^v~FQKQmoJ$kf6QHHzXH-U|{DIgYS&* zNSs0qzRC%PawkZAAsYpO2U^HAfg#cglrwF7S2=?~h0*>LZsQJFE4Uk?@6p2);2FI` IvoMkR3rLUs;Q#;t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a30e9780775b89dd9cf4b1e12379a93ca23f9161 GIT binary patch literal 1296 zcmb7EZEF)j5PtTW>jMO1ccy!%J<3!pML; zZA&f98wTB&-BqE*zo_FZ-i@Rhh@{)>Gn96tfnZqdNiFtA;ju`L_^~3%jb0RR)#r({ z{8(7BH)a5X|3Pb!>?)q7f+Q~slbA%HzC{=~7lhvHLfgCxFqC;5t4oHXsd4Kz3&V|5 zrTkdTFpIu-nALtyS_D@nul)QYKj%JN%=_^0*hSsP6FhaX;iG{j_0g3ad|^l((@4WUW06(?FH4shu6P_rXMe{YGOBU)>1UV*iqeS`BkQ@Tcb zg_Hn=1=??BhBYjbJG*LF!g3~Cp|iivXrk;{>kHU-%zZ`a6R{5dJJUJNR&k4*IJlkZ O-@$dF9!bhXY5f6mx`3tt literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$PrefixMapping.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator$PrefixMapping.class new file mode 100644 index 0000000000000000000000000000000000000000..1298b7d738e2917472231e02068f1dd298fb9dc3 GIT binary patch literal 1371 zcmb_b+iuf95It)<*Sal)mP?^r+O*i_;sB4J3Q-BEQlJ$ndEdB8vXx_7_NEH2d=W@Q zNIdWXd=z5VNd;}fLlqvpGdrF+=j`n4&tKnv0BFFipn$u2xu=(nDvH=FVXK5~hGLS6 z4|2#*Yaa6x?uR_;`Yn~psQaA3j(A^W2@k~kcY6$FN0WS z?uIprdS6Uw<)e}kv45y?|HRhJizX9fqM?L@m literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/PatternValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..ea0ef7dd2d3327b39fe7c6cb449d1917a3afbfb8 GIT binary patch literal 10119 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 GaPkYB)&7(K literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RecoverAfterFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RecoverAfterFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..6e86bc430a4fe701b52ae75b978339b8c7c9dd64 GIT binary patch literal 1857 zcmbW1TTc@~6vzM5+tOvV%0-LUdZibjfCyrN1c-fV#DF0&@nyOl>Ed>`*-i;Q_?zG7V zM-F-QR?snpX&o~tXeer!Wzec^%dQEJVYy0@HV_}&SXvlG+;cMtDdyx2PpPGt|)4>27lk3w~qsBE)6X8B1uh!<=;Cc$k3f` z&>c^=pqc=Bi_tfQE3|W!-pYv32hj7!VEMvVL_X6hLe?PbDE%hLLqifn7^T&Uo6Zr!(YK4>{dcnMNA7eDZDF3CPRzROC3(^s|_;9!$K8i4*3okIDF9 G@BIPhy%Mbe literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RefPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/RefPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..9cd6e745047ea4ddf8ae03005d69d53c353adb93 GIT binary patch literal 3728 zcmb7GTUQfT6#h=`2?Iz(MJZOL)ezKRy;iLhV$f&|7?66Y(qR~2G?}E63B}&~+<(v~ z-}=&rwyWrByH@+&ALZ(ICPOlYX`?UaWS_Io-rwH)+k5iQ%Rl}CFoEw97{pQ>yYY!! zRJkn6MU%^lTy(jt%4JO|uSa3T@fc5HC?`;XnLrP!@}?%2PkUgY9)%r6LqOC7#tK@s zlCjrSqgvC=dbMF`ddAYr>ZZAtF)FokW=^$j-7+r;L@a%^P}KzX6sp!*X0uYx)YZ)l zk5s#AQ6Xfi6NR_v5b^^3M6hg_ zdY;}4&9HfTU!cc5U3glfNii)jVCl88s_7NowC8QrZqx;0`escvSM(KuU8USyVJe%u zl`AeR-OT0Y1bVYovu>-Vy{MKOdXPBzPOMp6>?LHJd9j6OvApye5H0~WNeZ7%2rnxTz`Sl z7aNsj-C9tW%REWSoR$|=%aF2r7_!$5hJ3th#Y*~WyJ(3u-F78`@zk5tJ5l#MJ)Y|7 zciX89t(R_z!{vs+K6>^iO)tH8HHT8ZiqdGXEZNuhDwCMTR9@bOSDKtkTe_*~ zQGBl83w$a4ex+aW>2|2 zE59WIan1|1YB_4Dtinhk)c5e+4AXxF;p? z9GT2?c9PTC$xmk|MV*~2XDC8PI=@p%4v@*^~XK3)IaW#$1p&< zCvcJ;GW=C1&H(q(^b3e|U<-kCa0@}Xgya&IOC&wMh3GF1pb4%=5aYTZA^vZQLt)Up z48M=A`q_C0ct4C&)Y#iJjrVYx5}i1y5d3upXI%gp?(!s@{tdC8`6IypbU?&8Jm{EF znhGs5=Ww1U68#kyy#p}T2AFUhA3>Nd+dv{M3lXPA((MJj@7nSLiFX1y>I>u|F8Kk8 zcLGTh$oPK%xy-CdARI>oEra@=+Oi~*%t#>c4Exi=vMfx`@N*>6yIxZI5u?NM`Wc4* zM9;lnp(J}LN1vmQTl@w3|89dgh$zjSWYID#)C6NcMW&r5ug=oxc@MD3R)!`qNw%^x z_%g(OiaRHq8}35{9f%`z7Wn~#Y3{M{=h(G{SUMyL^GY$3Gyz;Bj7#K+jQEPj=}61z z2(BXMWMc-`Tvz9~%WMRKKgrcYj%kmLK+8q|*U3AXQO;u5#uVR48*vxrKsz^0rpz!m z*F5IpEpu_)M8Pq43q{x5W!GG6JpDV80d$h(hR0H@WhsVP%sG~BqvTrhaxUB%U(qqs zN&a~(xR2Z9CqKfSA(hCYc@GdT`Q^Zo8M=c-A0Rstz32<%BiwZ#pJ6_vxri)%uoK9A z0(s!E&<1kPHxHrCJUsF|4!6>I-#-tbPWQ`nuQ?W))2Qt}BL5&bz#rgapFBi6>$>U# LMBpJK58%fgc5S>ljqzQJ@rVVX@wjmUh1cbS9;Ol^>R4Md8P^2C=?kZj6kH~gV_*WoN zA#vb}#E(L}Sw~LQTBw)Z+1;7<-n^YZe}DcWqG$A|P8B++(F(PBxz9_dN)M`ZD5w^w zB#{$!d?u(l_#{6|*O%eM9j37kCocq*{m2v48btBLod>>~$hkX+Jefu@Uae3DN>FFu zMS+{1OC3#Bm_)PKQzmWu*QHaY`XW1vHIG7H8k{wT*j zZkkN!k7TU*ytuT|bDao!Q$!srU(V5m4yL~QK_zI$OLY{EbmU78-pxHV#7sx3B zi){U0Ryk1we74W|;VV_gFZLAHgu8frFhx}9YM zeG@0t85V)ap{)hxDRQ{7kz@9sTu^xl+yo?^v91Gn14K;&-p3^rvR|J{rin(kVKs!sw0k>%fH{AE-V(V)0Zej5*-B}bLgNjXaz-;}dRrbwV pwwL*~2l4w5ePF;c-<({DV}6C@-=%v6n#xx-bqX{I+B0qM{{v~4?|uLP literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..637a42caf7aeb1dd14e558e8e37cc9435fcd173e GIT binary patch literal 2139 zcmb_d+foxj5IqwvOX4C3c)`0ECB(oc0Yn5ZfTF1ap~Rxpx5+Y+!OiZvyFvT{zrY9o z0;{yVRf*4jlx6R-Mxx86w0xOMPoJLCJ>5OuzJK}xAdgZKoyhsaa0&-8asV3gDHKpt zFzU}^3dR*&P9cdA1rxsLih@Z6R~1Y#v~O}FZ9ieSyr5fE&8u)}*}`jT{Qhj>Q2X3Ew93#rXRQf_t_5j|d$np=I1hN)AW6@HrE_DIJJR2W z!d9;$T?R0yCDRnnoWWgJkYxPtuTK}q?bN#P!l*LjGLMIv+6lD@o3L$$d>kMmT7+Zd z-DGoE$uPt^H+CQE_LeSePg*A73(c{?+wR5mN_WQd99gb;!mT^Z9#aJBYOaE51=mQl z5~Sd~^xxsgAK5ap!8f^zZX8n4i#`>Hab3X;6*n=XU{=K(ZZQnTs zB+%ox0$TUbuLv5cC)9Tdk{ren+8?FWBx$$M+?Bob4lJ8{heY;0THcT-fnzkblOiC{ zPoo;FyKo$*Xvc6GXGqI8vmKf#X5WH+L@UGMiPunRm&koU+hVZziuMmswiiDm`RF}T zJBxIr?hq0fzn+F0(1t~~!Y=iE3N?KK=#4MKoJ*kk+=`iZ5`x#5*ZAUPL}owT*673Q*_=*Gim$)d}f3C literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$DataPatternBuilderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$DataPatternBuilderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..a1840028a88997a44d51257b4311a8f8724d4586 GIT binary patch literal 5124 zcmcgw-*+2V5&o_udsmx{<2bgdh%rg)w6^3#ZkmQ-Cn-sq6g$ojYS%P0X|k4X?M+rI zb$1<((Ye|mRlA8lOX!q{yy)*O8 ze0T1w{`v2}{T;vv{*=Z}Oc}Tz(>!`w!}krOaCQ@ZfM+$FGoax-U!F7Q^#vUlHCP5_ zFsq}$_o5D|<9Qy=8JLHirqLxGm-)frOUZzXGEbmh)o@kA zH4WDVlEq+F;K9kVH<$OMV^!U`e9;Q5;A%zYpNIxW7Hp>|y)l9IVBYozMg$(2ER;+6 zVBWIJ73uor1+O4$3hYwF$xjvLWyy+`j+2Czr>CyE!MqIY0;xJ+yLNC$;N0Ln=-QaW zLo))YqvfI$*fMFm^3+0UR(jLctV5En$#TJRW-QO<=SY}hfC9Y?{frd^(sLUi2$q)<{d@buQ=9Kxq_!_t@Ffyq6{qCAre-~ z6iYEqKg!Es^V}Y*7Gy>FMY(mY60K;vVmS+R*9swAfoyA^S3)C@aLIboDHADkt=HAU zLgp>PEwHEcqQ(FT7&Q#Oh8O9X^@Q;gIM{SMgz+Yp__BD+ktOK{b=@lV326z8wsvVf z9mMe{do+W&_)rWN$A{t)x~XJcmeH;exVZr!wP3dPw+@py)_QsfFLH)9*B2Y`X7!rZ zHvWI!w@bx(fsxi;twurYno`yIxXneccTHK|!-dAggLufq5MDAdfL$7XB=BUD>Jne! z2WBkCrqhG!K(xEK?hEw9%Gun@8g7_)1wW=UsOb?@+c747f>%wvhM$_4zzKmq+okPq z7cW$pt{1|Zav`Fyz&2J}EjfALs^(R~%ASeW@dmkd*UGSFnRpX#33T7}GAdP@SBXvB z#M>HvX5t<8=Ux0ejMO^?8sFmWP|Hi|3?3rRmO(Uo{qg2Cd<7%)!cT4m9O*)KE~NT{-Y2^%(-E zV+!rsGP_aF*bie)1}CNOTXVGay9Z;7woY@#-J-0j7}FVSScL+u8Q3>Mecmhg6udf3 z*6&@`&WYKn>O@;{=uvj4{6BN3mHGW_{``N*{CdV3c32oXYLgu4&IR+-Jv-d6+SiyX z55%1V3xVyZ8mA_4zwIx~`l@@R%0D;oc?6uVvsN*WFuxp|@dBbwixLqPi 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$IncludeImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$IncludeImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4683f0ae5e0dfe94b206ca041e9b353e5dfd9c0d GIT binary patch literal 6513 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$LocatorImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$LocatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..13ef30ba8ea2d7b68d7cffc6fdb40977e564c7c0 GIT binary patch literal 1644 zcmb_c+iuf95It)L*4YktxzN?Aq7Q%6x4UeT@qK0UD*ywpZFmj zKq9Kd10TRgA!Z$uMr~B76)!WpGkfN8X6)a8e*OZmjvXBu9_2`^>Bzzor*$D}LTqT* z(y*=Jv4$rM+2}ZmdAEMRkZ&B?pKZ&t{kGMNL)UNbFzBA^^LM>&i-!!X&R{r!*X#QK zOlsV5qtZIVX2S`(R@|}O;E4NC&wNL`dS#zM*$WOh!)#;J$49&6ktN><9NXKsLs#5Wqaxa2 zm=eA?NUEfk>%Py!J`CudXx}kGh^}^Y}xr<++aFeX(3QU;OYGcX0iz%*tI%wk5vbB33f-qP{eG0dHQBkx;>+=&?$g0OA% zyPg%D#&B?c`6VM8whx5Ye?uV{w;$16fGOL5G68V2OSl zc|la7iK|2tkF-m9Is+=bCvxdtpj$|{4Cx!@>Hv~?0@bc$2}>lG z#7lVwIho?hb6Ak)u`K6tjeI8Mrzp6No211_)FLG(QH`9OL_G>+zJ+3%ze<`G9TNK{ zWRgb}7P*kbHHO|aF2n5+(n^sT^9Pi(;N>xJW(2-Ngbmvs2WP&X$y}TWUYQ71&w^Jb zfI)|aYFY=i&+ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$OpenIncludes.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$OpenIncludes.class new file mode 100644 index 0000000000000000000000000000000000000000..13ca691a221f0ab060644cbafe701c5666c4c564 GIT binary patch literal 669 zcmbu7%}T>S5Xb+Ue%EMf)cSew;GtGAdRA(+AQXx{R0|%r>C$dVHf5WLujQc#9(({F zN}LUXLQm4e&g={`znR(D&#(6n0OvR;BZtirve+`BTEI>Ly9}8`O9r;@tDhq!e&vTec@>l@E3x~ za2j|$e=I_No5)}&belX!e}Sgbl~girFg(^48(9{A+-JzPqM=}LI#P-IBpe9+zy|?& z+)m{4pwG25_K!0gk0lLO?xnNbNfTII7~;%4nGG9zHu5OgC}O36eTK$z@4-;{T}F2> z5k9RTQ!`^+{F{tJT6T_pfQ5?bl5Q2#C}~E=#wzJGx;;@uhO|?E1FN6RVbxFP$h?xv xfp{;u0kOst-D2z?RIyQqkJrw;39uPpOQ2GiLST20 z>7?U(<~hs12{l7&Re*@I-4e{Z!6o zG!r;l$Qvb7%4Bb@(g~RpR@i=oF~4o7NM%A9X*;sg&KW6s0!v3qD|;;Pqq9)pS-}f) z|541R3vRccyB?!~(sVk{#$?XrIOWL7AWvj^A&qk9hoEn#itBBR%2)iNT;j$Hg}p0z zEkiW%F2oXo5H&0ZcrS3UXc8|_PcJ9Xa@07LJhkEYiV_}DrQ=%I|8FWj@;9mS->IPG zD&$?u70Dh5@rteB)kMU;#k+6tI2VYzcM#p3TX@~wTU35>$U~d$3IpMd;d=?{-ULmL jI0hCfuVM889+h$q9+iR~-(M>!>u9iVu%M5(sH655bGg9O literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$RootScope.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$RootScope.class new file mode 100644 index 0000000000000000000000000000000000000000..26c4e07a8e19c9f99435a971228c97ce32036229 GIT binary patch literal 1574 zcmbtUT~8B16g{)7Y+GAEu&DTjidb4?3n(vD6D5$4G)h{6CThrZJG6_tJI(CY^w0Po zH1R7w7@z%7#yeY5OsK73n%V8#x%b?&XU@#eU*En1DB^w!N!&^zfw=^3TbNJb4s!aj zkU-u-!NQ`2y9`EHV^}Ra(zl}~cV$Zip=>Kh*h+Z36EtksZ+UjrX$qe|X}exss4a?= z7)Bqsfg3$ySj(NFeqoovT$gphFkW^8@wDyNgxcXXk0O(0>2PnCD_74CgJ#rpLxyBU z%BboPQ-<_b5D2yI@h}v$^zh_7=6Y!KMH!#J5!+meAgYLchIhI00e{PFkCP77NV!3y zG^j<3t5DdQd*sUCA5tF&fsEqhu(U87nW%-LzRjaZsDSvI0rz9IjGH!H5B)Kt{A4IYSNn;iFD5Y;<>BROvvIWD$ zk-E=n2f~RM<_7?FO>k&XduU>Orh59(zUB1ESRPQ<|3K0%aK{m0IJZ_TGQ2*`ne5~C zK9ZL-!3n*^8%jxaXh(*X+=(rWS-PQ;Anr6KwFT(*8ljQF7)8eE-zE(D0jc~KuzcYY zj1M$3FhS2TooiHJ8dW5X9h{@sbT^yOvNWT*7?ly)G%nDZ#^h9I(mR{~2xD?&@dwPW zIHM<@G5Vesy6`CtWjsg5co9SAyG1?dEH2^_0TU2ra5-+A#T8s7_-hn3Y3(|V*}pWl d1~-05jbHsoV*@whPq~Tn^wtU|=>DHV;x{|ft8M@Q literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$ValidationContextImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl$ValidationContextImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..2de6edbd9d2d6d8dcdd39359e984933435b1c96d GIT binary patch literal 1758 zcmbVN+foxj5IwyKiG)QlYE-;MMGS$kQBaI`LDW>mXc^_f7i(C?WUS3@YImXF8~g)5 zKwo@7OT0b!0e+Na&t?m?5-s&%XL@>iPM_}Sp8fjm^A`YR+!}<5sSJiu($aJW7Rp*W zGlZQuJBS&~W^fMY^>R)R7xYj`<6;_@(zr}8)@(wd=J`#_myTF>o7Rd5MYz$C){<}( zFO=slcy1`y!%J-M283+wnOGB+BiOnT`pRwcPAY7vV604-so7rJ3R^;X9q9(%s&C6} zaMkWOR>N+|wwPa4&WiM_tl{H>jSV+!$xtz$)Me$W@G7BG_z$eV4W>7Ui6ugE!CR4p zT{Y#(`f7Vw`VYmj!W~?tV z=PT#Sz;o7QU9@G;5w^VV%cp9cFka{rSg(q++=)-57;4oC37Mu0=S3hN`HHZ&FwyVS zhzcIL9pMLZWzh{)xWUo)^Z1zIWMrTj@diSy#dV!YRgisY8kdCv7z$F#0C z6ML}NL=IO>?7~PIS4~{QbrZXhHE|62G;WxfM>dTG6F0GF;v~jQoWi(?0>%lq|G6yt zC!a9#qx|nJKa)16Zv5{$h>$4gD*Fkc+dzCBj&z%0E3&8(rvJb;O8>82#0jp}?<_v3 zK73Md5YGJJbpIA)0AbrQ2*zg0+{Cy4r}O$04D$RO4TJdENg%6lj$f{&zX6+wzzh^4=aV?XbA~yZ{HHn$<2&EgqGJF6 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d3b79069dd988c7b52c767aeb9b2f44f42fb4695 GIT binary patch literal 27188 zcmd5_34B~tx&OX1N$zxV(>5V#8z@lPP})h_bfM6uNa;?X8%?QA0n0SGZH7)}!emlX z77;giu81O_BDmJ2PYbjOHDZehD55@}0_uDE)c1V2zNb%dMS1`4+-2^}+{{dZ<>wE$ z_s*SjzUBWd=R3=Ur~dZ2FA&iJbwh+|`5hB*d8a(xE>G{0r#s~GZn?Zi-rXse_sYk+ zyzUlRI{8~j9smhzKw`ErE6!cWQ5 zS0mJDvw&z%M`#7#E0n$_m#@p^8*=%VFuzeKebeB7jnI1jmcieSP&+#EGyJSvo|DUW zfslv`S<(>gZ~(zef+0t{xknY z$h;WlzlQm5VSdR_6rr@@3AA3RhzhBSu&R^~Rn^K+VM9%b&;b=ORJEbZ2;Hb^B6NeA zXsAgMx|u(3sL2t!Mb#RrE<$gB!0MC;y-C#r9Mxc`DG|C&O|4eb_)GGpF+z8!QzNuQ zohDDy<#M{A&XD_=hMFO5&I+rUP(sa;mraH`+fcI&bq-VYhE!K9lS;Su_9d9i_GHpZ zuTI4J`>lRM&B6EW$*#meweC(G)`kq+# z+H^XVX5yXDpnqWZmRP#q!snJ^1i`i6YVB}agOcjo&2(O|K0YCGp+N5`z#x`6&}VIk z?@q_k2iC>9V1xrq^ERZ?dp$keR;_|eVRI0g5Ks14>3C)nu&LW{O>BRxH4y^>9hr1I zxmV=0dYDetR0n$#t^KjVRt><#v1E6`N~47-0A>-ss7#%Fz&8191d5HYd^)~+AY*Nc z^;+7UR`*z4`vm6YCCRTGt+S|`fV(E**9)atL6inE@kFcmv~GkR=XZ%WH^Et&a-F5g zah4{rQ&WMnFxC3t)H(?NjswX|kClmcF;!}(V0vawkRYxr+Mc7GEVesgEg#(yW3qfP zmZLk~&bcM~Ij#y_D^{l@$|r4zC#_8by}PaSHqk)*Oz_$Mj;UsC@!( zkT}ou#NnStAF?*aYo;1&un(hy=h)kdN};oj8_Gr5=d@%xGsmtSD|cv3{E+1iTWI0` zaz(M2*Q~Z${TPP2Bu8wIrxLpA@KYFzuvHhtlkv=jOoxhsVI!Qa6LM61#bb3l)6O|Q zmvf4OfHz~WrRIWoXdoR&-s_F+vsU+{;$6t%kIcEEm|cQAu)TB#U8G8?FWq!yGMPfH zgvR}d$Rc_LiGnDFLfno*(TN5G#=~)Ikydx7l}@=TnOa3%AH*=R3CqU~@qQqqf!G)yw7Q+=wY_~ARNikb1B6#j zDXq|^RAyx&k-APq)f#NWgo$agD5H~!m!cQV83%B69v!btXF9ihN?tDvBHE?A5sc|q zWuR%hRF+Cjt6O#R)lmz*>hfRucx$ z^RMOMQ7}6$Z7ye#V)@vH%sg~Uv+*bKGHj6>27(;2f?ZCz(@qy;Z{+}xg;Kk($z3Jb zy!#rfDv^-@zg zgStZ%f|ikmY^q4GGUTFifIr<{Mz>rWl-B-bn)p3si~O4cGW>Y8 z%|U9Z@mL`2NQeYbMse$B#&mLGz|Uh`pik0+_Mpt2V~MR679*Z3Z#)7Nqb*?j6JBW_ z^2YJfO|$VcuIW)IE_F_2zrE=HX!(=9te3Wz7V>24lNAQTP|{tZw&0VC%bx4`X_!gx zlMpF7)zd2zUULjly0DiQOplf4H{+;dUP(mlHF{g4s=l@te^Ag3SkTUc}K41yE?tTpX^bwCsZxGwsD8_w+&GMvvfRIICb-NeIG3 z4n?>Gw6~?w+Ag7e7M5-sa<*CA??tP!(!i+1W9hw2o5~|n=)j|qtpM4Dvc#X>yNK!P z@sb}K!^K!J!}5l`Y^*H=(5vjT5lm+X2;m=~+~W^w5Q5M2fvUg2GWELDK(gDv%BKbw zNNVZo!s2Grf(7_+XVK`@DLV>vO!(w=xSj2POxd)CUoN zY7n8J2G7mPw?yPioizDIOA9XQ=L!3({!Z*iV^-}%=0ffD1LNUVu6sFt)h?&3^3I77 z(>nt)Pk@<=jEUpO9Kl_h7V05oNwHCN)Sj4Cxsd9xiT&Ln?JGEf=yB8$b>6r*ViX8p z(1nSCKHL!L(B~-E#pRgSl!A0TUt-JTYj~eYpQ2Bj^q=$-laA0)lds~d<mRnZ41RsWqURyU}Db)Isj`FzFe3)=&#g zdRigHE-uo2w15(j7n|x_wFJlQv^T_4t?ipV7C6(I^^yG3R!r0UiO+v<$fc$a$$Hd; z+j;Q#EJ=HOSv9a{kCisn`D&@DmZ>&VEms$ySe=oP!&^yHy$bKp_d=5|G5j3w6I%~`D&7!B8M9OuhTCds+b+M`1)g`97 zRBgcN%2GD)rflBwm2+g*q#+tM>Em?JqzCCClRiVAHF+hkV!E&t(L(R{j{u_aM%0s8 z)E&QFnch1f+ZY}|hT3G(^J=q6zm?1H7VoUTvx!suP|tkVK57 z_9k(NxqFwpO}i^$p95#QxD<;*OeIa_7IE$RwEj+0U7@ZNl&``Xl;GnAt;^Qi9rlnm z)oWB6(`f_A{(-)}R664q(%$Wt6pu6I4S|XTqYY3tg7I2QDFA<@Npcew{1rjF8}i~ue) zpzpU6B3zG2|4k1VDsHN4)IO{sz+nc`{Wuf63)?U9YYYj;qlQYDs#oE_X0iON6RdqY zFYBCOg41OsyLCwC>=}Lx-2o<$X}LaiFXTo1KDk_rZIFP*t^;bR?Ck(OyfZB+ueI%{ zIhtVGxusNRXSLhmbzYgx1DN%jDnk#9%gRntlGqf41`M^|q=)I4$-8(J-be+tOI;@y zY?w^WW<~pyhP=mG$5{cg=liP z=X5VVz}OuMR@R)EL2>iheOG69oyUc}^Ya$L9;W~TAk1;h9Mz;xQ}#zsld^Vkyvf*; zN{d5cg+1Y9WcPacJBI|@4YRn zs#qU>K8D?;9EW$l_Dkfis6jZKN!f2uN%-Y+dqTO1_yJ$nK6rr)ekqJ|6?57}X>4T5 z?-Q8Ho@D1%N5#*rXtbRUkh9hiqTl@~0ie2OPJ2mvtr_S`#PQQg%PXwcSQ$*Nuy9?n z@5)49Pi(h^12)h$$9h?_%2!RntM)k~GE^{O!;RTPrt^yA4XwP`dtEBs8kY{FxlY1# zQ=qyz9bGpmDW%)6^rD&Dk|{n0{y~6_g;#U1Cj}}Cmy}(k%ae8(THXF*>iSr&o;JDh z>(y#ZD@tqRwMLL;vze0=N*w|7yw}cNWm_fCAIAh=(aBZ*Z+siN(iRfKn%vbT)FlD_ zZ^w#j2Y1rp&D*l)p_|GP0l7Apw^xFVgSXQcfqP|XyB370{WHc<6?2J8nv?Y5aJBUPwS=PDy6pv(qUNz1Zjnid zulVmQZKdoWP)zQ;Y%l(OPCy1N97d!icDw@&pI6JE-B=IA1PC=hkd+&S0UaXkn=W3v zwSC*JO&v@(m+oEQdHy(ZhR*i(AboR$C?MnHz?`*oJ+wPNYG+zn9Br3CUR<7^Z9@BTMqT@bIR(x;|%OVZ-KR=IWqIEQZ9-%LQ`f+@EkqrDpv~`4P zJEP4bRM*)uOsC8nruw$ZXk+CFHFP#s4%3ulG&MwRRSgyQkl9$-ST#)5ZB_Dcf~E~q z=FWJd3p-SR?t`R9LAedX(ly+)6?`d2bYgHxGd4Qvd_*W_L9;P&dsbORIFT27C#9oxXu~1l9kAzNtlB zqJ37UBv&$I03S%>l52xoJRhL275S54CF?0aa^2sL%0+u6f3`?x%h&^fU0oaP~# zJ4B$}T-Soj5CNC@;!3v0iy$4*Ak1+9PuIh>Z-67-NT<_Hkn^=L<;}F1UPnvm7C6W2 z;RbKes7$eC)}|!%-b>HXcc7bVq9$!5CEL4rEBscWmFPJ!8f6}$)@Hdb$YNimF}=-4 zeIosv4lMMce}^04Fox_I;|h8_6}SoFz0o7I@O>0(4h_+wW_*}1guejP91`;9+TT?+ zA3jJIZHyvR&O1owZycfN5;o@_-v~&SJwc68+}q^&VOoyc1;bQzkS4ir@e$F|2sB@H z94rk0GY5v2`$GID_vHY{26P=DBzha(z5{^16OM2@BI#W;i|(Ma=|1#)4_xa`nvds& z$RUf6MV8b1=mL5_t)>r9Cw&l(_aP0#xqxgg{(GGM1JoD6;~%FV;^_jseVl%TC#dg% z)C-V)?3kbm-!YngjPVSi;mLDC?BO&(dMJ1qAf>h zb#&fQS`%%oI7$}6{?A9;^poC;b1sm@2te**kINoOGU%|iB@gD{wn z=sg!(g3AyZk{d)DaQEbG(|J;2zRe4yHrYbdW^Ho8(iAqFU4z%TujGPB}nmh${Ov+E5*OmrIvRo{R-cTV=blsq5svUSW3U9 z-+*#G9R2^`VwGMdn~pxeeR&GvP*Pn{<+LF)f`Ip7(&mONGhz7xMvWsEM z3A${Ew&wHurH|ia568(Kj*~qcCkNp87mr_n%{uaV{l>>@>^6Im{)z~eOtcPn8BN2Y z+YoKb=ktQ*GsAA<=@izQNS+I8O%$m7Z8Vyf=hOUC*)(4ojpp`zntv^qCjOQS{?)oK z!d>fN>;CFInrJ84)3n<-x-%=5TrSuxLTu^&BeVk9~-wm&le7pes zS0Xld4$&1-l|Ml>DCy_H$xwheKDQG-H%(p*(Un;~b>f#Cp&G_?giZXF%^J<~LYuB< zuLWGihL&}K_C|^21zw(C;N=)$_>U5_$&_&izhneg2j`Za=~)oFsYL#b1i`I!%@el*l_Su zpf4r-As-y!#_*F=CveDo58eYjZfy+PP_#{GoN$cr*B;s;jgfgHv`V~I8>-rk2v)@jP)?Mp-sys+_Z73fBtMkSX zszZbTs{oFj6bGt1X^+0oz~?*l=R5S>Mtc*T0<=E`v_B2B577+%EJgVNTFejPuf9G+ zoA?OrL}|K*AE7u5wvQjCG#{hu_;YkCf1d8(N9j&JPIvJM`Y1o9Epj(a!jxt)*K-4G z*-oeP6igYmSBzOQcR+J8B{$(Rq9!)R^Oqi z>bo>ceUF;ebNEBWKcGw14{4+N5nZP2B5^BwB4I$Ekr(-*P)3FgcfHgLII<|9|t{=7J zSI<+0`YD;}XH>6#PN%D1P%G|BlwBYenU3)yUJRKq3FC8%Psex(WM)2(&v$gV7RU%T z4I^{|)_`tA#=wjhs~tBD(`)l%{@2=f>?)zb1G7OxDC`?}sWTik@G>Wz(DUaZv&QFX|vZHM7Hw9&Qk2)zOI z-5c}yyy%O-u*WB$HU>?}zmn9qfui7Kj?kNA*$(o*Igc(_K8h9v^D!;8Sf_A4RwswA z9S)a3YSC?C^MiEj$8}*JKJ3f-daW~r^@mU;nV~Ap%N{{|>uwHK%&U2gL-%roh-2Z~ z0RQyUF(Ca@zUZ@kqWdkp7EUCh*YG;WuWNWcp2WfzbGyUB8>FK7bfZ3~eS?%vaY9$= z5f|k+U&5C<)Ov82s8$8kS~WF$f!9w>#%i0I>;B4ff91Kq(p<$8ZLTPIc>`~BxVGS~ zX%ui>thw6L370GLCf*El+2cKFcSD&2(sTk>T}y|~_bJbwpRq1CgcUns;~(+1@MVrb zS7|zEl}~oLCTk}FKUo(A_L2a5DA-KJ4Q!^8gSK*q!)giMi|ZAzTA^9lUgl@Djc22) zfN;43!l)!xk3vEQPkZ^BMH#9qxi9Oc@fm{vR=$4fOaJ6!$BNj2y<4{*_* zBR=2BI~}r~zi__KZ_;%0{pAY2GQVf&kjDK4uC~K$4d|)l2PF>3x4_RNvCVSE>(w&j z#KI|NRc}#P-L1*4l#2?ot1%60fVNNS701wastE0%>QE;&gs!4#p)05{bS2FUy+*T^ z;a7@hd)XR{Jg=R_yRfM3H<$=^wIkSeBzO_59?P^#Iv=FBq8fP{#;~_z0Y3|S1g$C5 zOQ(dA9yj#yc+_*ufgW>9-i_AT$PjKarIUb*0WPs}*T> zhfSAV19yY5L;wa$F!nE$31iD)+>5*<`D1F9@w_2=r|enHH;`lAjSe&V3oAl;Dv?aP0Eb z;edPl!2fwx3NB#N~di31~RT^oNJF*^Vv z9%2z7W@p(5-+(7UJi<5PNdh3kHz5lB0pJS%TE5xgyanHjJBEcbR!oBV+A$yY_=Y{c zVUKT^Z_JB%m)q-DGOpNhE$$+j0d82_3ub0dUJQ?!;W0D#hP-^{vUokeA;20HTS*pE&XvPTLfsyCkPtv5i_dHB@c0NS!K1fw~GfeM&h~6sHIVUeD zejDB?emiz@<;(*9S3H zt9YQH1@}8~01s7sqM^-y_*BIs4ITc2!9TC4$ZF7$<7JaqK2x!(p@&xvU`>UkVK>%Q zJl3!mwu-!leiRtTQBl;e5BK@ui3(T4FiLFZb)k$66;D-E6sT5i@mbLZN2oT6DMIb}C%rd`uEDuvawl`q=q+YRh)8lGpm zg$V@_&#ZU~Mnl~!(t9&THMqB7;= zOa;-5RWRqu`4!V$G*)a{>B~4-!(K96i=X9U#9OmSnp2^;3xcUczf`vDoaqv{wq}%O zssa-MlDI2xJT|9oGjA41k{?GxUC$YLbILYKrHRm2tI}m0cQswf+v$=~NpoDD<4zoD z+FU_rp$e)X8ERK!NcEI;C|w-dPVic7C#zs@L*7)GMFqQ9wn@)(t(CGz>1x|B>@rS{B849kC2>WVX=4jEQ(oXZQe6u43T5=S^{t$->x~uThm8@ALlOMuJgsSg@TIbu;VjNVZmIWu1HJH77Dt+~8DFBReS$k^1?9Iq%Lo zE~R`iyl1K!?gVClRcbWHs2%vHY1egV25EdhwdPn^qVl|XDoy8oC!AY~V+vY|$ECU% zt3>KrJ0SJegM!tVwJN+z=mp0Ut;o%$;9yv#@i^8N#Ab5E;t@R9Xo?=?Qqqw`O2Nci zY(qK@;V_k6n2WkCNXG{lQIHNZk=0h+baWg+LdSb}U%}BZTe%ZR7aZp^9iL-X#~1ig z!Lcy=U?c_}?%-|{Ve(K6Op#diwE!^k$O!6x!3A?4Puzz%Q1+P2yBY-qSaav!x@;*dlQ zMNJr-+fIZ!uATB^0CZ@16xO(*UaP*|NOwFG;$uKZhD;&*iYN;kf=7QveXGD@45x5fAja?^J`!)oa0U}3g-&6drL_oo zI2RzlkjU{A!9{;TTk7RDdVCJO4LS4)4+A95AbH$Jat+mSi3eQb0hc(=OD=KAC057f z0xn7w9umt|V%MKYZlP}*yO-&@XO?wHy&^-mcx^vXkE5HagEJHNO#}FTOyUwb?xqZK z*eu)>E=#Dg40}jI?e!y$HH_GYJ47aj(Mx+2!}-b&1#m+W4y4Akgd394_SQvv1y?17 zHPVrDF(4`Q6NN1d%yGD*4Z=+leu@fmRNyCM7W_gaF9H4lu3?74<|WJ>f$wNp5F%Gf(Ky8h(2j9pX$QCy+_4P2!rxh4?(`mAq{k108f z7{`Jvm_^){*iU3}3=3?b^frb?g}mFKLj0c0P`y5S&c>(HI$#5Y3a3KA#sLd97 zvlC2&16>LdeV(3KQ7yrVCMoyVg7kB;P$#1n`1dCa9g#t&A{ojJnVo3zPsA1cgpNdH g6J51=>(|U3B663yb-B)QG;kc1<*m@~JX-Jl2bhkFdH?_b literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReaderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReaderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..1e6a256d48155234e46be5d0178c1e6c7aa88417 GIT binary patch literal 5454 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 R_kye71A3cuZqb{b{{X@-#=rmo literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4f7ea19f2b9bdbd491e9d931b793d98f9e5c6bc5 GIT binary patch literal 2879 zcmb_eZBrvf5PpUvELoQWLE*r=6Ho4h0Jj10PRYp`AiQXJafwLE57e+3$zCnHsof0) z|HU7nSDsi>fMsF+i+h!+aJQqhZL1uF`23RW4qE8O#i$B@pO z?y(+}x#d=bk3~I$AT`#bN&+sV9z8YAzzEjsa z+vF88>V9rHR$_%I9P=;%8ziE5`Ygu}xNWaEy<9zC^L+eu6HJJ zD`ceK$g08TGFCNrYKlr=xsI=3jjD^ArttmobUMxOL&svdZg(OR-c~U(&Ez7vd*%dX z5m+Yq-mTUDswInNxP9NByyPcb!+UsN!w}Xr3}BEdsKW_rqS(3-3N|!+jl6?$b8^>++&vYOh`Ulul)EZ9e9mAPYA*dyZKK4Hiz?(xu2+G_qhaV&EZ>ITH82$Gk)ZTt zBTqwHVNZ5C+f$wRc(hlBa}?%*(!Y`|WDCWe+(CY0$;cYTgVpSEVcRG&j72ws&{pPf zt78tYI2*qSkCOSn;xQC%lh3x37|oYh&PJp-v~KDLjgBneCk+2YQVFf1-oq`M{N`oT zB5tnA%&ppaRHj2VO)<3gwCFcoi`mug|5L}fn>>XrL8dEnBfC~NH>%e={ncRh@DW|J z`l%aVHXz$SjWLoBVVItGX;mbR7>#|Yb9AMqUL%&8ehu~uiMlXC&jGrr z0i*Q%07=}#9qQAgBpIulk@Oy|2%zSMIx)?pqb_oA9}j4hZZ42OH;ro-h!@Y1*nEZV z)URN_LD_nRp87Po5Fd&E1?>VV>AbTLCvj|QW+XoSJG6zw1$v9Ak;L>l?)*$pb$Sn= z(0mL%6!Rb+;zN9lar(~S5nU%A*QhSmU0+gNBdsx_*Mk>i^^lMTF<-Nb(LWPp`Iy4Z zK*J}rN??*a#7RFz7E_pRgrt*1hMSP&-w^7q35RNqwYmb4kvV!oKS^7!J=0jCag?&y UE5-DAM%UqQD90JP3>!%P2V|pcrT_o{ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SimpleNameClass.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/SimpleNameClass.class new file mode 100644 index 0000000000000000000000000000000000000000..477f9f986d4db7abbcd401b42284636322311baa GIT binary patch literal 1579 zcma)*O;giQ6o%iMexyx9!2;q3){1CWO@{14?r{Gx z!$S4^@Y){1x7?QmA8&BS+Ua*%R`0pdvT3K(a81MBGkRRCqs_G6<{rb^D0a`XjU#7Y z=bf&tH^tc!qPA?q^GI3FbRFN|4y9j6+Y5%te<{tbW%5_tl(v6cl9KQ*jm7R7_$@#SE@6=p)|20SQA$85=6@V~k;9*j0wwd9c`! zKt7pK8IdvIIK%3QkO74;G;*0CA6P8*QK7Fe2il^eBut=hHAjbvG1@88-8Llp14{i1 zSY7)J=_9QqjMKS@lz4(P<>e`7f>xKqXj~$m_$dLE5sh4pn2#c6zWxc4c7oI~1%}8h zg@E9vsC%QpUA#LCUva+K=zp+E(g>^za=scxK0MnlI1tZv~p0P z5>jHVWr~@l8YQw>M2V4h#DX0CTZqeLUJaST*0jsj1laQmXK z7`B?e>U-vZOEnPTP>r-NJS_r#81_8b9|YbTZj8|3D++HgWS+@Tn&%9u+D4nQY^$zd zC^uy&UXS`6p?7&FAkRuu`8;TIE$uyay5>L*86GEcwq)1~#11!nM`$_TJsJq&&Ub$~ z7{1pMleBpt388dc!Hba$xaQ{xoUzYPTeMu7178h}81C1S z`H#P9mIkmx`4Avd9&& zjMEGcla}j*Oth0ps5y1GN;{pQg{N1u)MUBzBPHZnBFm$b(V4DKz}}PLph*9jsdEXZ z$Sy_!D4|R@Sn=es;337O>8#d2!1;>hdVTZGR@I##^%0Ksy`zs&!V*$smqRo*wr(kwW(wOL2$13$wT zfJBSL10TRgA;zJJ;2~Kg{IKI0&77GzI=er9e)|q!3!6E(xRoBaJ!Emm!#eJIxQF{$ zSM%!@b@xO3?a@ zjUK-f1L5N$d>MlKrxGwk1{q`X*Q+K=#bwg?AYpSDI>MFtoE@!3A=WB zrg5C=rE2RrV`jqgu{3|Hl@SZ}D?4o>!V}v(Q%d>r_r!boN=Hdd_+Textb~7-jD4#y zBtK>@ziNPkl~gW#y*&279xG_#IUHHQCH5EjZ=bU>Y?n&qQ&4I16i#X5E9O3P%)t_$ zE@!3~%Y3eJjC0w$%r^a7!oK;=mcL)tIl!<0 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction$2.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction$2.class new file mode 100644 index 0000000000000000000000000000000000000000..88c2067f803aba0179acc9e7b7172b189811c6fa GIT binary patch literal 1485 zcmbtU+iuf95Iy6j4lyph2nyv|AV4lHDS1IC1r%BpAw>u&Ro*wr(kwW(wOL2$13$wT zfJBSL10TRgA;zJJ;2~Kg{IIh#o;fpnbasFI{PrEd4z_b}aU)%BddT9IhfUn}a0hp@ z$Y*hn;0{HQj~@|=jZW0Bn4VBkEW<&R=#H#t8HiDMR8jpnsJs!zNFCM)x#n?bdeW#4 z1DKu~9tpH6Uw5c1TRXZ_qUurcxNWzX$Q3~qrs!*9{gpY;)Lb4XOM4-CDMEdMN zFA^1WrLI{ECj=B*gv?&lm4xMn3gzph-KqG?J9LwoIr37ux zInl#+Vkmr^hwtMYaz2)DKZ^%G3Mgh#@=?YXE6t|VIUVvNS$`sK%s{+4p4`E; PasG8&Wa}}u%a*@i+b6)g literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..2e15147b95ed4757ea97e99c428db8041aacfd9e GIT binary patch literal 3344 zcmbtX>sA|86#h^-f!cTNW=EiZ*{>>r(W33C&4yc6K}nV!o{Sg$igb2lVC#K+*dOlM zb%75PRc?ne2p7XJu*;25t*F3$wASz{q3wGGD)oq4;9@s1owf-W)ptEGE`u= zBI|0^QLgerft9Xa?GP2y#vUtViu>}B%sY}k-74>^N=P$AP2fr*sAG}@hBTI2f!`qe zQZkZ=@ltt$UsdmK|BItGd>D*T6Rx?%~@P6hCL- zKE5;Xy#az~gaylfC zUX>AXWXJp-(xJZC%BoV&S=D<+5$&(ZVowO-|KI6)&EBXbUQTjp?0t64s0OXI8|(8_ zqjoz?4!gtKHg&Kp@A-CxW#y-2XC83&Zhy~|Y<)?7I$pI|e;9uH%@S20R@ELty-m*W zF=BRs$?lxT9}k%%h;8WtgB9NkrS0*3^G;XKb_&nj6)=fsnOxDMVo2Z3s#^=$l%n|g6;MapIw@~@4zZ|3VuEkfvwZ6U1N>uaV&`~;t9A78 z7cjE9=_e4sbD6@c98JzVMjC^7jjM?k8D7U5-03fG;w=i%tMmMt;`#zE#$p#ZYyQD( z6R9Tpe&f0&Hy!Z|M>5Z~XxcId@ir#;owtQc95uk7slT7|LavGa4GsgFT4r{-iS%DE z?qv0D<_QLy7|PB>hi2=L_6+l|3F}b%NMyw*op72KjzuW4E%|K}3q*05+6OR?DP)Mz z#2m6*_3<=^=@{8A_u9rBL7gIskv}k+!Y>#;uvyRicDl76YhwI3kn@BwK{GELaYwEV zBu5}KR0hl!N2zBH<+a>;>4=k)<0%z F`VXon@z4MO literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d959f77143ab31f53dbe8a86c52b9570bd650b95 GIT binary patch literal 1525 zcmbtUU2oGc6g|$mgoccb2?pb1d<9t3jdpuMQwP%6G=x+EQmejusaXwa61h&*J@8-n z2_P{*Jn#efQHYzeRJ=q+A`ia4H`mAa9v}PXukSwqG_hHQjhp$f=EA`(7q@Z8#a-NU z;5)d_V2^p^r`rs*c9;wsdcb9pig=V{DijSRB0hVN|?VzlvxvEea8q=)-uC9Pt)jxp=+jm*1mDOB9nnl7~IZONQW|~XRWlK zM{oID*Qfb6aEYu-*fv@EeglP1&Ic^nsuTfIqU@*6&_)Ev0H_Sd-<|%!@_+V5Ae{&BWzf3 zEo?HF84ujJ#Zc?`(Ws$@Tt=}7(`cOdqLGMzPr|c?9K}K7HCIX`VVj}aJrC7TDCrY` z8p_mdGPJb-UBwgC<7cnvfFqH}?06jdN=7-Pxi3Sho-=&d{tq1O);fGbW_^o))BxGQ&KNh|Ho`X7e$YDB%mg2i)@Rn}(L9WKZ8}fMJONM>DG-dkc zPTA9)SvoOE$9-RqVr)Ye^{735l8*#G) W@%D6b19ztVcX5rPP1q(ydVT{-6woXH literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$3.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$3.class new file mode 100644 index 0000000000000000000000000000000000000000..db6bd4f7015cfa825a3691ae6733b04dfe5418db GIT binary patch literal 1530 zcmbtU%Wl&^6g}gnHZksl3d*~@3^Yzl0$rdg1*x>ER4D?aMA=WBp&4+-mNT)^1^>b) zfJ6bY-~;$5#C516Hr62F#a!R3J7?}WKI5OizW)Hw#AX#XZsyCH3kSDc+{PUjcX7{w z@8CXzo$<&|9y8S1VLWW;0he(i)F>XOp=hKc;uCe;ki#TuyyjYqRJ9nYofD-8Ld%c< z^gxdMCPT{z(9t~AU4HzE4%io|%nrsX)H2Q??H#G4e$Mb={XcMwTYEf`eXis5jLeI% zjQS!q&t8zP^%yF9abGYjwWSg-$HOC$cKK06m6diJ@~FpCndfK4N-hus7`#KJM7kI8 z(MV9`nQ_`u!Tc?f%$ktu+eVNw$_(>7Num>mu37RKedBROCj*->xSgqy4rDIRS}C7L zZ+XT&oQLP(9I74`@W8=C59_Eo2t3rWK@KxHv=rapVt8WOy_>7C`-VJT_>y7AEKQld zxl^`HXO>P(((y19Bf45m`plVmj#8+W`D&MOV0da`P_mU_ame3^Lq&2%f@k#k-IB*J0SZ^04C>&7Pfea&~|I`u+nz3ma9~xREcbE*#u+aSOLy+`(N3 zzJq%V_JoIivdK{E1o5b;hFr#ph_ZN`2BMjYkWZtdrW_?<^EFpWq*0rp+C7fcP$(G? zfEvooZ!xru0A0mX)#FF6=zx8Z%E`ev3Y3g+d#Y!#^0~ov)Q6$p6 zkY|~o%2VUCTEYA+lFXWt>f1&T9c6}jo+RNhL(eSvjK1->vXg;L8QgARqyw4Dv#RCu z@GYNk4`<AS=z{4794(c8nSSN>>9ID0lw-`1}yLWRncHfZ4OJ6eVn5EI_ zn>%IObf$Jm6%~xB;f#HdXfo3Z`5+nXj6ml}WH;-TX=AR8_ zW>rGcqi56W2Uu9n?L}A7r3{pj<7Syfl?9xme38EPsk=gPsoppNt8bjZs;_^=+$XA8 zSfbUYPT&#F)4D=6>LtXB6!WhYTq4T{zm%zvc*zY!m65U&=K STew#AU&jTCE@9gg>GvCn63#9F literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$5.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction$5.class new file mode 100644 index 0000000000000000000000000000000000000000..ef5633bcfec7f23ab771988b5d0d9c7d5b1f22d3 GIT binary patch literal 1621 zcmbtUU2oGc6g>`IvxcyhA-)2P0R`4}TMN>Jrf#6IX%kXeky`cLOU-IXlgLf0?tve~ z8%S&*9{2(LD8zNuPLoh%5P9(Ry}3U2JwDeze|`S}po%9s*tn~QB?q&(=iojbI4Izu z9v<0vY-5>WX2^p=%<#1CN4-kY`_o+Ltr zHHKXCI83@Ckv>B<>B@eg%1|>RH50Cq7C&mxPP;PSg<$^K}`DgF)|5s1`pAD6&wGd>*v9lG>jH zGny#|Fu1S6P^g`N_xpk(TgGFjGFMn9?yM2fzhMMPtDVHa<2X2GXqma6ilAuRZkox! zMhyRw?=;6U+>@Hh#njr@-ti%K;o_2u92^&ODB38wC}YLOs*5#vE-KL4G>JTQlfpXn zh-vkT#b;nfE44Y;y(=J3yYs0i>>WLW~?)#!oOH7@;$L+!Z literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..07767a79dcb89c3d4dfd383d808b1bb67cf23020 GIT binary patch literal 5619 zcmd5=`&Sc36#jRkVJ*R&_|EQkcySrJEkg&1*QqEy!GBfx4zPU4V=O%yu^XFdxy6{UC zw&6(`+i{v(XJnkkQ!=%l=9VgB8ethT+&2SNf+j=8oD3cFT%40(@R-445gE0ZlVHlI z<2g|tiSkHHMm_gDi@1b@j7C^8l31w5c`P!=1^)OPx1Q(X1uibKj2C6RgqOK^MZ&8R zUK1!Y)rcmrbvPW2gseGLkH$1J5lzO!T4*t1gp!tSghpvjkAO6t)QuS}F0e1(^tfiI zi{@-dkHn17q-y9hsuhhNQ!Pu2n}-}zLaFH0P2D;uaJDrcN;YY}8Ab85P14%>qcgO& z^~1WUjV2@0T6{vCHmIj=I2u-sNj0wXXScJ=n$r^kJ-(FVmKwJv)Y&oe)PNS(7Y37N z*wUjWElv)r39WxFs)vcDKkovwyQ;V0@bYMu%SgX(-Ii)*W%7yRY{kxk{lFwU&gFC-j@UZDpsYhifEB&Uo2)^5SX|V ztURGJ>yoEg17S7Vy_y%VA8>|^e~0>ar;Fa z)cN(euOMkBhi?UK2q*~Rbp<=nD&Y+UZ{m`I$1tqmEnJfDwt{zXS;7@^m*377Bx|AY z3IXM)X=?F)Lro;K1k=7N;XMWK;{ydB;v)$kuZe_0@){)WlJLoz0Cr3GRKaJsv?i22 z?3d3ae4*efu1WY(!B_ZN!8g1u-*R!Ci|=q*!T0z2!VC{P?`d0+r#YX{owN-=wzX zb!m1E!Kb5!L&a#+>NAY!d2Pnon0|t>bIU3oJsgQyl$F_SHw&*>&OJEm5jdHbF6+hj zZcwpN#?7aKehzSf9U*+Kyz93ik^5~?VBTM8;rQa8*JOz4K{I{r-%dYHl+dpTl#NiU zj`I_$*U^6v?UX`vP-}{2lv2Guu!NF8@D@q~?YAI)qplKkQdx&GDyyiJsjNl~6oja! z*)gMEKf37?0oXK@nox_0N{C=5cDXdeWM4vK4T0Yw0>Ko@QYh!Tg6b5cn>6O|RgeW^ zFh{*(<8d@#H}=rDz=PQ9B40xV%4u#dfmM!BQ8gN9C(zrFrvl8@v4rXrl>KGYyY4DB za$jRvpu-`)f%3+(Wp-z^8wqg}t+yUqu-R6!+u`t(^pcW?NI^O2*oXb3Q>NASP^*+| zn$SzFG8#XCgRagisI)!FI%`ju(li@S|Fr?Y(tcTs1SmuhV9HxvIB zV%}Q4HW6{dh`V)-4smb^_hb>v_JQaj;@*ry*yNEm z5$R!@wB9A9FU%Nnsb-0Y4`Gm~n#lR3e_(S7uA!PYB87Wza!q6RIiK%Op*eTWL-ga^ z5j5av#`z3-^g*IOLS%x*A9YE4sbTWsT0=Ii7)7>mk;B^W>HwW5nY-z))~P7$Ie+zT-RRW+0)%x${{R30 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..f26a31045fad12c2a39ce0af3924e6f1d4792e92 GIT binary patch literal 2040 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 a;3nq0X%z^0n`GRfrfLC$bj(xjL*f@(YTLE| literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/TokenDatatype.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/TokenDatatype.class new file mode 100644 index 0000000000000000000000000000000000000000..e413c9930da954e5e7846483e18641c82f9f7ec7 GIT binary patch literal 726 zcmb7C%TB{E5S(obp`}pX?*k{)f*{9p86fjr9JQe~h23R7D?kTO@J|SPNwFrfVIhBM;q_k`f zx@~DsL_6WiOk`q_w1ib2XT^d$Q++}h#ikp&GoegR>b@D+ScX<6;!1Zy)$JwWiMf#a zKse#9d$LX#kF69=wnQ>u?PfJP7ndST1ot01t8}Lx8QXc+IL(+L6BGkwbi-&TuUx(M ziF(vNm$75{eBW9B%HLE8xyzVP{i`~mbexWJs8SQY%(3I;%NW6EfaNk)uu9nemlK4Y z-};Akyje%s{TrcaY?r;dk?ccJzX8I=4_1G+FmoU4$n&q_pByh95rlxVkazNx&3n*Y zdOXI_AN#f<$8wgJFwTe=PjK|)2Jd;_xAlPBEhjmAkb{)$@AX1Mvd<<_$poh`%?$po HDRcG}>G{4T literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..e2cfb0765756eb29018fe74ee7b0c378159fdfa3 GIT binary patch literal 858 zcmbu7OG^S_6o%j9wIhJ2x)=_X3mB4yywDve!YJH*ujQ|1QsUM>)d(!IL1E(Xajx@y3x~(d+ zXH>5(IqV5bmwLl?PYuIlqQq7*6L>~y6m0>QI^GIZ(G z%8^(&0ksJSk@XYX5VWSh@rCm4RQzSt?K|-xGDsqo#%cy@SSQr}aXP|o6dm3*SeCFK z#Y|e0kTu1<4CM%w(%&zPBI5k(c~6{Qz5obm_V(D4m)U#+y|5F*6n{0gU?9Pz)9htN zMVz1E$ctwKfvrFw7JuUWi1x(6@*x=;lUd{f@{q09C0Thz?D+?*`EX%WFou(u!@S=x I@7FJU1720&I{*Lx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a0ab4dcf58f3b6d448051421b326ba3a172ed7fe GIT binary patch literal 274 zcmbV{JqiLr4256(TV1#C02UV3j#gr;AXq5~_Hhk5GS15EtmxG&Jb;H1XScU8f$$z7 z-y`qO^95jxBtjG+CdAvUaH%Y{5kh~*MjzN`Zo}S-v-3imgSgR|Z%pWHAJ(75>oh`_ zFiW$G@+a2WRcu~iloP{udsO;zHR=a#I3a+LtgIEcFr4R-6MAKaG8~TA`?I8;F#R(C agMhDvKg+6zMsN)@E8ht-4tqi?sP-4*mQG6m literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$NoteChoicesFunction.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder$NoteChoicesFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..70cf52b7c197128178e0caf35aefa0cae6f26d0f GIT binary patch literal 2012 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValueDataDerivType.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValueDataDerivType.class new file mode 100644 index 0000000000000000000000000000000000000000..a6d68a25525dc8183ab9a9d775e3595f18116cb2 GIT binary patch literal 2584 zcma)8ZBrXn6n<{rwj^7q!Ggh7O4S+?AW|t7(ia89qJh?eRK_n|k{#HZ>}EDMvE`rm z2mFjP0xC0|`iU9+Pma&sT|$uH@*#U)_MGRQ=Q-!x>|g)<@fyI#_%4YwW_l3CtcGHe z>Wv5n<+lJ-TO}pVV-LlzswQBWh;fW!o z>DtR?&7o(qrTo^6%_^O*mR=YwqtKLAweZMjY)iFGqr^SSw&VkWo7s?1M%M*m^G=0e zeI?5_SDLj=(+%L$C8umu*A3TFxWQ&jZd(n3snEDRf{OEk=~}HdD!|BMWvBj1U@|)z z>i=KY9wnrQCGdAP)Sbs$^l;ojzqzJWt(a~x)G@Fx`r1|vrf^ldmc3Q%u4QnL<=FF% zEzOs*7|!iH-&zTbT+)J1dqzyydq-C)nf77iL-V9F6U<$-)$P9-i~lB@<5Pv^_~xRQp~m5uH_? z+A`&Fas)h?I*)E;;5K4@3xR3~7t+a2&&(xQqw z%6bvF)x~+VBf$14(R!2Sce|LMweAWq6PBALyX@Evt07I>E94HHRc$ZX4QbeAmg@Zr zT-@h^6>)?AqiO#4swc~uvxuroZ)AaSjPu8`g}}Rj#6!=Z0^2dJmb%IH2mA{evpNRg1!TcLUshHB>XT)>6 zzv0SmKDUpzPUsAH5IF{sXK9R))C5amvLn4C?a)T>38uWz?qE7NvcOTL*Aw~#*3avm Qj=aVL7=ce|9>Lvz0h*h+`v3p{ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValuePattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/impl/ValuePattern.class new file mode 100644 index 0000000000000000000000000000000000000000..da23bd7a7163ac0c46bee33e342c2d26202d8203 GIT binary patch literal 2480 zcmb7GTXWk)6#mwi$g!0;aW1rk)NLuPFG-wI?nw)2oU{hhmZlgA%yibu5-TW@k=B{? zAMh8-JHrEgfSEQWbf&;7KZ@b3B)e(ismx@gJ=)##o$p+ofByaB8GuE6lg2xEHw_K% zrIE$^!z6v6UQ6m=S;J+uUdiA?e3Zcou4b@`s)n@`*3-~&O~ZADxYOKb$kn&`F0WYJ z-m2VeZVN*$F~l|{L%!~~TNPJWe2>mHx#aSGTU4r{K-Y$rP1}@L7~U#G+&ylj*kDMk zI-7zaTQ_ZSqqEZ#?j7E=XeU>93~n{JYpU;XGa*~1$FNX0oSlknanorF+jBauA$ly$ zowikJaH}J3aVdps6U&UpceN z;Yru@;VE<5g<2$1wbQmtgG;d@Nwe9JqADa6CB-IEcg1SAcvHwAiiTrLu}4{8HLCSZ zzR9p03Gov1Dz?f1Ln#ub$Alrhwx^1L0!$IeYzf)zABHo9Vno|8q)5ZBXNF0--ltd7 z8-5F{o2qff57+*Jx~-w6<70fHqmEB?OyY))942&(VO+;e+@hBFKMkehGu+m&q2mrd z*U-@M1*SB7spBrFUoJ;s9V&^2=~!GvrWYb|(v#ek_f+z@X?yo}RWB>rUo*@{VQ)~$ z*jr)yGK?LK7KO9Ly;d-F;)Nm=MwT#}G=8r4_LGHLO`RkPHPwwO0jn1GD0>qxB*5QP zLr{F*;T9cF6^^GzjgZ-wj!}kTHJ`#9U+9C;A9W!r7-1N~(LjahkCo6)WkBt2M-xkf zdtH`Sqle4kI_y7LUIrIHfk|Nd}wA0}RLU z09xW_B;pSVC*U@XB*|mMY@Ar-$iE5lZqnyB9oXyft6~0&DldpsUA`a zZ{WOtegOr#uae{tJr(@?%rEo?IRO8Lk|&-*zndF*g3&*p(;fA5a+V@+j(k1u8!815 zJwtgEQSxE(C}Ym2n#VjANVh`32|CkhUBpF_6pae4DsD*?q@&&xeIt5sp=abxT>>>{1} +invalid_param_detail=invalid parameter: {0} +invalid_param=invalid parameter +invalid_params_detail=invalid parameters: {0} +invalid_params=invalid parameters +datatype_requires_parameter=datatype cannot be used without parameters +datatype_requires_parameter_detail=datatype cannot be used without parameters: {0} + +attribute_contains_attribute=\"attribute\" contains \"attribute\" +attribute_contains_element=\"attribute\" contains \"element\" +data_except_contains_attribute=\"except\" in \"data\" contains \"attribute\" +data_except_contains_element=\"except\" in \"data\" contains \"element\" +data_except_contains_empty=\"except\" in \"data\" contains \"empty\" +data_except_contains_group=\"except\" in \"data\" contains \"group\" +data_except_contains_interleave=\"except\" in \"data\" contains \"interleave\" +data_except_contains_list=\"except\" in \"data\" contains \"list\" +data_except_contains_one_or_more=\"except\" in \"data\" contains \"oneOrMore\" +data_except_contains_text=\"except\" in \"data\" contains \"text\" +list_contains_attribute=\"list\" contains \"attribute\" +list_contains_element=\"list\" contains \"element\" +list_contains_list=\"list\" contains \"list\" +list_contains_text=\"list\" contains \"text\" +one_or_more_contains_group_contains_attribute=\"oneOrMore\" contains \"group\" contains \"attribute\" +one_or_more_contains_interleave_contains_attribute=\"oneOrMore\" contains \"interleave\" contains \"attribute\" +start_contains_attribute=\"start\" contains \"attribute\" +start_contains_data=\"start\" contains \"data\" +start_contains_empty=\"start\" contains \"empty\" +start_contains_group=\"start\" contains \"group\" +start_contains_interleave=\"start\" contains \"interleave\" +start_contains_list=\"start\" contains \"list\" +start_contains_one_or_more=\"start\" contains \"oneOrMore\" +start_contains_text=\"start\" contains \"text\" +start_contains_value=\"start\" contains \"value\" +duplicate_attribute=duplicate attribute +duplicate_attribute_detail=duplicate attribute {0} +interleave_element_overlap=overlapping element names in operands of \"interleave\" +list_contains_interleave=\"list\" contains \"interleave\" +interleave_text_overlap=both operands of \"interleave\" contain \"text\" +open_name_class_not_repeated=attribute using \"nsName\" or \"anyName\" must be in \"oneOrMore\" +xmlns_uri_attribute=attribute must not have namespace URI \"http://www.w3.org/2000/xmlns\" +xmlns_attribute=attribute must not be named \"xmlns\" + +# Validation errors +unknown_element=unknown element {0} +required_elements_missing=required elements missing +out_of_context_element=element {0} not allowed in this context +impossible_attribute_ignored=attribute {0} not allowed at this point; ignored +bad_attribute_value=bad value for attribute {0} +required_attributes_missing=required attributes missing +unfinished_element=unfinished element +text_not_allowed=text not allowed here +document_incomplete=document incompletely matched +string_not_allowed=bad character content for element +only_text_not_allowed=element cannot have content that consists only of text +schema_allows_nothing=schema does not allow anything: it is equivalent to + +# ID correctness errors +id_element_name_class=an \"element\" pattern containing an \"attribute\" pattern with a non-null ID-type must have a name class that contains only \"choice\" and \"name\" elements +id_attribute_name_class=an \"attribute\" pattern with a non-null ID-type must have a name class that is a single name +id_parent=a \"data\" or \"value\" pattern with non-null ID-type must occur as the child of an \"attribute\" pattern +id_type_conflict=conflicting ID-types for attribute {1} of element {0} + +# ID soundness errors +id_no_tokens=value of attribute of type ID contained no tokens +id_multiple_tokens=value of attribute of type ID contained multiple tokens +idref_no_tokens=value of attribute of type IDREF contained no tokens +idref_multiple_tokens=value of attribute of type IDREF contained multiple tokens +idrefs_no_tokens=value of attribute of type IDREFS contained no tokens +missing_id=IDREF \"{0}\" without matching ID +duplicate_id=ID \"{0}\" has already been defined +first_id=first occurrence of ID \"{0}\" + +# Fragments +name_absent_namespace=\"{0}\" +name_with_namespace=\"{1}\" from namespace \"{0}\" \ No newline at end of file diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Annotations.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Annotations.class new file mode 100644 index 0000000000000000000000000000000000000000..e5e97d41dd78a38901675da61019b95a0cf9bf6d GIT binary patch literal 572 zcmbV}!A=4(6h&`wWOPJ@zre&;T@x2*aMeT;68ELkU`eN)Ogn^cbKwX0QN}l@fNaLN zYVK{{dGFo6f4sf{xW*vGS&DOpp3L)cjFp+yQ8O%uVj-83Tj}O}O17Ji{^=-R@c1H) zFSQH4u9W7LwsJ+_QdU88;gyWWyV1onLpE6{T{beL=#!?oCRP{PMTXm{p~xT}rLH_3Gw7&`R7K$0*VAR&F&C_203q&V7hj*;y-C%+xK?Gd4a(@)O-sW-5Qg7vo2JIp`qd9V(OX-==vnb#(NhsoDF|NHxU?(jrlg7bvlJ9TL63qz zN}SymtI&&=*_qjy=bfGX{Car}yycgH*kQ=-N+shxhDvp8MXkkUfyU#2wjZ*lzk^*NZz`hCQMBVG{Ymi$uWhXo4P(`oh~!WN>wG=Zjt}Lq)^n+9GZY z<}FuiW9MOTP7Ui&>IvrlGB))iT{u`~SRFn1C<%h&P^wr&KXL?8lwLFY(Jd=3a+qN7 z{y8_p;z;QvQL*fbUn=RUUSaX~c2DC-s`gH;g?0KWn|_g2sl~}lk?&xVtV_`a(v$%z z^=Gh+59D8wI-gBHBlBM0c!Kp{I`U*ou*h1-5HUwg%_|de%G?eEZ{B kNea#XDy(arC7)b91_qD505G4S1E07{)b<`#K(mMb6DYe__W%F@ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Context.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Context.class new file mode 100644 index 0000000000000000000000000000000000000000..c4c7aa8405d26b51572c47a583aa0b4235dbb5f1 GIT binary patch literal 283 zcma)%O=~4O*x6?p%qrkQa9a{{ne%aZk-T@SABkF5T^IuA&f6yIab2* wb0=jcOhVe;up7>t4^hmToz+5LzOuRmLQA8q##dP`VagOpnd=!g>XY@ z5g?`Nfs;LJ&+M!-$4 zL&srWULc%xs|DRN6cYDR$wb+edMVz{_(2A2tr$gkT0?EqN!InbFcT79)^PJV+ZU(0 z$N#zahh>JYlT-+YS8RFV@?w&tv6$m|CJCpNdH78wbXI}Bxf@Gl2|=Y$*?1YI27yp> mp9ZMc30tT;ygf&5ZMceurUQf){2wPRw7*x}e#h}@*!=(`Q7#hz literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Div.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Div.class new file mode 100644 index 0000000000000000000000000000000000000000..b542cfcb214cfc8f40ee494c50ee7182d3915b91 GIT binary patch literal 363 zcma)&v2MaZ5JYE*<0B>@J|YD)x%5;Z5*j25Br2NCaZ1jz@2s;yd|QfqKt3vBaY1W} z(e6ky+Nb^d|M>;*hLJ+1Fi?0Vq}Csn?nKy6)+Us?`DPa?>+5ig#_DJbKKn0SajdOg z2g8jEe%2kGdmoxMT+gOELiT<(wz`&Ug`xOud*H(rme3c1*PKsGc_X~);JE?Ceu ypSd*+L3cJ+k;{_fR^q~OPh)X(#o2&t5>S!OO*K|A{o=$$J|wjtAXNT<()(X7e2YKLoq6T)e!-gsuX1>IQd zLPt!vo=p37Jhp0zt?4wbnRmMHwPC{97UFiLO~L-6^-j3zHT)L=VZ4d&;bqBr%=EmM tZez42$XVj*EH+Zp4BEaHxt&g}O~; zS@u}}kKea{_uoGN9xyk!GME}%8{7~k;>(xFO~aA!wOF~(*!00wXvKG78=crFHShep zZ8>&gSHW?rg3pJgkKTuL5O?|AuzcP3FV~!sM4v0#^Ug`z-_;q+v@Q-j%c>T_^dI_u z!=Fr8400bs&U=TgSrfg!ZNw#lJ=I;PTzLq$gO0-K6Q0ugXVX=2y*X&Zsx}ve`lCMk%)4T0*>544CjF4naZMvL` zrWNb^v~g1L&7Mum&Wrh_tP%nU@xfYg+lsvxPndt%reX~pPo>@?m_NZ-Dt4gnd~2u; Rbt8;>AL@*BPnf8hegIlLL-zmx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection$Combine.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection$Combine.class new file mode 100644 index 0000000000000000000000000000000000000000..c6496f8d14840bda96e31d80f65baefa51c0e547 GIT binary patch literal 946 zcmbVKU279T6g{)q>?YgQ*3_!?vucGj1-HQmk%}*osu1)c()YN zKKKLtQR121&?5CEW#HbqGxwai=g$58=jSf~J9rYo$K42R-0O08Kg33ehXTHlxf1A& z59Mc>WYQcYlgesyuqzO})J9jY1lIZ&uebII9u=PmULI?s-XG^vWk1SkR?`)!%=V?# zE}kFy)l8QH;i$-`1PH|Mj8S%!$+A?ucri|kJgH_<7e~sJ#j#CQVpS$jSk#fUrAppd zndj0@R9fl6Y|fcjYNslivIVa9w=Py2;*kIZ-u_3)!p{zOop|qL$C;tPvr8}tbSGa- zHB*&N1)@osr#829dw;}93wy&VpHJxCEF#ia{k#LriW~%z;IDA>TdO2 zACd);7;^sF97;}|)52W~p3}#Zh|wM+k3Jfl!W(S=K zSFpl}xSCbq8dq=5nb30p&>nn8>nk@6T~Hq`)iiOFa7NR?8nawMuj$>h!C?Co;=Gs! r-LBCaO~x5IU|C_!7~m#ukzt(-?%mt9y@O@?9%CO5C~F<7^g!n?&~Do} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/GrammarSection.class new file mode 100644 index 0000000000000000000000000000000000000000..7681023c5081882b52c4b87017ef44e426dedb4b GIT binary patch literal 1440 zcmb_c?M@Rx6g>l_TS}p|h+4muDyqCN0GMv9tHiIcM(NIkP{0efthz5z88KG34W5cruO&JdI&qjn6bJ z#GuEaVNt~e4bL^a(D0Ihu!)M4!YkR__l3`(m0YK3Nx?8xs(oCmRLh@A8?{QQ%&=^j zuA>Kg+;ZDO`fkTFh3*NPAIM$3%{^b}>mGL;?$w1ESgy?Ww2BPrQ?W|5QQk7jtJ@?v zR&T6sHE7b<=UuMboOJ4eXUSb+L|fu>SjW%Y-_w__WH514ZKSoygFtw)I2doZCRdvs z0=g=t8-!rLnBQiImk&(QR%BnpE9yhwwhhr0_8E}jZEkQ4CpDLC;RqR=k;6rjr=oNi zYMP-igkleDSbh+yXb%4(-dkOUTrNMjAVSg+PAF1Ens%o}ewrVK*h3RJwqn|rw1RgG zqdC>BNXb<)NrPNb?Kn;0HF(peOuQai@q?v;>GKv`P|jjlx}$s4xdT}n@@Ose0%#GCa4?gfhXCV{J%VbCvF#5vtsbDu619o_{+vV~z5Uh7zP z>yI0$`juYmH~z=vD})xB`G-_~J4!Y|f_`A5$f)+xS4K589I0(IMk5T@aGm~DHz`BWq3sIDJm35ViGATA&n6{rg#K%ltUO#(uUMxYGWy6egkbYoiG3Z literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IllegalSchemaException.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IllegalSchemaException.class new file mode 100644 index 0000000000000000000000000000000000000000..a6bf703a155bad86c0179a712ff7ab5385772286 GIT binary patch literal 360 zcmbVIJxjzu5Pg%&hsNlMmR5FZ;o6BPHliQ|o0IG3*5$IY$%ai%?r&KM7XAQ#lsE}u zW#tS!<~?TS4fFZ+{sG_&yE!J<&ajhVN=UD4WBY5uns3+I zw7vDsB_W@U?RR!CIrzKn^qF6{K#YWN{!c5y{;)+kmYaSLz#$^}#t}$Q5FryxMTQJ)2o__VU=z78!j@o!;u{nlTbuv@ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Include.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Include.class new file mode 100644 index 0000000000000000000000000000000000000000..f2f14504500a8758b81b58e6d8eaf20bcdff2fef GIT binary patch literal 474 zcma)3u};G<6g-y_Ln+YDC<|s|$OICgN|8E5Vt+VR>dLVr$3Y$WE(Sh;k3zgwC@e@} zc*C9Uba#56U+*6PZm^IzlbB1K3(SnKR$jZlG6HYQVoR^29Qj(6DOz9We=s^UDs9My z*7z>;Q5zMFqaB-Cik(qK(3EWOc`+)z^FE}5xXZ7exzEE+n|5#RBrYT_nJNz%kJfR; z`A^yFeNlnsXuvRT@jGq(vNbvhs8RP*q^6-*vYadZ$8q0VR}CWsZbvg#&Y7BAsW+yf f!I=pNO!$uYXJRTa#WACdQO3N)38Pa+6U@E=xqp{u literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IncludedGrammar.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/IncludedGrammar.class new file mode 100644 index 0000000000000000000000000000000000000000..a1664009f1417199468711f063649365cc9a6110 GIT binary patch literal 492 zcma)3+e!m55Is}ZM(eE!fV$XYo4NN8Wjoe*GnB5nO;>LTI;*e zM{Q-aPHp{*Y*p;6Tn4RD9ekOG-gzI=4&0SDdH8D3H!GErjlLvI9=6)H!&{xe1^3m? z&tvT@;d0OX?MA&R!aVDLk4KmeOz9L)_`Kd&od`0k^1HH%;p~ram1R_#SNb36`@VMO fZ}c&NFyc5s!T(4F;SgiK6WkS?kN6yOJ;LM%$(o;5 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Location.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Location.class new file mode 100644 index 0000000000000000000000000000000000000000..10dda5f569df5fd4ea3ea56a57b73bbbd7a62748 GIT binary patch literal 130 zcmX^0Z`VEs1_lELc6J6LEThMy3DTpHRi^FnGSl*K-PiotecD9Ty0b zr%rMklr=twv!ttjsF~7?aMgPjELrW?O}Dfogz4Z4e_RNcd!NvhR(xG;Sq6l=K}Ho< oJ;oti|2}2)u>6^LjDRpoagbhu8A1k!NsW`rQqEHxrFsO%-vXbE7XSbN literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Parseable.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Parseable.class new file mode 100644 index 0000000000000000000000000000000000000000..e8a0e3605c05508a67cea17d24706d001215bf7f GIT binary patch literal 478 zcma)(O-{o=427TjlPLw-9s^h~>{w)n1QHSwm2v`SYPG4RNi>V4IW$7}ym@og!NwgIRV`&xwZVxE;`vx^ZD+EX z+sT2S+QM%nr04jxReC#YT%R&*)*PdRG9}EPk51}XRApnZFj#6S>k_>bUc)XrfO9YR zd;Va;-C*{fAgoS|^{jKf=X-JS96oFFu0kjWy}75!#$Z02qS%C Xy&Fvk6HHYlsuHam%v4>d8e#qinO&KM literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..e4dcbe8622a9484025b9b88bf74634ef541a8173 GIT binary patch literal 160 zcmX^0Z`VEs1_lELc6J6NV6xW>8+|;}h$Gp7! zlEjkC{5-v^#Ii(228-nUT>X-a#LWDH)VyM_KK-K9oWzQ}bo~O5PJJBu85smXCg|rR d0#*7aWu+#U0IgNV6u-pWROg(;;$pq5 z#Ii(227~1MT>X-a#LWDH)VyM_di|o*oWzQ}bo~O54t+Fzj0^%Go%%V6Ko$N;S*gh- VK&u!Tn1FVJ03!o4kYr+D0RWIdC|v*m literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedPattern.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/ParsedPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..b66796181bae73c29dde53fd00304ac44f13e466 GIT binary patch literal 140 zcmX^0Z`VEs1_lELc6J6NVlz_yNlGLI+y{yEt zL`DX^$ce(f;fh@GPY$p70>3v19&KLsvx)$7a@7@ zzT}bn<9Y)yMmIn!K%3AD#ckQ~th2{^V^C2o?VofNF#)YF^j9Dtp6M;O7dOPr0{XLjV8( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/SchemaBuilder.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/SchemaBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..9f573d948b09a82dff1a177f4a5a38a6a8197e23 GIT binary patch literal 5547 zcmd5=&2Jk;6#q>UY&Uh9VrZdID6|wDKH^de1sn>l>!t?B39*SpIiSgAnrvC`TD$Aw z{sRaJA#vb{1pfl!fYb^q#Ely#{tB+#K)e~RzjiI{#F4FB_U*o%kKg;fH*em|AOGF^ z6~G02l*9)qROZ33b_5Thn#6h%8w~U1>W$K7x&CRj#*nGp=686`;`VN?=DVi7o2M2H z{+TH5Ii?{Pe#w4PF`P!u-{Yp!6t?HITtnnsVevL~YI4^TxefW;+2Fn}TsvQm?@)0J z?wgLCk8fJAZO2!Qz5G&q^I<4tOsQ>%rku-5;zNdG(zvosKrO-Vkby^}V%2q8O@;;e zzHW-~H@G=T(Yi3*Q1n;Fr)4$8` zl?DM*HmK_O1CBQP8p0+vPRg%q+~>iXyxKCY9pN&3k&UkS5t`T)-*dXgl8oY@B%_wy7PngDtAF)C zMN(Bf|3!yZdfU$*$i(<*4w$2q?^a#jXmD~-T_bX92IXR%bQp|Egr|5XkrLnEXw0zR zNIxJ2-)ckJ&vG3LRDS}>DqYeFw`j*;_)Z&UcQcF+o(|K&((NPG@$Rsb7=F-(*Eezs z0Q-|Mq$#z?92F2ciBK$dW{^AEI3!Lc6vqNJNZg`I@NHRPacfiDV)#ohZN}#EPBMv) zgI>;$Z`u#zF^aY%HW_}?uRHrJ9fHcU4<;y2q=MmhJztHn#ZB5Pg9fRSLDlP+^!+H4 zVuNj(aQ_?&VJE5f&5n=uY1*V}g@S#zJ-5ykXm^VYDDpO0mT-S9Er0+ghxcwy3rm+rq8$ZHqMXHFW`W-IO1hnz1JuJYa2E zMgbWe4h9Vjy2r@)BMT?@t%?eTvf7&Yvj`uO1MsQuS#!YmY%@EeXx%+Ge2YYC(Qjw T3Wgi>OppYT!%!wUgZKXjKgdRz literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Scope.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/Scope.class new file mode 100644 index 0000000000000000000000000000000000000000..bf11c18c5ec9b73dc1d1c472be50e3f923ad25b2 GIT binary patch literal 412 zcma)&K~4iP3`M_7X<(odr$DeF>}LfMtVW_@PGC|~Ql`l$Nl`DuMObhE4uwc&0qSa4 zMgDqrp8fUx@d@A>bA?LbgfQRmt1LK(OONtQc)w`Y{KmRtx6*A2)~)Ks_>E34Y<({- z`fV_xgLJ&hNY5dPZoJ`Sz554xDD6T-M;TdAdyx=s|~dA{25BMZ$Y6|u9KNu!l4a^bd| z6{Rv&QCq2mRhk=5>C_^YTb1)|o#{l`Kk&cSCHI!|oNaW`zhd2ojFsxxck>QL# zo=fVPQQb<*cX85dPo(n-I^)S)HfB%g>D;7Y<{h14mXXn?NODrQ@cUd3>|T6dB_S%4 zPg0_SCFvsE6sX-(Nn_GZ=ghnhZz<3md-R&gOhH`nQ}9ubFPGQi_@cN}kELg`y7e?B zt14J&1Q1Jmm^40I26jnN(-6UkhV9s)VJCvDV#_TnL)T1OpVH8U6B^#eJ96T? z8usEn1x=4BzJhsQ!v})?P)42jNW;hYM8kD_%5-$A4ptcVQ zpRz0Rk6*KmIZ#s>s4O|;I%Fv} z=U{<(SC*rCMgP#kYmfR`!0XG6I6PtHt~##|S@M!Li!jR+i&ss-bU(d8N65|vLRDUH z1v{OI%~`)spLE@EnpLb{&$7bpD3@1!r!5ey*uppCRw&rUXQ*FFA78V6sebG?NJcw7 zQ<=SwxCo+bckycs9#pYk6`Fw(3g3k%6uFD4pE>10jIEzXg3nYh530jP)T5aXWni|-xtE~3W4x6Z;l7Wx&Qd#ILf8Z}||RWtBKrcryFP*-dX zw*#$ZqFPI$TJbFQ7uP#*fIAKnTf;tpL!9r#;iA~!VMjcunXLJqR)2NS!@8bjqtNJ4Mv6h3H z{#mRZi_V~78vZ^`tmu#4N7F3Uj76$vuvW}{4~_i+Z{IA|jYWuTiidB?lGG3G}*>+5`E}# zEO3f3-UJQZbW9bIbzJMA9`)S69j7QM$b9K_R;#&k8fVC(kGMEnapfrbog9+5@^U6X z3-c;2+T=ESNs1G9urW@hn~yYmZlXg*M_V`whFYf4(%gW*Z$WKoz=NA;;Map&sOJ|a zeRr@a9%?2iJRfW!$^aR79VY!`JHWq#gS5<9wBQ_VFhq?eIBb5Pf@moZ=yfUubQi795q0hL~Jp0wG#J=!bKK#buA|9R`1vm5GHvz`x*s zG0q)W&=HHBH#0l)-t6qx&&MZ#CQeJp;n2mgi@HE=B#nS*3lyG|jT3=pH;kr!GA0$x zq=}=s4W)0TriB^#GqSPtxnM?N;`gIxX|9=s>_{MQ2m`I>lf55tKJc{^ACfgc5Pj=7N#nXCgz)`UAVA`_IO0$t0R<_j2ob>{Rc|0|+*RVnu_Jqn%7Om` z5&?+=KY$;Fn6;e}r-!ChwAt~@yf?FN$Nuy8*KYtVtd~&0s(~WzDC@5JyJw(|`$aq` z;vqvWk|9I2v(GIuZ$2^RL zO$lS}NP8z33ZH-lIdG$Ti{Z)Q*mlCv{p?GANE{_)4TN+Z;(O-$uH0hy(l{&O@$)Ut zlpL$M%b>S|J;6}!xW0IIFzShLhxa`4R6BvgyN$1lN(P1%6_a8w(Urk`YxVwfBF3>%bm;@wWuslXDUV=WjSF9Mw( z3!@tk&$b&YmO0ELHGU>cte7aHVPXj-69$%xXqvFF#_;OIR;Tqc%vqTjD*p%leQ#el zlIFaj?soHR{B)lqJ`_`#7(Se0M$^eU#Vyb~U7)ua$f2r4BCD!&ig%I^4ClxObXsLp z==nTZAECvbnzc3ovwlLe)+fkW8x!c?D6SEUVp6E*#JWW+FK_`bX#uNL4XDxYGVRJz zm9^MXwN>;AuBNqY+8KHB)_3H-l97-XVrM%hG?RoQ!fUur9@Xe3Wh<~rU`9*-f&4tj p>lqI7h~oxsrW~^k==0#WGvIs*)^ICs^ENKgZV*j@K9Ltu`3HL6TXX;b literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.class new file mode 100644 index 0000000000000000000000000000000000000000..786a1a4fcb1b7bcc7c2b0953750310fcd9a25881 GIT binary patch literal 74268 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 QN+kJ@{Kk4O@)ouHKXf*STmS$7 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj new file mode 100644 index 0000000..c00bc06 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj @@ -0,0 +1,1933 @@ +options { + STATIC = false; + UNICODE_INPUT = true; + JAVA_UNICODE_ESCAPE = true; +} + +PARSER_BEGIN(CompactSyntax) + +package com.thaiopensource.relaxng.parse.compact; + +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.Context; + +import com.thaiopensource.xml.util.WellKnownNamespaces; + +import com.thaiopensource.util.Localizer; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.Locator; +import org.xml.sax.helpers.LocatorImpl; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; + +public class CompactSyntax implements Context { + private static final int IN_ELEMENT = 0; + private static final int IN_ATTRIBUTE = 1; + private static final int IN_ANY_NAME = 2; + private static final int IN_NS_NAME = 4; + + private String defaultNamespace = SchemaBuilder.INHERIT_NS; + private String compatibilityPrefix = null; + private SchemaBuilder sb; + private String sourceUri; + private ErrorHandler eh; + private final Hashtable namespaceTable = new Hashtable(); + private final Hashtable datatypesTable = new Hashtable(); + private boolean hadError = false; + private static final Localizer localizer = new Localizer(CompactSyntax.class); + private final Hashtable attributeNameTable = new Hashtable(); + private boolean annotationsIncludeElements = false; + + final class LocatedString { + private final String str; + private final Token tok; + + LocatedString(String str, Token tok) { + this.str = str; + this.tok = tok; + } + + String getString() { + return str; + } + + Location getLocation() { + return makeLocation(tok); + } + + Token getToken() { + return tok; + } + + } + + public CompactSyntax(Reader r, String sourceUri, SchemaBuilder sb, ErrorHandler eh) { + this(r); + this.sourceUri = sourceUri; + this.sb = sb; + this.eh = eh; + // this causes the root pattern to have non-null annotations + // which is useful because it gives a context to trang + this.topLevelComments = sb.makeCommentList(); + } + + ParsedPattern parse(Scope scope) throws IllegalSchemaException { + try { + ParsedPattern p = Input(scope); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + ParsedPattern parseInclude(IncludedGrammar g) throws IllegalSchemaException { + try { + ParsedPattern p = IncludedGrammar(g); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + private void checkNsName(int context, LocatedString ns) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_ns_name", ns.getToken()); + } + + private void checkAnyName(int context, Token t) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_any_name", t); + if ((context & IN_ANY_NAME) != 0) + error("any_name_except_contains_any_name", t); + } + + private void error(String key, Token tok) { + doError(localizer.message(key), tok); + } + + private void error(String key, String arg, Token tok) { + doError(localizer.message(key, arg), tok); + } + + private void error(String key, String arg1, String arg2, Token tok) { + doError(localizer.message(key, arg1, arg2), tok); + } + + private void doError(String message, Token tok) { + hadError = true; + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(tok.beginLine); + loc.setColumnNumber(tok.beginColumn); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(message, loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private void reportEscapeSyntaxException(EscapeSyntaxException e) { + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(e.getLineNumber()); + loc.setColumnNumber(e.getColumnNumber()); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(localizer.message(e.getKey()), loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private static String unquote(String s) { + if (s.length() >= 6 && s.charAt(0) == s.charAt(1)) { + s = s.replace('\u0000', '\n'); + return s.substring(3, s.length() - 3); + } + else + return s.substring(1, s.length() - 1); + } + + Location makeLocation(Token t) { + return sb.makeLocation(sourceUri, t.beginLine, t.beginColumn); + } + + private static ParsedPattern[] addPattern(ParsedPattern[] patterns, int i, ParsedPattern p) { + if (i >= patterns.length) { + ParsedPattern[] oldPatterns = patterns; + patterns = new ParsedPattern[oldPatterns.length*2]; + System.arraycopy(oldPatterns, 0, patterns, 0, oldPatterns.length); + } + patterns[i] = p; + return patterns; + } + + String getCompatibilityPrefix() { + if (compatibilityPrefix == null) { + compatibilityPrefix = "a"; + while (namespaceTable.get(compatibilityPrefix) != null) + compatibilityPrefix = compatibilityPrefix + "a"; + } + return compatibilityPrefix; + } + + public String resolveNamespacePrefix(String prefix) { + String result = (String)namespaceTable.get(prefix); + if (result.length() == 0) + return null; + return result; + } + + public Enumeration prefixes() { + return namespaceTable.keys(); + } + + public String getBaseUri() { + return sourceUri; + } + + public boolean isUnparsedEntity(String entityName) { + return false; + } + + public boolean isNotation(String notationName) { + return false; + } + + public Context copy() { + return this; + } + + private Context getContext() { + return this; + } + + private CommentList getComments() { + return getComments(getTopLevelComments()); + } + + private CommentList topLevelComments; + + private CommentList getTopLevelComments() { + CommentList tem = topLevelComments; + topLevelComments = null; + return tem; + } + + private void noteTopLevelComments() { + topLevelComments = getComments(topLevelComments); + } + + private void topLevelComments(GrammarSection section) { + section.topLevelComment(getComments(null)); + } + + private Token lastCommentSourceToken = null; + + private CommentList getComments(CommentList comments) { + Token nextToken = getToken(1); + if (lastCommentSourceToken != nextToken) { + if (lastCommentSourceToken == null) + lastCommentSourceToken = token; + do { + lastCommentSourceToken = lastCommentSourceToken.next; + Token t = lastCommentSourceToken.specialToken; + if (t != null) { + while (t.specialToken != null) + t = t.specialToken; + if (comments == null) + comments = sb.makeCommentList(); + for (; t != null; t = t.next) { + String s = mungeComment(t.image); + Location loc = makeLocation(t); + if (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE) { + StringBuffer buf = new StringBuffer(s); + do { + t = t.next; + buf.append('\n'); + buf.append(mungeComment(t.image)); + } while (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE); + s = buf.toString(); + } + comments.addComment(s, loc); + } + } + } while (lastCommentSourceToken != nextToken); + } + return comments; + } + + private ParsedPattern afterComments(ParsedPattern p) { + CommentList comments = getComments(null); + if (comments == null) + return p; + return sb.commentAfter(p, comments); + } + + private ParsedNameClass afterComments(ParsedNameClass nc) { + CommentList comments = getComments(null); + if (comments == null) + return nc; + return sb.commentAfter(nc, comments); + } + + private static String mungeComment(String image) { + int i = image.indexOf('#') + 1; + while (i < image.length() && image.charAt(i) == '#') + i++; + if (i < image.length() && image.charAt(i) == ' ') + i++; + return image.substring(i); + } + + private Annotations getCommentsAsAnnotations() { + CommentList comments = getComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private Annotations addCommentsToChildAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + a = sb.makeAnnotations(null, getContext()); + a.addComment(comments); + return a; + } + + private Annotations addCommentsToLeadingAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + return sb.makeAnnotations(comments, getContext()); + a.addLeadingComment(comments); + return a; + } + + private Annotations getTopLevelCommentsAsAnnotations() { + CommentList comments = getTopLevelComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private void clearAttributeList() { + attributeNameTable.clear(); + } + + private void addAttribute(Annotations a, String ns, String localName, String prefix, String value, Token tok) { + String key = ns + "#" + localName; + if (attributeNameTable.get(key) != null) + error("duplicate_attribute", ns, localName, tok); + else { + attributeNameTable.put(key, key); + a.addAttribute(ns, localName, prefix, value, makeLocation(tok)); + } + } + + private void checkExcept(Token[] except) { + if (except[0] != null) + error("except_missing_parentheses", except[0]); + } + + private String lookupPrefix(String prefix, Token t) { + String ns = (String)namespaceTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return "#error"; + } + return ns; + } + private String lookupDatatype(String prefix, Token t) { + String ns = (String)datatypesTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return ""; // XXX + } + return ns; + } + private String resolve(String str) { + try { + return new URL(new URL(sourceUri), str).toString(); + } + catch (MalformedURLException e) { } + return str; + } +} + +PARSER_END(CompactSyntax) + +ParsedPattern Input(Scope scope) : +{ + ParsedPattern p; +} +{ + Preamble() + (LOOKAHEAD(TopLevelLookahead()) p = TopLevelGrammar(scope) + | p = Expr(true, scope, null, null) { p = afterComments(p); } ) + { return p; } +} + +void TopLevelLookahead() : +{} +{ + "[" + | Identifier() ("[" | "=" | "&=" | "|=") + | LookaheadGrammarKeyword() + | LookaheadBody() LookaheadAfterAnnotations() + | LookaheadDocumentation() (LookaheadBody())? LookaheadAfterAnnotations() +} + +void LookaheadAfterAnnotations() : +{} +{ + Identifier() ("=" | "&=" | "|=") + | LookaheadGrammarKeyword() +} + +void LookaheadGrammarKeyword() : +{} +{ + "start" | "div" | "include" +} + +void LookaheadDocumentation() : +{} +{ + (( | ) ()*)+ +} + +void LookaheadBody() : +{} +{ + "[" + ( | UnprefixedName() | "=" | | "~" | LookaheadBody() )* + "]" +} + +ParsedPattern IncludedGrammar(IncludedGrammar g) : +{ + Annotations a; + ParsedPattern p; +} +{ + Preamble() + (LOOKAHEAD(TopLevelLookahead()) a = GrammarBody(g, g, getTopLevelCommentsAsAnnotations()) + | a = Annotations() "grammar" "{" a = GrammarBody(g, g, a) { topLevelComments(g); } "}") + { p = afterComments(g.endIncludedGrammar(sb.makeLocation(sourceUri, 1, 1), a)); } + + { return p; } +} + +ParsedPattern TopLevelGrammar(Scope scope) : +{ + Annotations a = getTopLevelCommentsAsAnnotations(); + Grammar g; + ParsedPattern p; +} +{ + { g = sb.makeGrammar(scope); } + a = GrammarBody(g, g, a) + { p = afterComments(g.endGrammar(sb.makeLocation(sourceUri, 1, 1), a)); } + + { return p; } +} + +void Preamble() : +{} +{ + (NamespaceDecl() | DatatypesDecl())* + { + namespaceTable.put("xml", WellKnownNamespaces.XML); + if (datatypesTable.get("xsd") == null) + datatypesTable.put("xsd", WellKnownNamespaces.XML_SCHEMA_DATATYPES); + } +} + +void NamespaceDecl() : +{ + LocatedString prefix = null; + boolean isDefault = false; + String namespaceName; +} +{ + { noteTopLevelComments(); } + (("namespace" prefix = UnprefixedName()) + | ("default" { isDefault = true; } + "namespace" (prefix = UnprefixedName())?)) + "=" + namespaceName = NamespaceName() + { + if (isDefault) + defaultNamespace = namespaceName; + if (prefix != null) { + if (prefix.getString().equals("xmlns")) + error("xmlns_prefix", prefix.getToken()); + else if (prefix.getString().equals("xml")) { + if (!namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_prefix_bad_uri", prefix.getToken()); + } + else if (namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_uri_bad_prefix", prefix.getToken()); + else { + if (namespaceName.equals(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS)) + compatibilityPrefix = prefix.getString(); + namespaceTable.put(prefix.getString(), namespaceName); + } + } + } +} + +String NamespaceName() : +{ + String r; +} +{ + (r = Literal() | "inherit" { r = SchemaBuilder.INHERIT_NS; }) + { return r; } +} + +void DatatypesDecl() : +{ + LocatedString prefix; + String uri; +} +{ + { noteTopLevelComments(); } + "datatypes" prefix = UnprefixedName() "=" uri = Literal() + { + datatypesTable.put(prefix.getString(), uri); + } +} + +ParsedPattern AnnotatedPrimaryExpr(boolean topLevel, Scope scope, Token[] except) : +{ + Annotations a; + ParsedPattern p; + ParsedElementAnnotation e; + Token t; +} +{ + a = Annotations() + p = PrimaryExpr(topLevel, scope, a, except) + ( t = e = AnnotationElement(false) { + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + })* + { return p; } +} + + +ParsedPattern PrimaryExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) : +{ + ParsedPattern p; +} +{ + (p = ElementExpr(scope, a) + | p = AttributeExpr(scope, a) + | p = GrammarExpr(scope, a) + | p = ExternalRefExpr(scope, a) + | p = ListExpr(scope, a) + | p = MixedExpr(scope, a) + | p = ParenExpr(topLevel, scope, a) + | p = IdentifierExpr(scope, a) + | p = ParentExpr(scope, a) + | p = DataExpr(topLevel, scope, a, except) + | p = ValueExpr(topLevel, a) + | p = TextExpr(a) + | p = EmptyExpr(a) + | p = NotAllowedExpr(a)) + { return p; } +} + +ParsedPattern EmptyExpr(Annotations a) : +{ + Token t; +} +{ + t = "empty" + { return sb.makeEmpty(makeLocation(t), a); } +} + +ParsedPattern TextExpr(Annotations a) : +{ + Token t; +} +{ + t = "text" + { return sb.makeText(makeLocation(t), a); } +} + +ParsedPattern NotAllowedExpr(Annotations a) : +{ + Token t; +} +{ + t = "notAllowed" + { return sb.makeNotAllowed(makeLocation(t), a); } +} + +ParsedPattern Expr(boolean topLevel, Scope scope, Token t, Annotations a) : +{ + ParsedPattern p; + ParsedPattern[] patterns = new ParsedPattern[2]; + int nPatterns = 1; + boolean[] hadOccur = new boolean[1]; + Token[] except = new Token[1]; +} +{ + p = UnaryExpr(topLevel, scope, hadOccur, except) + { patterns[0] = p; } + ( + { checkExcept(except); } + (t = "|" p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeChoice(patterns, nPatterns, makeLocation(t), a); } + | (t = "&" p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeInterleave(patterns, nPatterns, makeLocation(t), a); } + | (t = "," p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); } + )? + { + if (nPatterns == 1 && a != null) { + if (hadOccur[0]) + p = sb.annotate(p, a); + else + p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); + } + return p; + } +} + +ParsedPattern UnaryExpr(boolean topLevel, Scope scope, boolean[] hadOccur, Token[] except) : +{ + ParsedPattern p; + Token t; + ParsedElementAnnotation e; +} +{ + p = AnnotatedPrimaryExpr(topLevel, scope, except) + ( + { + if (hadOccur != null) hadOccur[0] = true; + p = afterComments(p); + } + (t = "+" { checkExcept(except); p = sb.makeOneOrMore(p, makeLocation(t), null); } + | t = "?" { checkExcept(except); p = sb.makeOptional(p, makeLocation(t), null); } + | t = "*" { checkExcept(except); p = sb.makeZeroOrMore(p, makeLocation(t), null); }) + ( t = e = AnnotationElement(false) { + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + } )* + )? + { return p; } +} + +ParsedPattern ElementExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedNameClass nc; + ParsedPattern p; +} +{ + t = "element" + nc = NameClass(IN_ELEMENT, null) + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeElement(nc, p, makeLocation(t), a); } +} + +ParsedPattern AttributeExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedNameClass nc; + ParsedPattern p; +} +{ + t = "attribute" + nc = NameClass(IN_ATTRIBUTE, null) + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeAttribute(nc, p, makeLocation(t), a); } +} + +ParsedNameClass NameClass(int context, Annotations[] pa) : +{ + Annotations a; + ParsedNameClass nc; +} +{ + a = Annotations() + (nc = PrimaryNameClass(context, a) nc = AnnotateAfter(nc) nc = NameClassAlternatives(context, nc, pa) + | nc = AnyNameExceptClass(context, a, pa) + | nc = NsNameExceptClass(context, a, pa)) + { return nc; } +} + +ParsedNameClass AnnotateAfter(ParsedNameClass nc) : +{ + ParsedElementAnnotation e; +} +{ + ( e = AnnotationElement(false) { nc = sb.annotateAfter(nc, e); })* + { return nc; } +} + +ParsedNameClass NameClassAlternatives(int context, ParsedNameClass nc, Annotations[] pa) : +{ + Token t; + ParsedNameClass[] nameClasses; + int nNameClasses; +} +{ + ( + { + nameClasses = new ParsedNameClass[2]; + nameClasses[0] = nc; + nNameClasses = 1; + } + (t = "|" nc = BasicNameClass(context) nc = AnnotateAfter(nc) + { + if (nNameClasses >= nameClasses.length) { + ParsedNameClass[] oldNameClasses = nameClasses; + nameClasses = new ParsedNameClass[oldNameClasses.length*2]; + System.arraycopy(oldNameClasses, 0, nameClasses, 0, oldNameClasses.length); + } + nameClasses[nNameClasses++] = nc; + })+ + { + Annotations a; + if (pa == null) + a = null; + else { + a = pa[0]; + pa[0] = null; + } + nc = sb.makeChoice(nameClasses, nNameClasses, makeLocation(t), a); + } + )? + { return nc; } +} + +ParsedNameClass BasicNameClass(int context) : +{ + Annotations a; + ParsedNameClass nc; +} +{ + a = Annotations() + (nc = PrimaryNameClass(context, a) + | nc = OpenNameClass(context, a)) + { return nc; } +} + +ParsedNameClass PrimaryNameClass(int context, Annotations a) : +{ + ParsedNameClass nc; +} +{ + (nc = UnprefixedNameClass(context, a) + | nc = PrefixedNameClass(a) + | nc = ParenNameClass(context, a)) + { return nc; } +} + +ParsedNameClass OpenNameClass(int context, Annotations a) : +{ + Token t; + LocatedString ns; +} +{ + ns = NsName() { checkNsName(context, ns); return sb.makeNsName(ns.getString(), ns.getLocation(), a); } + | t = "*" { checkAnyName(context, t); return sb.makeAnyName(makeLocation(t), a); } +} + + +ParsedNameClass UnprefixedNameClass(int context, Annotations a) : +{ + LocatedString name; +} +{ + name = UnprefixedName() + { + String ns; + if ((context & (IN_ATTRIBUTE|IN_ELEMENT)) == IN_ATTRIBUTE) + ns = ""; + else + ns = defaultNamespace; + return sb.makeName(ns, name.getString(), null, name.getLocation(), a); + } +} + +ParsedNameClass PrefixedNameClass(Annotations a) : +{ + Token t; +} +{ + t = + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + return sb.makeName(lookupPrefix(prefix, t), qn.substring(colon + 1), prefix, makeLocation(t), a); + } +} + +ParsedNameClass NsNameExceptClass(int context, Annotations a, Annotations[] pa) : +{ + LocatedString ns; + ParsedNameClass nc; +} +{ + ns = NsName() + { checkNsName(context, ns); } + (nc = ExceptNameClass(context | IN_NS_NAME) + { nc = sb.makeNsName(ns.getString(), nc, ns.getLocation(), a); } + nc = AnnotateAfter(nc) + | { nc = sb.makeNsName(ns.getString(), ns.getLocation(), a); } + nc = AnnotateAfter(nc) + nc = NameClassAlternatives(context, nc, pa)) + { return nc; } +} + +LocatedString NsName() : +{ + Token t; +} +{ + t = + { + String qn = t.image; + String prefix = qn.substring(0, qn.length() - 2); + return new LocatedString(lookupPrefix(prefix, t), t); + } +} + +ParsedNameClass AnyNameExceptClass(int context, Annotations a, Annotations[] pa) : +{ + Token t; + ParsedNameClass nc; +} +{ + t = "*" + { checkAnyName(context, t); } + (nc = ExceptNameClass(context | IN_ANY_NAME) + { nc = sb.makeAnyName(nc, makeLocation(t), a); } + nc = AnnotateAfter(nc) + | { nc = sb.makeAnyName(makeLocation(t), a); } + nc = AnnotateAfter(nc) + nc = NameClassAlternatives(context, nc, pa)) + { return nc; } +} + +ParsedNameClass ParenNameClass(int context, Annotations a) : +{ + Token t; + ParsedNameClass nc; + Annotations[] pa = new Annotations[]{ a }; +} +{ + t = "(" nc = NameClass(context, pa) { nc = afterComments(nc); } ")" + { + if (pa[0] != null) + nc = sb.makeChoice(new ParsedNameClass[] { nc }, 1, makeLocation(t), pa[0]); + return nc; + } +} + +ParsedNameClass ExceptNameClass(int context) : +{ + ParsedNameClass nc; +} +{ + "-" nc = BasicNameClass(context) + { return nc; } +} + +ParsedPattern ListExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "list" + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeList(p, makeLocation(t), a); } +} + +ParsedPattern MixedExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "mixed" + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeMixed(p, makeLocation(t), a); } +} + +ParsedPattern GrammarExpr(Scope scope, Annotations a) : +{ + Token t; + Grammar g; +} +{ + t = "grammar" { g = sb.makeGrammar(scope); } + "{" a = GrammarBody(g, g, a) { topLevelComments(g); } "}" + { return g.endGrammar(makeLocation(t), a); } +} + +ParsedPattern ParenExpr(boolean topLevel, Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "(" p = Expr(topLevel, scope, t, a) { p = afterComments(p); } ")" + { return p; } +} + +Annotations GrammarBody(GrammarSection section, Scope scope, Annotations a) : +{ + ParsedElementAnnotation e; +} +{ + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() + { if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); })* + (GrammarComponent(section, scope))* + { return a; } +} + +void GrammarComponent(GrammarSection section, Scope scope) : +{ + ParsedElementAnnotation e; + Annotations a; +} +{ + (a = Annotations() + (Definition(section, scope, a) + | Include(section, scope, a) + | Div(section, scope, a))) + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() { section.topLevelAnnotation(e); })* +} + +void Definition(GrammarSection section, Scope scope, Annotations a) : +{} +{ + (Define(section, scope, a) | Start(section, scope, a)) +} + +void Start(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + GrammarSection.Combine combine; + ParsedPattern p; +} +{ + t = "start" combine = AssignOp() p = Expr(false, scope, null, null) + { section.define(GrammarSection.START, combine, p, makeLocation(t), a); } +} + +void Define(GrammarSection section, Scope scope, Annotations a) : +{ + LocatedString name; + GrammarSection.Combine combine; + ParsedPattern p; +} +{ + name = Identifier() combine = AssignOp() p = Expr(false, scope, null, null) + { section.define(name.getString(), combine, p, name.getLocation(), a); } +} + +GrammarSection.Combine AssignOp() : +{} +{ + "=" { return null; } + | "|=" { return GrammarSection.COMBINE_CHOICE; } + | "&=" { return GrammarSection.COMBINE_INTERLEAVE; } +} + +void Include(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + String href; + String ns; + Include include = section.makeInclude(); +} +{ + t = "include" href = Literal() + ns = Inherit() + ("{" a = IncludeBody(include, scope, a) { topLevelComments(include); } "}")? + { + try { + include.endInclude(resolve(href), ns, makeLocation(t), a); + } + catch (IllegalSchemaException e) { } + } +} + +Annotations IncludeBody(GrammarSection section, Scope scope, Annotations a) : +{ + ParsedElementAnnotation e; +} +{ + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() + { if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); })* + (IncludeComponent(section, scope))* + { return a; } +} + + +void IncludeComponent(GrammarSection section, Scope scope) : +{ + ParsedElementAnnotation e; + Annotations a; +} +{ + (a = Annotations() (Definition(section, scope, a) + | IncludeDiv(section, scope, a))) + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() { section.topLevelAnnotation(e); })* +} + +void Div(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + Div div = section.makeDiv(); +} +{ + t = "div" "{" a = GrammarBody(div, scope, a) { topLevelComments(div); } "}" + { div.endDiv(makeLocation(t), a); } +} + +void IncludeDiv(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + Div div = section.makeDiv(); +} +{ + t = "div" "{" a = IncludeBody(div, scope, a) { topLevelComments(div); } "}" + { div.endDiv(makeLocation(t), a); } +} + +ParsedPattern ExternalRefExpr(Scope scope, Annotations a) : +{ + Token t; + String href; + String ns; +} +{ + t = "external" href = Literal() + ns = Inherit() + { + try { + return sb.makeExternalRef(resolve(href), ns, scope, makeLocation(t), a); + } + catch (IllegalSchemaException e) { + return sb.makeErrorPattern(); + } + } +} + +String Inherit() : +{ + String ns = null; +} +{ + ("inherit" "=" ns = Prefix())? + { + if (ns == null) + ns = defaultNamespace; + return ns; + } +} + +ParsedPattern ParentExpr(Scope scope, Annotations a) : +{ + LocatedString name; +} +{ + "parent" { a = addCommentsToChildAnnotations(a); } name = Identifier() + { + return scope.makeParentRef(name.getString(), name.getLocation(), a); + } +} + +ParsedPattern IdentifierExpr(Scope scope, Annotations a) : +{ + LocatedString name; +} +{ + name = Identifier() + { + return scope.makeRef(name.getString(), name.getLocation(), a); + } +} + +ParsedPattern ValueExpr(boolean topLevel, Annotations a) : +{ + LocatedString s; +} +{ + s = LocatedLiteral() + { + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", s.getToken()); + a = null; + } + return sb.makeValue("", "token", s.getString(), getContext(), defaultNamespace, s.getLocation(), a); + } +} + +ParsedPattern DataExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) : +{ + Token datatypeToken; + Location loc; + String datatype; + String datatypeUri = null; + String s = null; + ParsedPattern e = null; + DataPatternBuilder dpb; +} +{ + datatypeToken = DatatypeName() + { + datatype = datatypeToken.image; + loc = makeLocation(datatypeToken); + int colon = datatype.indexOf(':'); + if (colon < 0) + datatypeUri = ""; + else { + String prefix = datatype.substring(0, colon); + datatypeUri = lookupDatatype(prefix, datatypeToken); + datatype = datatype.substring(colon + 1); + } + } + ((s = Literal() + { + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", datatypeToken); + a = null; + } + return sb.makeValue(datatypeUri, datatype, s, getContext(), defaultNamespace, loc, a); + } + ) + | ( { dpb = sb.makeDataPatternBuilder(datatypeUri, datatype, loc); } + ( (Params(dpb) (e = Except(scope, except))?) + | (e = Except(scope, except))?) + { return e == null ? dpb.makePattern(loc, a) : dpb.makePattern(e, loc, a); })) +} + +Token DatatypeName() : +{ + Token t; +} +{ + (t = "string" | t = "token" | t = ) + { return t; } +} + +LocatedString Identifier() : +{ + LocatedString s; + Token t; +} +{ + (t = { s = new LocatedString(t.image, t); } + | t = { s = new LocatedString(t.image.substring(1), t); }) + { return s; } +} + +String Prefix() : +{ + Token t; + String prefix; +} +{ + (t = { prefix = t.image; } + | t = { prefix = t.image.substring(1); } + | t = Keyword() { prefix = t.image; }) + { return lookupPrefix(prefix, t); } +} + +LocatedString UnprefixedName() : +{ + LocatedString s; + Token t; +} +{ + (s = Identifier() + | t = Keyword() { s = new LocatedString(t.image, t); }) + { return s; } +} + +void Params(DataPatternBuilder dpb) : +{} +{ + "{" (Param(dpb))* "}" +} + +void Param(DataPatternBuilder dpb) : +{ + LocatedString name; + Annotations a; + String value; +} +{ + a = Annotations() name = UnprefixedName() "=" { a = addCommentsToLeadingAnnotations(a); } value = Literal() + { dpb.addParam(name.getString(), value, getContext(), defaultNamespace, name.getLocation(), a); } +} + +ParsedPattern Except(Scope scope, Token[] except) : +{ + Annotations a; + ParsedPattern p; + Token t; + Token[] innerExcept = new Token[1]; +} +{ + t = "-" a = Annotations() p = PrimaryExpr(false, scope, a, innerExcept) + { + checkExcept(innerExcept); + except[0] = t; + return p; + } +} + +ParsedElementAnnotation Documentation() : +{ + CommentList comments = getComments(); + ElementAnnotationBuilder eab; + Token t; + String s; +} +{ + (t = | t = ) + { + eab = sb.makeElementAnnotationBuilder(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS, + "documentation", + getCompatibilityPrefix(), + makeLocation(t), + comments, + getContext()); + eab.addText(mungeComment(t.image), makeLocation(t), null); + } + (t = { eab.addText("\n" + mungeComment(t.image), makeLocation(t), null); })* + { return eab.makeElementAnnotation(); } +} + +Annotations Annotations() : +{ + CommentList comments = getComments(); + Annotations a = null; + ParsedElementAnnotation e; +} +{ + ( { a = sb.makeAnnotations(comments, getContext()); } + (e = Documentation() { a.addElement(e); })+ + { + comments = getComments(); + if (comments != null) + a.addLeadingComment(comments); + } + )? + ("[" { if (a == null) a = sb.makeAnnotations(comments, getContext()); clearAttributeList(); annotationsIncludeElements = false; } + (LOOKAHEAD(2) PrefixedAnnotationAttribute(a, false) )* + ( e = AnnotationElement(false) { a.addElement(e); annotationsIncludeElements = true; } )* + { a.addComment(getComments()); } + "]")? + { + if (a == null && comments != null) + a = sb.makeAnnotations(comments, getContext()); + return a; + } +} + +void AnnotationAttribute(Annotations a) : +{} +{ + PrefixedAnnotationAttribute(a, true) | UnprefixedAnnotationAttribute(a) +} + +void PrefixedAnnotationAttribute(Annotations a, boolean nested) : +{ + Token t; + String value; +} +{ + t = "=" value = Literal() + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) + error("inherited_annotation_namespace", t); + else if (ns.length() == 0 && !nested) + error("unqualified_annotation_attribute", t); + else if (ns.equals(WellKnownNamespaces.RELAX_NG) && !nested) + error("relax_ng_namespace", t); + /*else if (ns.length() == 0 + && qn.length() - colon - 1 == 5 + && qn.regionMatches(colon + 1, "xmlns", 0, 5)) + error("xmlns_annotation_attribute", t);*/ + else if (ns.equals(WellKnownNamespaces.XMLNS)) + error("xmlns_annotation_attribute_uri", t); + else { + if (ns.length() == 0) + prefix = null; + addAttribute(a, ns, qn.substring(colon + 1), prefix, value, t); + } + } +} + +void UnprefixedAnnotationAttribute(Annotations a) : +{ + LocatedString name; + String value; +} +{ + name = UnprefixedName() "=" value = Literal() + { + if (name.getString().equals("xmlns")) + error("xmlns_annotation_attribute", name.getToken()); + else + addAttribute(a, "", name.getString(), null, value, name.getToken()); + } +} + +ParsedElementAnnotation AnnotationElement(boolean nested) : +{ + ParsedElementAnnotation a; +} +{ + (a = PrefixedAnnotationElement(nested) + | a = UnprefixedAnnotationElement()) + { return a; } +} + +ParsedElementAnnotation AnnotationElementNotKeyword() : +{ + ParsedElementAnnotation a; +} +{ + (a = PrefixedAnnotationElement(false) + | a = IdentifierAnnotationElement()) + { return a; } +} + +ParsedElementAnnotation PrefixedAnnotationElement(boolean nested) : +{ + CommentList comments = getComments(); + Token t; + ElementAnnotationBuilder eab; +} +{ + t = + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) { + error("inherited_annotation_namespace", t); + ns = ""; + } + else if (!nested && ns.equals(WellKnownNamespaces.RELAX_NG)) { + error("relax_ng_namespace", t); + ns = ""; + } + else { + if (ns.length() == 0) + prefix = null; + } + eab = sb.makeElementAnnotationBuilder(ns, qn.substring(colon + 1), prefix, + makeLocation(t), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +ParsedElementAnnotation UnprefixedAnnotationElement() : +{ + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; +} +{ + name = UnprefixedName() + { + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +ParsedElementAnnotation IdentifierAnnotationElement() : +{ + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; +} +{ + name = Identifier() + { + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +void AnnotationElementContent(ElementAnnotationBuilder eab) : +{ + ParsedElementAnnotation e; +} +{ + "[" { clearAttributeList(); } + (LOOKAHEAD(2) AnnotationAttribute(eab))* + ((AnnotationElementLiteral(eab) + ("~" AnnotationElementLiteral(eab))*) + | e = AnnotationElement(true) { eab.addElement(e); })* + { eab.addComment(getComments()); } + "]" +} + +void AnnotationElementLiteral(ElementAnnotationBuilder eab) : +{ + Token t; + CommentList comments = getComments(); +} +{ + t = { eab.addText(unquote(t.image), makeLocation(t), comments); } +} + +String Literal() : +{ + Token t; + String s; + StringBuffer buf; +} +{ + t = + { + s = unquote(t.image); + } + ( + { buf = new StringBuffer(s); } + ("~" t = { buf.append(unquote(t.image)); })+ + { s = buf.toString(); } + )? + { return s; } +} + +LocatedString LocatedLiteral() : +{ + Token t; + Token t2; + String s; + StringBuffer buf; +} +{ + t = + { + s = unquote(t.image); + } + ( + { buf = new StringBuffer(s); } + ("~" t2 = { buf.append(unquote(t2.image)); })+ + { s = buf.toString(); } + )? + { return new LocatedString(s, t); } +} + +Token Keyword() : +{ + Token t; +} +{ + (t = "element" + | t = "attribute" + | t = "namespace" + | t = "list" + | t = "mixed" + | t = "grammar" + | t = "empty" + | t = "text" + | t = "parent" + | t = "external" + | t = "notAllowed" + | t = "start" + | t = "include" + | t = "default" + | t = "inherit" + | t = "string" + | t = "token" + | t = "datatypes" + | t = "div") + { return t; } +} + +<*> +SKIP: { + < #NEWLINE : [ "\u0000", "\n" ] > + | < #NOT_NEWLINE : ~[ "\u0000", "\n" ] > + | < WS: ([ "\u0000", " ", "\n", "\t" ])+ > : DEFAULT +} + +TOKEN : +{ + < DOCUMENTATION: "##" ()* > : AFTER_DOCUMENTATION +} + + +TOKEN : +{ + < DOCUMENTATION_CONTINUE: ([" ", "\t"])* > +} + +SPECIAL_TOKEN: +{ + < SINGLE_LINE_COMMENT: "#" ()* > : AFTER_SINGLE_LINE_COMMENT +} + + +TOKEN : +{ + < DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: ([" ", "\t"])* > : AFTER_DOCUMENTATION +} + + +SPECIAL_TOKEN : +{ + < SINGLE_LINE_COMMENT_CONTINUE: ([" ", "\t"])* > +} + +TOKEN : +{ + < #BASE_CHAR : [ + "\u0041" - "\u005a", + "\u0061" - "\u007a", + "\u00c0" - "\u00d6", + "\u00d8" - "\u00f6", + "\u00f8" - "\u00ff", + "\u0100" - "\u0131", + "\u0134" - "\u013e", + "\u0141" - "\u0148", + "\u014a" - "\u017e", + "\u0180" - "\u01c3", + "\u01cd" - "\u01f0", + "\u01f4" - "\u01f5", + "\u01fa" - "\u0217", + "\u0250" - "\u02a8", + "\u02bb" - "\u02c1", + "\u0386", + "\u0388" - "\u038a", + "\u038c", + "\u038e" - "\u03a1", + "\u03a3" - "\u03ce", + "\u03d0" - "\u03d6", + "\u03da", + "\u03dc", + "\u03de", + "\u03e0", + "\u03e2" - "\u03f3", + "\u0401" - "\u040c", + "\u040e" - "\u044f", + "\u0451" - "\u045c", + "\u045e" - "\u0481", + "\u0490" - "\u04c4", + "\u04c7" - "\u04c8", + "\u04cb" - "\u04cc", + "\u04d0" - "\u04eb", + "\u04ee" - "\u04f5", + "\u04f8" - "\u04f9", + "\u0531" - "\u0556", + "\u0559", + "\u0561" - "\u0586", + "\u05d0" - "\u05ea", + "\u05f0" - "\u05f2", + "\u0621" - "\u063a", + "\u0641" - "\u064a", + "\u0671" - "\u06b7", + "\u06ba" - "\u06be", + "\u06c0" - "\u06ce", + "\u06d0" - "\u06d3", + "\u06d5", + "\u06e5" - "\u06e6", + "\u0905" - "\u0939", + "\u093d", + "\u0958" - "\u0961", + "\u0985" - "\u098c", + "\u098f" - "\u0990", + "\u0993" - "\u09a8", + "\u09aa" - "\u09b0", + "\u09b2", + "\u09b6" - "\u09b9", + "\u09dc" - "\u09dd", + "\u09df" - "\u09e1", + "\u09f0" - "\u09f1", + "\u0a05" - "\u0a0a", + "\u0a0f" - "\u0a10", + "\u0a13" - "\u0a28", + "\u0a2a" - "\u0a30", + "\u0a32" - "\u0a33", + "\u0a35" - "\u0a36", + "\u0a38" - "\u0a39", + "\u0a59" - "\u0a5c", + "\u0a5e", + "\u0a72" - "\u0a74", + "\u0a85" - "\u0a8b", + "\u0a8d", + "\u0a8f" - "\u0a91", + "\u0a93" - "\u0aa8", + "\u0aaa" - "\u0ab0", + "\u0ab2" - "\u0ab3", + "\u0ab5" - "\u0ab9", + "\u0abd", + "\u0ae0", + "\u0b05" - "\u0b0c", + "\u0b0f" - "\u0b10", + "\u0b13" - "\u0b28", + "\u0b2a" - "\u0b30", + "\u0b32" - "\u0b33", + "\u0b36" - "\u0b39", + "\u0b3d", + "\u0b5c" - "\u0b5d", + "\u0b5f" - "\u0b61", + "\u0b85" - "\u0b8a", + "\u0b8e" - "\u0b90", + "\u0b92" - "\u0b95", + "\u0b99" - "\u0b9a", + "\u0b9c", + "\u0b9e" - "\u0b9f", + "\u0ba3" - "\u0ba4", + "\u0ba8" - "\u0baa", + "\u0bae" - "\u0bb5", + "\u0bb7" - "\u0bb9", + "\u0c05" - "\u0c0c", + "\u0c0e" - "\u0c10", + "\u0c12" - "\u0c28", + "\u0c2a" - "\u0c33", + "\u0c35" - "\u0c39", + "\u0c60" - "\u0c61", + "\u0c85" - "\u0c8c", + "\u0c8e" - "\u0c90", + "\u0c92" - "\u0ca8", + "\u0caa" - "\u0cb3", + "\u0cb5" - "\u0cb9", + "\u0cde", + "\u0ce0" - "\u0ce1", + "\u0d05" - "\u0d0c", + "\u0d0e" - "\u0d10", + "\u0d12" - "\u0d28", + "\u0d2a" - "\u0d39", + "\u0d60" - "\u0d61", + "\u0e01" - "\u0e2e", + "\u0e30", + "\u0e32" - "\u0e33", + "\u0e40" - "\u0e45", + "\u0e81" - "\u0e82", + "\u0e84", + "\u0e87" - "\u0e88", + "\u0e8a", + "\u0e8d", + "\u0e94" - "\u0e97", + "\u0e99" - "\u0e9f", + "\u0ea1" - "\u0ea3", + "\u0ea5", + "\u0ea7", + "\u0eaa" - "\u0eab", + "\u0ead" - "\u0eae", + "\u0eb0", + "\u0eb2" - "\u0eb3", + "\u0ebd", + "\u0ec0" - "\u0ec4", + "\u0f40" - "\u0f47", + "\u0f49" - "\u0f69", + "\u10a0" - "\u10c5", + "\u10d0" - "\u10f6", + "\u1100", + "\u1102" - "\u1103", + "\u1105" - "\u1107", + "\u1109", + "\u110b" - "\u110c", + "\u110e" - "\u1112", + "\u113c", + "\u113e", + "\u1140", + "\u114c", + "\u114e", + "\u1150", + "\u1154" - "\u1155", + "\u1159", + "\u115f" - "\u1161", + "\u1163", + "\u1165", + "\u1167", + "\u1169", + "\u116d" - "\u116e", + "\u1172" - "\u1173", + "\u1175", + "\u119e", + "\u11a8", + "\u11ab", + "\u11ae" - "\u11af", + "\u11b7" - "\u11b8", + "\u11ba", + "\u11bc" - "\u11c2", + "\u11eb", + "\u11f0", + "\u11f9", + "\u1e00" - "\u1e9b", + "\u1ea0" - "\u1ef9", + "\u1f00" - "\u1f15", + "\u1f18" - "\u1f1d", + "\u1f20" - "\u1f45", + "\u1f48" - "\u1f4d", + "\u1f50" - "\u1f57", + "\u1f59", + "\u1f5b", + "\u1f5d", + "\u1f5f" - "\u1f7d", + "\u1f80" - "\u1fb4", + "\u1fb6" - "\u1fbc", + "\u1fbe", + "\u1fc2" - "\u1fc4", + "\u1fc6" - "\u1fcc", + "\u1fd0" - "\u1fd3", + "\u1fd6" - "\u1fdb", + "\u1fe0" - "\u1fec", + "\u1ff2" - "\u1ff4", + "\u1ff6" - "\u1ffc", + "\u2126", + "\u212a" - "\u212b", + "\u212e", + "\u2180" - "\u2182", + "\u3041" - "\u3094", + "\u30a1" - "\u30fa", + "\u3105" - "\u312c", + "\uac00" - "\ud7a3" + ] > + | < #IDEOGRAPHIC : [ + "\u4e00" - "\u9fa5", + "\u3007", + "\u3021" - "\u3029" + ] > + | < #LETTER : ( | ) > + | < #COMBINING_CHAR : [ + "\u0300" - "\u0345", + "\u0360" - "\u0361", + "\u0483" - "\u0486", + "\u0591" - "\u05a1", + "\u05a3" - "\u05b9", + "\u05bb" - "\u05bd", + "\u05bf", + "\u05c1" - "\u05c2", + "\u05c4", + "\u064b" - "\u0652", + "\u0670", + "\u06d6" - "\u06dc", + "\u06dd" - "\u06df", + "\u06e0" - "\u06e4", + "\u06e7" - "\u06e8", + "\u06ea" - "\u06ed", + "\u0901" - "\u0903", + "\u093c", + "\u093e" - "\u094c", + "\u094d", + "\u0951" - "\u0954", + "\u0962" - "\u0963", + "\u0981" - "\u0983", + "\u09bc", + "\u09be", + "\u09bf", + "\u09c0" - "\u09c4", + "\u09c7" - "\u09c8", + "\u09cb" - "\u09cd", + "\u09d7", + "\u09e2" - "\u09e3", + "\u0a02", + "\u0a3c", + "\u0a3e", + "\u0a3f", + "\u0a40" - "\u0a42", + "\u0a47" - "\u0a48", + "\u0a4b" - "\u0a4d", + "\u0a70" - "\u0a71", + "\u0a81" - "\u0a83", + "\u0abc", + "\u0abe" - "\u0ac5", + "\u0ac7" - "\u0ac9", + "\u0acb" - "\u0acd", + "\u0b01" - "\u0b03", + "\u0b3c", + "\u0b3e" - "\u0b43", + "\u0b47" - "\u0b48", + "\u0b4b" - "\u0b4d", + "\u0b56" - "\u0b57", + "\u0b82" - "\u0b83", + "\u0bbe" - "\u0bc2", + "\u0bc6" - "\u0bc8", + "\u0bca" - "\u0bcd", + "\u0bd7", + "\u0c01" - "\u0c03", + "\u0c3e" - "\u0c44", + "\u0c46" - "\u0c48", + "\u0c4a" - "\u0c4d", + "\u0c55" - "\u0c56", + "\u0c82" - "\u0c83", + "\u0cbe" - "\u0cc4", + "\u0cc6" - "\u0cc8", + "\u0cca" - "\u0ccd", + "\u0cd5" - "\u0cd6", + "\u0d02" - "\u0d03", + "\u0d3e" - "\u0d43", + "\u0d46" - "\u0d48", + "\u0d4a" - "\u0d4d", + "\u0d57", + "\u0e31", + "\u0e34" - "\u0e3a", + "\u0e47" - "\u0e4e", + "\u0eb1", + "\u0eb4" - "\u0eb9", + "\u0ebb" - "\u0ebc", + "\u0ec8" - "\u0ecd", + "\u0f18" - "\u0f19", + "\u0f35", + "\u0f37", + "\u0f39", + "\u0f3e", + "\u0f3f", + "\u0f71" - "\u0f84", + "\u0f86" - "\u0f8b", + "\u0f90" - "\u0f95", + "\u0f97", + "\u0f99" - "\u0fad", + "\u0fb1" - "\u0fb7", + "\u0fb9", + "\u20d0" - "\u20dc", + "\u20e1", + "\u302a" - "\u302f", + "\u3099", + "\u309a" + ] > + | < #DIGIT : [ + "\u0030" - "\u0039", + "\u0660" - "\u0669", + "\u06f0" - "\u06f9", + "\u0966" - "\u096f", + "\u09e6" - "\u09ef", + "\u0a66" - "\u0a6f", + "\u0ae6" - "\u0aef", + "\u0b66" - "\u0b6f", + "\u0be7" - "\u0bef", + "\u0c66" - "\u0c6f", + "\u0ce6" - "\u0cef", + "\u0d66" - "\u0d6f", + "\u0e50" - "\u0e59", + "\u0ed0" - "\u0ed9", + "\u0f20" - "\u0f29" + ] > + | < #EXTENDER : [ + "\u00b7", + "\u02d0", + "\u02d1", + "\u0387", + "\u0640", + "\u0e46", + "\u0ec6", + "\u3005", + "\u3031" - "\u3035", + "\u309d" - "\u309e", + "\u30fc" - "\u30fe" + ] > + | < #NMSTART : ( | "_") > + | < #NMCHAR : ( | | | | "." | "-" | "_") > + | < #NCNAME: ()* > +} + +TOKEN : +{ + < IDENTIFIER: > + | < ESCAPED_IDENTIFIER: "\\" > + | < PREFIX_STAR: ":*" > + | < PREFIXED_NAME: ":" > + | < LITERAL : ("\"" (~["\u0000", "\""])* "\"") + | ("'" (~["\u0000", "'"])* "'") + | ("\"\"\"" (~["\""] + | ("\"" ~["\""]) + | ("\"\"" ~["\""]))* "\"\"\"") + | ("'''" (~["'"] + | ("'" ~["'"]) + | ("''" ~["'"]))* "'''") > + | < FANNOTATE : ">>" > +} + +/* This avoids lexical errors from JavaCC. */ +<*> +TOKEN : +{ + < ILLEGAL_CHAR : [ "\u0000" - "\u0008", "\u000b" - "\uffff" ] > +} diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..56e0438bf2c6fc714415dec37f9527ffef1053e6 GIT binary patch literal 2643 zcmaKt_j}Vu7{_0c#D1O4F~deccH*#?2sMrz)H-$=IRux|R7pfIcm!L4q>S!C_uhN& zmeNTJoj>)D>eH{}B+r?K{_@d%Uftb$y1Vz$-~U{>Mnqlom!IxudVuLcriYjwW_pC_ zBGaQxk1;*Y^aRtBOiwXA&GZb@vrNx1JY)l-!gs2^gYuL zOg}RH#B_z}XQp46t}DpWt~G-deSb# zSCT^hm_8IWV!ErF6sn5F6T?!dQK1Dxru(u96ZFKxgME4|5lR^Gm>X?@&nSW;oQZ_Y9Z5 z*@>n059kr&@UT0#ySQE0?_vnOXXo6F^ic!L4@KQRd+^DTPz+}lN_aW$t-3$uVU!MpEq~TV(Nz@~%%Y9(E+E{#?b02;cS3U2bRiTchPU9I+ zQ`yn<zFQ7=B8w=x+k??ujfJP%f>Su0}~ur7B*KpnG>S(9mZMt7#;c0T2{ ztJE>ev7G4%y8!d6c4oqvM$4x<_LSS9TFvI1P&%DEV~;`0)N>viJ+^yn^SIw*D;QAi zw4JfD#rZ7s?(g?FUVdaZcF}B1# zC$F=2mS_dEnQF&w)@V}o!^^cH6OTHrGdIgPUwVP(9 znxTue|CTbsHJVh%@VXhFDPlwd+DrwbU9NU_;}B{!xoEqq=`5X7X#Z#~6LgMSsoaE} zEqLV;%-d;e3KfS#E!aVHaLXn*fBBSDPJHBqJ?i)r{2D?i=hf6e2PljmK#yD8q{AbU z_recKZoqGr{1$jr@;-P>@;JO-@>}5plAG{^=@m zu?^fRwu9Tm4sg5J3GNWPz@1_@xJ&E-cZ>0c literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.class new file mode 100644 index 0000000000000000000000000000000000000000..fb2fb2462b7ede57f26746a3b88eaf10c3e6128a GIT binary patch literal 26716 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EOFException.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EOFException.class new file mode 100644 index 0000000000000000000000000000000000000000..f1ddabae6c6f44bba74f807e2623dae86e87e9ee GIT binary patch literal 346 zcmbVHyH3ME5S)!28;l`5et;4vI2uF&N`sQhf&!F&bDYQ_=gzV(D8EI8M8OB}QHVW* z5H%~^?(E!XcK74+?H#}wb_*of&asnYM98kJvtdj~j*e%9^x8id!l<&&+^m*!)86yE z7G}Tln(G<2HugVc8Wy%ATvXaGRamg~jd7h{wc4oG)Vy|&s^PXXN(2q-peDD|$y%Ex zSnn{0_w-26BH4k|+LBGeJsfWQHfN bpcerH;0iUR8bpwC+_U literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.class new file mode 100644 index 0000000000000000000000000000000000000000..bf3426ada17923c9addb580cee8670df29aa5ee1 GIT binary patch literal 835 zcmbtRT~FIE6g^Ht3R$4gc9b#L;H?c3;hhOhLLgPE_OMQUH&Ly$@(z7P9nqF`VxhA_#}VPE}&{4Y{TeZ)|2%+gz}W|zS`&VC7o za(k-ulb@x8RN7g>(=IQh`Th%f`dkhezP6LBAM0~2vs|b_HY^em7b4{&N|*CuAYy9B zd7|T!LBeysPDY8ywagSn_j^KrGlSI{&Dm@W%XI#diT*;PN%NHnJ^pXRpkv)n zrOCWG*KObYxey_CLX@x=VhKTrcL*4c-Zlq0zTC=>q0+K1rbF7yUF^_Z`gF@KD#o3v ziV0wM%0RnEZ-`|utWcH0u}Cet2aEQ`aH6d-+-Q3Y@0QLTlxbZjRgjuTT1IV!=Bbj( zDxuMYk2P{KPtE!=TbW+RR>s?-thKzx_JRy9m@0;VkcCWW3yFCNi3^Dv<5Emb32y0HUdxN+m62A& zCJE4lBuz-tCX_Tlk_H!!d&+4Jw0=pOhW1n2lhaTA1O3>}{R(q)S+}XKv z=g!QXdFHM@`}_~L0c^o_4M(GR2m>0vui*z#9K#Q5DK~`-3dsl=5@Lzsu#jv7BT>}L zq#m}0 za8|>QG`yhUMGfaPyrkh}4X;G;W4x;2HPJgSc3zL*jR@XUFpA?=#x`?Zd8g)W`Ohb?DSiPmOL91}c9L!N-^yD*U zuHP)!GA|25?ugCPJaYg34@jQ&PGqcc*UmdUU_)h+`%NCUrFzo5wfe=3dGlaGf{rDY z=11g_F{@bgk{iuh?*4_zio~X+`Yicz4pv3k3fe*pV#J*2vrjPvH3iE(DG>%4g+iS< zG<3`=X3TM^=!R-BRCPn;KxTw~x@d`rQ&_b`@A1;`uvK7sqJ19D_SsT{<@aVUEqGCY zj-7ZyVOfqfOBXFd(eyDKjo>Fbeu}qrbYh2&t@xUbuj3m!wqd)Dhw+GP-KV1)-y&GQ z3_m{z9dF|TqmAqMnWzQR=`?W?=TD)2uan7_9M>vXL-DoV%$$ZTcDHGy+;tw(@1`}GlKVY zypIob`~n{`qXUCNTp{e$z`(E&<~A_UCS;?K0mi+BzX-0%VWvb@((y}7NkG>Ww%>P$ z-&+ZmW-)np(XG(9DD9gpy4Dy`LnIz3@CGTklL`-4LCq2{?5GOY8grc2(2zo^ijAc^ z?jlNa^ZxCkkiPHZdiNKz=U5X=acI;Q$6?#QxoQWktnJ8+p|Cp9{Xcxyd752b&F{^Q zci*waa+Z^I*&J+awqi|Y#4J1}9%+{C(zKY*Zh|grvB1rV?kX{pAlr)|lCZk| zYgl-IpO}aEK?@@!EkaI7mw0bBiuY!(@Ewvq;yX-@o!CXXo3ob@C)YL&0s~Sa{78va#@@xy`bt?7O!mG=t{LSX(wLYup_TN`Q>5cN*=L zOQODV4y($mGNqeyVLHB4p=Y%Cb|i`!d}R)+jWv~$R*|grC2|DuBqzTe`Vbo`?R<4n zXW^I(Xh(9Ma;m(rzqhsIEjDa8T<S{lQc0XvHqNL5&Z>)e zLCxZv`Ws&I@OKazn|wQ-LJv{493Nmmxgh?G;~p0l+?CPUpguvbht4MTdwiRE0nDgo z9H1!)6Te;aASbuDV0S3w9IbH0<|4$wWLbrHuAiXbx>Rm;hYos1=64gB%*i zcR56Mj3dfnbLbpJj(U#gIodd0;n>LW7RLa`m1*2c8S9wr!_$~f8S8!S{gm;b&s|6v z8+`87l(Et0&ZLZl&y`ZfCZ8Kk8A+cr{ZNnWZj4`Ln>C)kh9}D>GNh`ljg228MTX_= z45t>B1i~%hmN1VS8S-9pNc&o(jIK6C_;nnXuKWDo+~2f_42PE=aDkb)$b0A=V&D>M ze}#2^50k9ZS$^qX#8te8DZGJe{D5EQ|BPv_{EE_FliuL-8~hd@VHP*>N8;sA_#OU1 z%-q4OT7fyW67xjKMYWErd+2R9Yjp<+9AZVo_$&HZ1G(Yq)G7}Ryw+7>;jSWg*h7P+ R;>5uBhz5ltv=YG6{{cd)4cGtx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/Token.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/Token.class new file mode 100644 index 0000000000000000000000000000000000000000..16c9d4a5f25d9cea6467b2aec03b960493e66200 GIT binary patch literal 760 zcmb7B$xZ@65Pi+gFfJhOE1tjuW8zJX2Te?js0Rs&$7X1;ap)$)p!|~;O-xKQ@dNxQ zV@)&0C0@MLtA1Ut>UH(o`|~S+O{`l;VkL_>R?}Fs2v^c5F(j^~YB8`QhHO)`rK(9K z7;+{*(B7b{7}7$uMtqjCPc|vLyiK)*T8H0o$K$H)oCm&C?H%f?#4upkthu`D1Xo<@ zo=|-~@Ll2f!sA0K?s2~_94hE>H*o6uS}0Q5{hn|o_sp3gwJVhj_88*jN`v|y=oZbK z2<@B>x=rENdDAm4w9CB)_hopF$V6}@`wW>tkBl)C%ay~rS*B+-+>ebs3N~zvF;xGz6o$#K4WBhT!VOTOA57BEWg80P~5?{S6ssfJ5#L2gQMJz^dT%y|;mOlXQ COqqfJ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/TokenMgrError.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/TokenMgrError.class new file mode 100644 index 0000000000000000000000000000000000000000..1385d0fb2d281956e1e49813d8414725ad7b6168 GIT binary patch literal 2620 zcmbVO-E$LF6#v~cO*UzuWlNCKf}vkjC<1rEJq}8c376*Qcwz_4Yphuu?^(_53fj#kL5D!$0vSV71)qW zoYmvK$+1K#HIxz%I%V-%^If9aO!ZnH?7CVsGmr=+VVsQg!RFZ-lX0q zj~rK0Ga(N>(*MxVsjl>X@noi0 za-5VCs43Z&fX_1RD@I;m>pFvD<;h9Y>J|tk&Dk8oBxD%^TJ*fG>+96J<5g4lCx-fm zO|!tD=LM9!IXi3{HdA*|krfHlRS?RTr>PipcD<9f$!Pve*@{mY$Q5VILaA7`GG@#&^TsTJo-wSF8Kc6Ck+Eax;$^cikhPrR zSgh}Gu8^~Ph)=YAL|{vm7U}Z9KfRm^Av8)w=H2`t+su#-lA>6=VfV->V66WR zgWG`+k{IygS_s$iX$W(;A>bJu58)<0lbkIVhWCt4%7sXIMqA~wTP~xVp1u6@?m%Tc#Pb$z`x$1G4PkMjcZ#>=^>a&=ZBG&8|i zO%1u+B~9Jnau=OM&mC!q{D?qH!`wrhs1&1aq()0a!xHMrETEywt1TaGqNK^&TfuSH`t;&Y{<6M9&mIKDW_pi;KVo7R4)c@^63vX(!xnFo7uRhyo>Ipr zvtNc_GYe&nVRZ``Hao1oLT1}{P}HsS*te|KL}9pg3EP&?Ojeb9m39rpL{MI2@x)A{uvwRdRjgJdP~k)} znp?Jqy-l@Y-x79({fl^QHH@3>EzaU?Cq&9MSqahT;4DKlIyg&o8y%cw=8cdzdmT>V W%;$hIiL;!RMkgsh(@AmX!SKJI#TY>V literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.class new file mode 100644 index 0000000000000000000000000000000000000000..8bf104eda48bfcc838654d4cd400a2ec245fd411 GIT binary patch literal 9210 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 XZK+4nd?}tn_dusdnYcF< z=K4`jC#mUdM_G^^7tvF9gDA*;P$;jg?khO=;|?+EJ3(Z2``rVR6miX+*w^8{P6B}| zoKAKWqzdahe%$r4BOSy&6QyxK@r{?5P!FO*&vJUH9(Y?>=YAYzW{@$Pjg=3+B>9y( zzC!J7#aqS?74EF$6^EL1dsz}hhnw%?vGqo}%X*t<;}y>J`Uhd)KkRUs9;cb<%CfpW z@J&zjPF;M*tEXknQ+o72Q#zZ5Bsr{i*CtyH(%quv?Dhnv)n61Y1nHAg{buIIHa-Wb z`=Qavs3kn!vyJ;PkRhs%PHxCJ)o=j~&d`L>s$mARHPpr2!tEOF;QJajCEWYKxnSCs zz;^PdgBQln6c*y-&>M8ae1;xxJO8p9K0Q~j^;;j+%w+34g+r3pJLb)E{`MZ z-Fr6dAg8|9C&le?5p&-02`W6RW8EoS1UNJVSe^hdF}z}BcdqiQmQQ&aHQJ^q$UlIl zh{(4K3V{Y~le?c$<_h?v^%|=67fR1xqx=faXj%E4$0f|sHsR3D(9RO9j*kg+k)B!( zfq5)&C-9dF_$RzsqHo^9xBq}6*nC%B;S8|A&k^h*pLq+skY6r<34_a|P<%cjxzq+c zWd)Mfbc^Wi_6eq*jxrV*SRCcJVgXxu=n!z4XIBWv>-dx_iJr!1T$S-T*ACCV;O{EF zEa)^(DiTGy%4E7l(k)rKjXd9?wyeBcR*gV;wh{Q=jk2^M9#Wod4hAI5?`Z^%u+wV W;~1`SiqCCM#6QkQe%wYO9T47 zvQ$UK9>iX^+R_v6W5?w(PNmO%sBTPloL0j=5m6+Se;7xxl3WubQH13&XbE#+KODmD z4=%sC&(N-0DUp>`aU`KwrX2|54%^^lC)7980%; zn}OqZ-9Ap%Kk_X%wx#_+3C|PPpl$=}eC6aoF!?4jc;;5}nCI0IGW-H&d2{Om^fOhs z$)moYfLm-fj{^U#b=5G(GX0n=FR~N;#|=*1F5(W)+HI4iS)Pl3V0_&y|3YSqwl9$V v!7>BdzlH-WroPKv-Jb6vmT))SFJc)hDUu@YVU;o5XR9plJ>c(Q>g~~g2_BhV literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXParseable.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXParseable.class new file mode 100644 index 0000000000000000000000000000000000000000..7e722d7b8a5424f27e22203e79c1e3a39d9ee723 GIT binary patch literal 2281 zcmb7FU2hXd6g}fOS>kNK4WvmRw55gOPc{i{X;}(|G!RoKLn;oIcMkI`TO5LUjbOdUJiMz&EgE!&9E_t z>-fyV=f?OVhiTlH!Nj}wQx@$Y+Yz`mMm} z%Dz);cY4u&*wdbJ1!ivfZ9lp#;1%j#*m9z#^uvy7cjJKJrl&jg$4WMo-qcD)p?1d} znONA;I@H^;-3XL+iw6SP&9I>a&eZ+3+U>Otm3|@*19}$fp(ld_seNO=ab}~Y-xau? zhD@tK_S;8JN9wMMiS6Hgx@Qb?0GUnowI@(b+xu3EcUVy{)f6~Co`k@3oKfJXRKb$4 z_PwTR$$LFNpmc5;l>f(5d$%|_FecjAlToB}n`AS6EwGe;JtSwAyPf097-NnTXl@n! zI7vOI^H$$eoyZSO>c#qV`Ga))(5XEd_0M-l$qTGaW|fqSQg=P-A#g0EjdB9HA%w1l zP1=K-e&08j?7h(|a?QZDaSq?wSio5u7qDt!%f@{?5LizshUB+0wKM=c(8|U|d|=Mo zwotS2As*WJ4t0U$(dru&&&CdR17?~AIlk8Rf?h*49%$KW$rCgjcIL&=TRLPWu$m+``g)j#oknR&Ewj?*HO$1%lnVbG}p$!Ft9Q-?psFGcYHm-v9@ z!T!MCf@ubPg)^L=!y?D`X?>3=WchEG%GDPTrOI!}{1QhkaXigcFm{Hqb6CPMtzS!J57J#X=Y|JWa1fH2KNefi;w6rnf`&rXB}`$zhdeovI4t*VftB>=1f^sUckDU zHAdzoPGzu?{T;JE?^gf7+-t_oKO?%+uj9i@C?m&%N?2#g3}FEu;}pjW^sjQfh$~EA zX6gzhSjQ*Wz~vbHHbLa*yTlz+jLdWGG6_`(?Fv4nZv(TOU5$ymLy|5ED8?jR<}EX8 Rh52UqKaVQ?*Jx$n{0GRbop}HN literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXSubParser.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SAXSubParser.class new file mode 100644 index 0000000000000000000000000000000000000000..a626e8fce31160a9155da4028313d1939832521a GIT binary patch literal 3514 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 DY?}?o literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AnyNameState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AnyNameState.class new file mode 100644 index 0000000000000000000000000000000000000000..efc91d1bca72499ea2b8212c0fe744d22570d0a3 GIT binary patch literal 3262 zcmcguZBr9h6n-vb^TvW0C5WwURkS2&2`>WLP!ysl7ST4=Dt)ob=1SIXHgtFC#1H)m z{Q>^bM|KmY#u3cv)67(&R! zk;FW|eHy{lIL-4>499T|i%~4av4DI8*IB+CM;te!xW&R1mfYsyGhVJTz#Sge`fwNb zc=$YmF9gD}s>>}`U}{ybl(TM0Gb&rsaw^-lF0-~YwW_t5-O_AFX7BM>T+_-jZ)%Q{ zBW<^2IHMB+)9tk#t(q<9C0W)y9Glc*g=dyqlCGf>)VyIC?t;MVSQl8S2Lhpdr6>iC zts0hG+b(ZN`@Xhek|eQO(KYjdW*fZrg(0Rcpe|a^*rS50xpY)ru`FqO?n&Ccc62JE zjer~?-IfF$!F>V6w~`x6bph-t6XIYEF<&ywq7QgyZ1t)3la@6#`d9_mHmuFu+n9)% z95IdyN3R81Ab!J38>3=55qwGOP3h(@($ zO3kpqi9_V^+PAD1HU6;Fb-}*W-<4GS1Og zF@n=7-o+Ue!#EWIsV}sx*XD{ll$sHIrQ#tTQNfhAP1o2m<>Oi}P_d4$1(uJFAAIe6 zsbc8$nmYL=v5G7v*rRWVfUIsw-Ic|Fz_<8L#Wbc=T*8cs$M{}_h7A=uiV;W^Pq4{D zN#Och&|K1-I>|&pvOzd^bZoyMPgU&AY_)7=y>GDiFen#+$s>bO$v2lEH|`&|HIsVO zP-E@i-FQlo%%#>Tr8Hfajx&0Bg8K8V4sx_PU2?63&uwki5tTVd8jMlq>X=T(Z zX|y!SmSi`UI%o>DDqY&9HZ1uz>vvqucKNPxsV@p-+V}YSVbbo?EUQA75Vur;@%Fll z2j@wBylqw;qD%I;fBJWoz%L!dC?I<@ZXHCjwY|RXfKRhlds_dW2l#;gwUYE3*Fz6= zY#I~X!y)hvy#rBtsGZaLJ$hT9b9{0zop}L~&g`KlEncAacartseH!Duuh6Ur!Uj~* zr1Ln7QJR4Z81u1a(d+H0FA;i_eh#q*Wrt4GaKgN&gc>l^03(Goonk&e6MN<}lSzbk z5&0G838?oksEn70?j!aRaSuGbi@rUmJKjcrW*-CMz}RVo$ygLIC5AyIjuE8~DWxCN z%78~8Su+w4m_Y^~5y6kibcp70n(3OLHzvh9>~v4)Hy*vP)Z9rlxYHA$O=8N|yh*27 zbBMk88&M*CY$wf&T?`)39iYfTNg|>QLsdo^K!*ZQx|Dp-tA3mrRP5t8O$mBV{DG6b zH~_6NJo82{y4-xQ+kU{4K3L`eZ79@&cGg3yMK2jpOL~dMe$Haf$E_z;m=midoi0F8 wE;e9=1FSGEQ_>2G+Z8X?pWr;r=ZIy9lJy+DU!?iN5GUpWZqPbOb0LKP0C%p0ssI20 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AttributeState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$AttributeState.class new file mode 100644 index 0000000000000000000000000000000000000000..cdb060120a720d8dcaf96b768a4a96f00771660a GIT binary patch literal 4579 zcmcgwYf}?f7=8{5354|q1w~`4mRbl(P`pR2Kv8MYT0!tqYnQOVYO=xXqNuHx*0x@L zL7nML`^k@OXR1h@_M@HYf9YT7^m#X%B?O!VI@57Hw>{^1pZ9X!_k_Rx`Rxw?9e7j& z4FeHuz+f0d5l#kWWmuZC(wwWt`3TP7f=oUM<6;E0xFpSIvSP^55!sNe#VAZ!8`!LWad*P7GLxq5WTvu7GoCe5 z#ipER)hqCJ^W z5?$4A+2+Zq^oW@qG)7V$^-R)84H;QW=Kf-(P*+$PXglBLSQOv`eub` zj|NIn2dzauRoTuNhYTXU(@AsEwKBF7hD!%<_t8w&w8rh82`e?KaHwqIy(u$o+HRL^ zXXp+>COi_Rp>UwIxpE3D#2{mGqD@Ao$mf*dx@Oi^_`T&qxtRW$L|^Fx{R}pbdFicl zYC4HBq9LbVo{B>CWKI)$WXF;i_=PT{)*I49V3;yB${ic754uJw8(&$Nsn5RP}UUYv3ALeI^IUJ zj;(k%j46d9C3Els+QI$u`0Ln=Ejl*hO&!;;MFBdlV_L^s*rd?Aba=6YmkJ6^Ucbny zC~-r_P3+fk3&(UE!eJes$rovI_{xQ$Cvm@$9;UQqf54SqesU#_*O?hPAIHp zWaf&ZY~OWxWggGxf?b*(j$Nz-wfckJq5@trLry%xt?Vqw)-WThm( z!dqQ-1`909LiW?LxR>NrtgfFGmXQDgvWyC^7-=l5d^hB3+gt{XpWw6g5Oq8a*tYG#dfX=Aq8^eF_be2JEel?e8&I-{ir~?XrmyHqxX&GA1 zms{E@|DOT#S7@JHq2pyJUwq3KNouV_*udj=J2n?c1doK~QfZHSwo4I{>}E@S?zYePGGAda0r#2!+R zZ~9AU=VHG?&7ksU&I>Uv7GUTBMkjXp7>9itA)!$<#~>o)Gy_%Ih=bJQSqv*wjAasQ>@`?>X+F_pANEs@nCC}Sc@lf5SJf-DvkSkXvDo!LMX0X2KPDQ> z*EaP6HO~-=RX#)HDe7OM*0V+|HUs@RR?HFE3i?2^5Z10>rItdYW}`{VAf`=~?jigh0O7g#OJZL?UTfeOqKt&^bAuA@Pl#zyTXiQOu&TxZ~gPP~UBp5^#l@+~*) zkpec08PW3sBiX>4a7qb?f%c(RS-4)#0fzgqU6a=wB6Bdgo{d4P^Ai03aUUnZQWI4aO}u-QTQv6 zK;+`v2XEoJ)3kv;d&>`FgSW*~cJ%WA8R+>LC%Au!o` z=Z0+++7_Yi+pZlx6xb+_fwiK} z+0MbP3`6C+0^iH8(!pZF|HL%5(*q*HLfdm2>8_iu>ybP<2aW%z>tred6Wx9#WP4@g zN~j<=VS@2uTOjLr)KWD)?LmdqjbsS|we+CjS_KMQJxg`t%60G!6k4(DpV*P+W`?C+ zdoABe0~44uFa<-$iok=BAIz|{4BW-4jx_`8m=}0DI#|M6({n?~2jeH=oc+i8z0prd z5a&Gq(Cl@begoKiF<^~1J~Aj-mX@W0ptMpa6k$%zr%X=KXw75~#QWHH9!7MxS zjq0}oTw~+Z*-+VtA_?$cparfXQUmQ%oUJ3n!Iet&6GWwYjLZj`8Jy-fPbXxmnC3hR zhyu^xEdRhcTu2}`2pR1e-;jM-`3P|g?LF;bjO8H=V}LP-d3r@@93aO56r=dh$W<4X z=d~}$=kPaDJw{sVdk>I`xQI(}7DX)Ja$HgoS8z2hw@5OsL&FW8pwa6l_e*hxw@3~c Uo8>5DhVxne&ubucWz;nM1_f&3cmMzZ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$CommentHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$CommentHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..43e11f6e06e44292e2c3c1bd96d9899c1b2f97fe GIT binary patch literal 302 zcmb7Av1$TQ5S&$WXHFxg@DEaGlb6&s0YMZ50|)k-bJ3G`@8rEp@Y^i>06$8yn!;db zv$HI-Gs7HD`vZVCJjH0nXc6M9EDCWIq1T^n_=k;Uw=!wvbGI4}7K9`%zkMd-+zR12 z&DK)zC;K4&^~{gaCVZ%hsn(pATXEsSH(o67RBC(Xn!r2r|Mz9|=R0AywBiY!+e3Tm wocNLD5F`+~*KqT%jbxhm{chI?Ak?%0#Rj2{hHf=HTxNtsF;Rxrg2$-&3kzXY`Tzg` literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ContextImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ContextImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..7a12f3f80a68bac385ce588d4fd20b5b23e46c64 GIT binary patch literal 977 zcmbVLTWb?R6#gbncbm;>?Zx}8+7yx$x{<0c-lzew5Tp=W`sidkBvWQ*!^~7t{8I|` zLLd4A{88eWC1Ak3qz^mivfq51Ip;gS|D0a{Xknv*dEAT;;8uj&xD(+n?uED?;sHb8 z2GZ7A4BMSF&k{G_G9LkCSCzIzzRcYbQo- zHybL3cvov-+KO8%=;xc+E2&NJ(F>!#aBsO4`$jUX)*GE;{+TC=Q&+mqNZt3CZqcrH z($~5)*`h6vjuB!ZMufExk77K=dWc$#6|6G6nz`$f^)c+set)NDo#Ck)zmxj?UuLfE z$MIxlZfXTjQ(;L_Ez;DdO9^4x$VQnehG%3wuG%~U q`-Qn5D1W7}gntxYCMc?7iW06Ds2f-!yG;0b+SY622V@_X7ybhNF$+=v literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DataState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DataState.class new file mode 100644 index 0000000000000000000000000000000000000000..b8f40ed63deeee4322f7d451fecd282c6f9ef29f GIT binary patch literal 4339 zcmcgw>2p(66#w1#vgbicpp{JvC8ceGO-p4dsc0#!R6|*c2z9Bi>7#v+yo8q*Y~5E} za9_v2fUoEXZDq!fIOE^q=!_p+MrAzbrgCT3!?cT-J0>69^~I ztC!SxS~Vu(!mZ zIeuKVEX_1%uRNX`6WCLI<6+fOoo$B-dU{+lS+g~%=OY~gUDXBT)v5S!YEsLP7{b8Y z{ln9SHK|#8ibVD3hHf1c*xR}aS#76@qQ2}nQ4~t*hBj2ljA`a6bu4X@mQAVY)2gX+ z-x+iy$ym(9FKHn$K%Ab^pq7L`u?_oRq2Aa@~&nL~GkBMB1B4TwPII z-z1Um2t3-lG#vho3V)i38d5VvMxfsgDm`oDy|^T>F0Wa~$XRBuMR7M)V8U9K(Z38L z_Kjf+bzf4`1=_eqGsa7Dh-$f&9T=j~fvl2JExjz#)~Nh(|DH761zXDo};5+w0MLlcn;4C z^sHPDF{oyound$tY{d)Y*-RmA>AAG#=poOpTt(kxR!?b;j^Kh`y*8E8QkFJ8TC{22 zniuhsf|v1%f>-gHf@bVg@BkhZXvpaKJe{7Se5{U=Uy32E;B~yA;4-g!6K{F(wt{zX z#fx_pyoUh=@8bgnAL1h}K34DvK2`7;K3DJvk^=iyZj@ur#;iFJpUR};wgY?5l#)-N zbHzgGtXOMN7>*w}gEEzveYL8+!vT0S4y-$Cd3ks2a=ajYelPyGw4 z5>?gcW$q(RvUw}I*@}@>sb0+89qe*Z%wz;M(4oF$hd|I_vvVHA6bG5qRn?@W+cw2n{;8D_)1y^_4tWeQ71M8Yo?eMBqvd=>I=7bOW7i>~u^C8FaUC)juCHi9LMN4LAye~51f-u3l77Z+8dFFFZA2ILQVr}ww!u9CfsME-$2a3bB+2%SstE~eyNb5lw=%0f>trGugM?=HWCYaZ@~8@c90iJrQc8|{fQ#BS*?bW4BZkaQbEM8FwY*r*$d$V#Y3&_l%2qlWOhs6I$FJu@6j(!>UBMpG=j z-Ue77WfZ$^V8blxucP5A{L$F18QfLoJIwBs-SEpEY>|D~F8giG+lrD(nw!vTYbNP9 zL@j9nhCUp2Fr1?xVUKi>=7#SPvT4{z++0PYjb;{`Xlyf2)3;>~TU}TX0YyX#yz&~X zmqUolbrl}$a1d28(2oJq$-e9(6zt0&iFU>2aJPiAsR5pn*CQZrs3133GBHRodc+1l zSTbimI8L&_Ti8z(g~nFyag)9+^xZRuMi-J-(d?PcCaOveFEgzWS;Z04vrHKW-oYTvBy}VsO0~btO6fiv5Qv%cN&*bOQ?n-an z?nHs>tv3X6(S{qA>jG!nj^DGR4e9!u$_xFiz)^Ofx^kQBn=%NM9m;LH<7}v&T+wtu z@$t?VUbLYi*CEse*K?yw0_&A0z)Ban9>`u#1|8)@uJ1KwZ_%@szedj{+pedUw|c88 zxG7h=v9G=(ySHTEYC5?zw66k%tLjtocOn^))4Jh#Drj|O7%INJoNmYNFqDVz7!ot= z8z?ZJj08k%@V zps2jHX2c3v-HLQfvK7tsOvvjM8AU4aZu+bMy{HyHe4}`WDvDEfOHZCYUx;ym?>S5p67Ek>24I5OP6i#@KfAQ z&ElxtoH%RoI28DApYf2ceiUvHhIGNv=1%7y#3-G0I3#*>rT5GJUf={jq!auMXZUau zaGlmO2AqaG17mzRZb;AYv_$SKcdJ^v3sJ3|xrfYeq%(Mq>x6!1e2FpRD-?{cag=v6 zF|vhYc##w(^)QL=UPdWFU4X$8Q2Yzo+tuG8#61|l@}du$(=Uy0VmPbMIDk8aGP$&A zi&U?LNltBDZ5(UcWTHg=KsV95#L&vUVy_G7LS7Dgm|KpCA|8UDD7GaGcw?KJv-exD@zU zf1sGdZe2f7*Uva<{4(TFY2Z)^HJqW23|^y_4Ce3x_Y$4U@_*`io=5) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DefinitionState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DefinitionState.class new file mode 100644 index 0000000000000000000000000000000000000000..995cce9a777d5785fdeb7df509e5067f2555cad7 GIT binary patch literal 2355 zcmbVOYf~Fl7=BJTkZjxni9oBOQjKkHC19}?Q>$s3LNpL;XsqoA=43e~i<@2C-5~xH z|A76fj+Blw`UCo-I=*KUQXu2(z+`eR@4lDkz3#qx{rA5B7Vv|HN!*SjfzQ=xSuJ10 zkc^{fR@E`B zji2>Bbw&xrBH>BDPQh?XzVDi?uF`xxUE3A=qF@P1WP`}|PH~tLxMGV=0DOp_VRT0r#S)Q5ChirnS8xd|$dY!$0Y#;f@5UJC-R{!v$0%mC0f_Yst19im1X@ z%!IR_hQbir>v=*sT0FNWREu^$5+u*4^+qg*sxlXjW8fhblpq%v=EH?f`bwE;1U>t} zRK=G#*(CESpE};byEigg`zZ0Pt752<^MwqqJJCmK37F+(a%o6>4Y zu`hKzQk3`lvt*0H)GM&9me}43iX)1qj_>hUM+%?l$RW>A3LPq8Rn4$+ejWWRlpWg_ z)R%6*$)^8@emm5{>Bc`EeGFF|cc*aBu?m43rN@KrV7PUW5v1C1@@)H2X5>#@VNp>{ zpKRuOYnSG3G4q6qhO*INm`Z1cTbrS9PX8Fj%k{N;)%D6&d9_|GS7@3Y6RPW*m4~%T zsY%4eP`zifOEo17Lwa6nd4VSWlZ(V?*u!B;rpf2%m6@QI=?ML);Ax#yH6Prl6+p#I z=ic*KyifNJ==KPaKw>(ZI|R$-ju6SRLyTnehv0t@Lj)hvngj>f?E@l6OMi!qVlTXG6 zq_+anO!hCZq@I6?OV6QYbNM5Tzd>~k8lf_w@m-AbA90ymxXL@oavMv04<+tlh5G^0 zxgLfA(p6l;bqWIELYhtyWa!L^lBJ!RxsU!SM(GD-eD(%A!o=@%=>=s>iSwTW^-Ddb zfqD%$FdwMbP@oSS6%q}L_%wi_;U<>I*c+1(d=}`vMIi)bYXoo8SI!g-u}S*M`G}&Q Jp#2+;{{SDpmBau5 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DivState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$DivState.class new file mode 100644 index 0000000000000000000000000000000000000000..130fbc361baed1f9285dad33645adc2de3601754 GIT binary patch literal 1388 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ExternalRefState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ExternalRefState.class new file mode 100644 index 0000000000000000000000000000000000000000..cb1dd09f72c60b3d6741c6aa5b6c43924de92554 GIT binary patch literal 2822 zcmb_eZBrXn6n-u&EF?<{X^FK~t%cgWAPGfjf!Ydz7HkA0hy|;7+1w^uHygUU>Ci9! z4}U?w;*2d+XZ)x${sI4u<2hjoG3m@w#>wn`*?Z1&p7V0g=C6N#{T)CS;T{hQQ7qzf9rt<8>-a)I zE4%8EKrH`QK9w0;I;Bj(cP*zhEpXOyOuJT8#TDuM%5?;?d9zx{_+@ETca-B*Yp$s> zuCnDW>Fr3@Q<)VWk2DCR+b>(*a8_VET-TGknSxnX6mRrW46ifY+4?alljlGKJ5b@hPd> zHRgUT(Vpw}H}z;avO)@7Po-U>IWoU%svX~|I-ZUdfj;FF8@LpO&IBt(EAj``D46Rf zq2F3Ef{aaud%bAeswC~hf@yFguOo$eVcxYkvjfcqHOf_P;3D2J@Gjod@uk3QXi2x0 zWn1oatQsg_%|IM)8Tbn822w~1#4DEP(Pi4=Ted~F=r9QezGjgJ*f6k(Zwx%dw+6n$ zmVxg<{I+50C>l_pt9c`o-|GWmpoDROT&Q}xdzBskS+45%%JG9T9GGu^7f!4VIY7Hm zbxWDuik+zo%sgl$Phjkg>Cy#l?Ok-0)RUUDsVE1Vt9^OPXG?dq0nn(bAlW`kX>bs5q$x6Fns`+Do1k`B^ouJPgUZvTZWfv7U=dP0Smng{R z>6W+VfR8H6G^xz7ls!`r}-Flk4n<5a0bbBhuf4cDDHmM8Vm z(AxV?0O&iyy{@T|3;f+&Zo!ANJv8CO4&xCn*Kj^uwAt4aSno7TbNTv7D@iT2Z2oC5b zA!w8MfYt`D5ycf;r5X4T$pB)4O!ArW8#*^qzd-Cm+oOFm#_c8yqk%z9nWUJ;6T)EP zL+M!8OLYH)cxvPYbVj2`KS0lO^rq4y`{+HU7YF&G&7xP!;fywiOWHkL(H82aI2r`k zFg1h`iV4#k!bh~~z$mRXdXu3!i?M*nM&Qg4oBb1KnL#Xafar6?Qpa=*B6mzAMnKT+ zL)Y>+r!5hQLt$5%pCgZ8F++h zWQkWeFR(`_I<6ssbA)o4a1Obw5|=e3v`r+nhjlJ-I#1I1$CPpo!$c684q9=pZeW<^ Vi}gHAQIJ5WQ-lC2swpgK_!oX<6^Q@< literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ForeignElementHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ForeignElementHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..23e97d4d91ea55619f108894cdcf064b169d7727 GIT binary patch literal 4887 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 QNWMWbLUM{^jO5$EKN~u2-2eap literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$GrammarState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$GrammarState.class new file mode 100644 index 0000000000000000000000000000000000000000..fa74aadf622947d81b905f1fdfc972cf8644e840 GIT binary patch literal 2305 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$MergeGrammarState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$MergeGrammarState.class new file mode 100644 index 0000000000000000000000000000000000000000..d728b47e99215307af222b568a564df6f9a667e8 GIT binary patch literal 1752 zcmcIk>rN9v6#k}LSZJ3^K@kxY6_vKg7ElpE32D%fpkiu>e~0a)U9+7fvxBM6;M16h zM1S}IzL1wh^h_xrV6v3N-OQXbC+B?UI`eh+^A`XGEOsJ=(G=3SYPf5LyKcBKv)wS; z%`|RdJcTTBHYRM`X0R)Y*J@lbOs{%j&DB-zhnqr1;g<4*t3<%-vf^%X6$y7mdcjs% zl%MR`%rms>svnIN7-r(FBVKn)URBiinn6=!-dTDpbyaBJBd7&m`uY(=b^Hui@g~QE z&#p5hi(y$X^sM?)Jlm>m2=$V01SIKO4Lu&LbLE?JQ`uuO)b|wv8nw~MmAhJml`d4?3;Kqe;0Q0HGjh$ zbfd>X1_cKWx*QDQl7lJCIJkqm4(?&r#(f8Kcwl4R!2%xIpz0T6ryxFZDnRQf`vn!A z$+212{(njbLsfC>wZLtJvh?bpG7OdfGdxGbm^b}sr#m5}W@u~1I(LSqH%zI~U6JNW zo1rtwGvwp3_La#x&7}-!5Y22bOvc+T9qN;LA+}k^?hf4#8q5>Icc-ZRLDa1UnT=O( zJSyciuC-8-vYL&}>ck*78`(k06{~(gS8wJNDIIleMq{dF*BGVeIZf|)0=?$C64z%g zFc_W9m!Op)8ACsDFJRG6l3acpESI0yK_WM?4eNbF^&IVeNCMV3v{~Pgwtk@3`ib)- zA80}i;3Az2sBvfD>46|>;GdH%BRZ1XK{EFNZL};}?X>Jq=&ATy;o^V*HaZwb}DtVp;~e)klmWV zaQ(gQHq>C@2Iux;h8H>Kw(o~;ZXNbWBj^GlnqBCw8GfmC!yEnheVZ0Jlx zW9PtX?rurnSFSDaJ^v;iEG+jQpV~&eLr^Z?a_m~X>8foztR0QL+6nSH9*V$FyPFA% zJv(qF$p$39+Lj46)DhTF`Cbs4B+> zdd!2|Y{|DOoCX3%CkXO*Ys3fGqj0=wKXC_cQe5ZoAL2)Wb2Q*E*AYsf76F|ppXF`= z3I2eQV(BwPv2=*UM~VrI@;^-@Bp%@$_eQWM#27Ac1tySzCzdVFWy>+H{bQ?;bn0d(_t)G zT*1{au`I5Ir64wL;3hQO;yoIzay-8s#(4+lxlS>UBtMqp++XB+NdpU5KvlzUZ~832 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassBaseState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassBaseState.class new file mode 100644 index 0000000000000000000000000000000000000000..6870b1d042827f6ec315d19be81125d6adbdd89f GIT binary patch literal 1083 zcmbVLYikoh6g{)qW}EHSwm$2-)~Lw_+=^E5fuPYsArv7}{5stX-O+u7-L1r*C1?dd z_yha}e$k&Io=HOtRj83==FUAc_w3wr?|l9F`3rzGv}&m0f(r*1&FYfN>9TQG9IQIH zDo`yWUDVeEZg;{g3Cc+7tgq4{+si{0%L3N zNR>Jy)gzti^0C0(#(!`%w*~BW)>8rt9i6JJy<|t_FXc{53_H16|3 zsQRVO(!#+tfr?6doEt_2w>#8+Lz~2xCiTAgTE3MYW>NDn2hYQG-0*M`r#v*!bl?j- zo4Sa9$y4Co^fV*kXGV58%Xfo85+5|plUL(}*(dBKm6ihckCyIm%hiYURB)DxwIdx< zw)KB#x5FhcLf@J?NqdFw$KlIj*O@ZVy7Yhw2P;BuAG+Vel4;_t)W$INe5*Zk1_jye0s e1haR*Ji%z;962nUX9D1`c%Lg+;=di*x{Y6~k|J#Y literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChildState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChildState.class new file mode 100644 index 0000000000000000000000000000000000000000..22b50b221caf2701cf5c716911909047f516e586 GIT binary patch literal 2687 zcmbtW|5F=P5dXaJNOIvUkW%`^TH6{F5+FdoH$a_cW+WPM}?p}@~f-_Cx4|#9j-tA{UyKi@MPyYVy2LMy}M8hD?rI5yX zmM-veQNs`lDUxPcnq%Eu9}Z(aMaN6LTuz~gD}7kN>q(UOu*mAG30zBHNkCh3)!mA3 z_$q-n1$qNfKwq+L&r_bjg|g{1@_x;*oHb>8&bn)=ysPTQhF#6C8Lp@Dp0Say zm^IZfuJhT=1V{yfvWE<2`CUol*Z&!JK>e}Vl` zSPM0)z8c=e)h=lK2N0)e*0L>sUf`?I&M^y}n}pfu!Z6}bHB%T{5lAX~HAsrUnKsA= zHMkm~1Q43NU3LO9&*!uof-aLdEIO{Ts&+_au5Bu%x@sufFWR<4&1N}vKq;mSfs5^O z*^432L!4+GU)ga4&(k=v)aJbTS;LZIkDPj*sxM zj%myYlsX?9(Vexnz|#N0actk9E_B0oI=JIu*OPOddkHb;JGYEjP=yN|a@=Zuqfu{; z(c-P>CI!y6QDeJ@Z%|xu8q8F3G~PVrQ#A+jY!_%@8*_=pY#LMPGM7)jZqV?r_%2;P z%@&=UL@`lC(otZ#-2Drs(Pjlx(;26n3 zFa2Jow*^j+G)}vqJtn^96(?zpvqpZ8S4h^IPm#f^bOMc!QPQyG7xcEIeI%RPgvjQ; zMJzkMiJt7lCS-Q}9(uPB=RL8Bn+x#Pm}D literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChoiceState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NameClassChoiceState.class new file mode 100644 index 0000000000000000000000000000000000000000..8a7273bcf1de887004fab7649c55200414af0e6a GIT binary patch literal 4287 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 Sfm5_TOZJ=r(qa`w1AhQ74aMOA literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NsNameState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$NsNameState.class new file mode 100644 index 0000000000000000000000000000000000000000..0146d4a4a4e118e228d1e8ad1c64acc664411a5f GIT binary patch literal 2038 zcmchY+fEZf7{~w9qit6aT2S$XTCfM~mNTY;0iuzlX-sNJyd0L1uC}vecWcVi_yS&N zqT(U(0lf2tjNdG4v$Pj&xiC$4=G&e5&3E|E%&$M+e*!4uVFF=flSp7Tj{8Y6W|Nph zPWAFB6i`%;`8Xah#N3AIWXlXoRl{oOZiAcFk&uqnwhf`%qRBh*P(R|fBXoy%^t#ay zE&g2Dc7-8PKbCGoxTZmHdtQ` z3s}^!gylF^G^}DxJ=PgEN5^i-4x-Rhy1ljVvHaf7*X! zk5O+0A^HKSLh&0dWOwSk%LbQN!>T9Y`mP- zz)lePKz5KZA7E%*#x$<`j15FQMq17PN^5>WjInQsN6?EZ2TIQE5sAm+RiYOC6 z6&343w2!syv8GPPcUc+S!fnr;8Qk%y^VF&!L(%s=p{)n}3Hgi=?s}u{Aw%snB`8c+ Rc$)fGsJ$8iRb~z);4c}tLkR!? literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$OneOrMoreState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$OneOrMoreState.class new file mode 100644 index 0000000000000000000000000000000000000000..7d9e5cb3177e72ac0979e5286dd1bfbc818710f5 GIT binary patch literal 1904 zcmbVNZBG+H5Pr5jdQgs6MGNA4)xJot2oz0?5r`TR6p|XE@zZi_=;3v*xjRh#SDI*0 ziT(h8lyUZYHZ6%cj$CrPvpe(b%zyJLB1)z#YBS_<37Q-m$C}l|~WKl#}t=u2Q z0xCL8hD^}3{d|>SY0Gk3X3*re+ZNJyk3375o^W_a9+++J`NH&h$81ai{D;0Z&ma1N~EE`zq=?hA&AEnA9LN3A{Kz27vR^+#T!XGK47aL#43&7J{#Y5Z&pMW9hmq@eKyo7_|8rY0 zZ>pd0l|%l48yG>>fPpa`OAJpFm(3}58Cb@OfmzJys2NzrLxva0L8JU_xH8~WK3+u9 zng6V>CO;uU%(>oy*=af5cChxQmp!`q#GsUIZdtm$s5PsZd&DLg&4F=r{mQ`l(H0E8ajQO{Jz0uevU!OX(wJzj21RhFxJ8?erp{ zeAg34LM)O|Cdi&`F{B-r_*98^yB{HOhf@d))p(=9SQ)a>8fpHy63{Mjm%`mwPEMvvM3}$t#8d$?ah8M{(qx5aMGT>A@Uc}Mq z|E#YiKOsWQyWWA>Z9BbQu>Pi>Ji7SAppaYp+NUBkb43nAWe&!&%;#~kKE zU-Gzyg)p!@u7{~0Y}~{xXt+)1Xrxu3{X3zbcX5fvS&Ab~59bukuh4i^10}G8nufoR C{xO^Y literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ParamState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ParamState.class new file mode 100644 index 0000000000000000000000000000000000000000..25c43b048dec3bb73a24d3ec8226dd9e27d0be04 GIT binary patch literal 3173 zcmb_eYg5}s6g`U!GC~f)0ZQ|rX-iwM)0mVzNFk))Kte*u!<0a1>n`$QE3qV35*_lT zzp0riN!oP!H8cHDo!%=swi`2bL-Rq})jrNW_w2oQ_2*x|{Q+PSVJ~zn7#Klb$29{Q z7I|ceU)Oak8`R!3a09n^WF?8){IQzE9d7UPhI>ie=Vb-{SmWWZ`E#8&JmA+xA2#t& z$CiM$y}KhYvhqm&D05ZmmUD&Bx83r>?#_<#XJ|pGwk>dB#qyk7Sdq3@Q*Pkx`j*Q1 zsw($rM@{;H%3YJ8yeq>{`R>B5T`fhs6RvcWK)MZ|kbA<49gIy1OmzkiGk*S})BYIWDyR{omYu15ZP zmaMKz-{$Z7V1oS>FvtVx6hax&LUY-5m7lN5AW$?n*O|(jN{lt(SX0Ya5pZ|iz|8o> zAuyxO1g8foT#Zg}XuSOhSps8m&r-F}_S`_nHv%c;mgYkWq3zv}J<`T`)zO$%zCv+P zCwBWF!2dzDx5|>oWDToA8e0^K#6Tb4$}cZ7i!Q4|udTd5cMwWH6cEeAu&P{vV-#H0 z<0a2mcG+F5Do43AuaP(8VlKcgaoDU5w%xSq(`Z!oLczA zgoTm`1xo!<%3kRdEzb?5?FPl2Sc0O8H84?T<`vi`9^tWxD)$_?COp)1{9wWdseI|} zy{QMni07AcdrmbMxjVnn2q=MzhskC>>2q(*MxakxmI{KgbC)KmCT$+Z^Z_Z-K1A_U zw=~U$ZoDHyoQrkb%Z&T*-Qc$KXMKBQjjjPojnO!{+Ez8Lk3mQIWwoMYiGnllIhyk=n@e4{eYs{E^cR9uXQ=h-i92V z&9r(yv5wR9YcfJVK?$U}R8lX^)sosSE^^T~m0AdVNPQql50yds9;4nC{p@Jep2%eP zAu`$L=*ql=w)q^1eROBe?4#!?O?TlFdZ)<XgAiy>_i$F+0#l*Wf?o*?iUGSqU9 z3Gi4JpVtjtqP>DfQZJ!zW`2PX&yoC@24d(Qp484qaAv%)0e2QTTE%P^i7UgVGK`RY zf!=)>O@0PXYSS>a%PqW84WLvch@k&PmWv7=wO?SW4xXo$84eJ(@d_rJNcX*f*)(v3 zwbEvxYgceon`>b^P&d*FeI6I;(AVm`W6Ts0KO&mG$F%23)`b?@W`nkgi*$~ywCU!+ zG>xz(8{`TdOT@Q3d-BvX^gn1ajS=G(S>y4voN*}>qC@jqaq zK{WBz#2;lmv#hk}LtC=hnK@_A`Obaz*Y9sX0FAC5D-@8`K?L6<)9>{V>>9u5^^Fi35Mv*%K<1PACqX zid&U+v1w?v#L!#$;OnZ?o=Z^6p6}@uhWXq%uqL(`tc_qtGW3@{Uq0WjZ%g%3Y}bf$ zp&YoPwk4Ej=$L64*BScA8R_d6@=ZkxO~U+{?@P5&6JaRn`+DcjWY0oUoJm(n0=Ge# z>W=L!{*wldY0PlUV$Q}q#{z~q9^fIzB9=Io@yNys$78HAEOu_IQNNzXaiMdZ zxHwZCYf}69q8>Gy$(~aa)c6&xJb%~ZTDYzZ!|YUvIzXPQ!CN=WNeS2Yz1mJRUB#9` zoY7zyFirJDsX(1}R(I&qKr^)Aa>YneteH>?rOn7`FQDcuwD$b3uxV`J`vFZNsnYZn zTkEbhhhXg%9I$!t#mMev&tONe4vB8YaGEgqDaI`f#~80+MHqR~@BWDa1M?NhW7rIbMD!Rwy}k6Nj*+&| uu+V2hvSwggvlz1Gnk?mGO9|YL{29R&+OLy*7yYO%N9QrzuuODgaDYD#+xqAL literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$PatternContainerState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$PatternContainerState.class new file mode 100644 index 0000000000000000000000000000000000000000..c8f5ca2ce87e30763996043c8df676601c08e190 GIT binary patch literal 4109 zcmbtXS!`5Q82(OY+F5$r4g*Edf+JRFXG*6FvK7!$3lzH`MPyOoc6#aDcIMvk-dkvK z-}l64;yno-3A01YRXw9Yl(?a!BEXZO|Pmc{p0B& z#W*AnrD!JHt0&~tVcAf5>`r z+yt~-40(uJfmm_%S)}BlGC>h&E`BHdj01fG=e6rPrF8*Z2I44#$n9G;i(0(MAv5xXR8VF>$q z^(AZ)*jp6G0)t)R=cm+Fx-k-;NT=fVfzBh@v_S>ws+9;-%87(xn)R*iEmVN^m*9W% zfl@ZGQ{uR#rsDf#Gih;sptQMsk!fBF zyoI%3;S76wg;P)jIvTE}Sj+)#Wx&c(0GFWMiMZWdAryWB6nFE26I9aD@|d#M(8np5 zLwOZ#(zFzM>I7uNkS7y*W>O%!$W`^^QRrS(PY;t=#krY_Vdp7&B?-J%0s#dPSVARo z_Ag9cCGb|LD(78W`LgzvfOUcM=MgdY(jXc_OmDYg=!P4`0&S&u)qH$@ifB&r^mZzt z+;usddsWjSpODf^~)JiY0M)0?n17f!ZLi ziz^6<_t8jWiB8gfM6r>2pqYMrl-aTj(#_iIqi;dXz#E%J`Map-Yr2dYo(lV7Gw_S^ zP16XRr+tq6l_)3qAD~8jh~?rVtPvkmMf$|n6>;Qcb=9L4ZKS^jwP?pCl5i`@@zTs@ z>Zz8vNY0W>l8Q*3_jO3Cy_eyOdD_l9xPq~|jjO%0s4PbgMKx;@pOTfIp;~-yYv1I^ z$ZC&Z8}Z84N3flkW!@s_zz!Q_1UrdMZvi4Id$gZQ3_vJ}i>*G&Ple02I2byR%&qa^Y{$t*gbV;$n+%>I(pA7f{KJg{O;w!8b zU!zfcgRSCQ>=fUjUwogXv=J-NNv5y?16lJ1up3>rc~sP0*e1CY?`kK_o>x)H4pMUt z>un%3T+tF2>XXZ0kDmw0&OVbd&(28 z5rq>Z&-q5*P`GH7$xjh-kWS^n4`diK)m0=mzZfLrr@K!LC>M{_Q zy>3gWYu@syQmuy`_iwn8I{z$Yl8&Td3(a)C6R8_3-)Gv=*Jz`N1sfLfHb%55V9dfI z!@-b>8OmSJbk({S9zBe?s^{4GH#C;%C*9_=?mYg*vldY$HInBR=eX&YU?jb7$=TKE8VoU>0{qF@&=zjN_b*a*8(R z_+)kjb19T?o`(xOTukE<=J{@chs!+toW>O_+E@~>Jk`_!leH)6nJPDww^6Q}!1Xp3 z1%}P08)jz(F4P>qSvH%>^|!Pa`rCn{%YkmF9TMMCL8!~2+9}taP2E(hybnlywEo;P zo7%VzK`ptSYpx2+=k|b=zehwX{yGsIueqLH*>0}s;I3M0MAUspHSVdv<$Zi;F?E5F zJNj|mC_`fMmgni9(okWj>1Jtg8re@^92zIk1Z#s_O2!rzbNM}hM#_XZroHuLL!n>W zHcW6R$6lwZJC5EmuJ465eig7oZC0X;9msu|GS)~p)lPpM7rDz4kOA#oFViCefW@ds)We`3YPUlObMTc9#Hk!o|xJg@kk(VmI3nEA@t!r;g; z+95yKDDN~It@>EL-%h8%+`yoe8Ra-S46~PKsVZ;orIfz$Xky&C1qOcboq)fz)$w4C z4e7lY>Z8b7Pxjij+gOh}QK@IBKhqGH;3BF9fgiLhDH%G{`~>=-TxUrx>CmXa)Tlji z0Sgp+w}(%{q@7lt=TqL=&9IL& ze%_ZbL%&?(^y8PHkNO6UliZ0Qu%FgIl0Irmv_D9zOC-mV=|b@}M4|WwiC45u;1G?& zBm`>;hiNT&jWnk5BhA1uoQNUj$spg!e=+o+@DIcrSTAYcjWOMYA=?-yaf+mvMuld^ z$dG>W10=&t4)4P5kl9COU>$>P9mj+<(*>A`0kZ^P5zJ3CpT?OOx=MQN;aGt|i@O+k zjbsNl#h2D8NGlsbPPK&F9LJ&{3Uq_#kdJ+T7#Rc@n|M#KiCv7oMM~f$ZPI*BA3HSm z7W*u8BGYo{3^|m;ek literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$RootState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$RootState.class new file mode 100644 index 0000000000000000000000000000000000000000..0df7bad55f6332d4f5f0fc8af412e97294d054c8 GIT binary patch literal 3365 zcmb_fU2_v<6n=J_HtBY2A<)W~%16aEg(fWmLZAo*YPA$3NC7|Uo6T#ou-OgoZc2)y z7ovEfGdiO<1D9TNfio5uneo;cf0W}nn~=6inY7i;WZ&=SIp;a&J-hw;pFjQtkV2&s zF^n77j?>&b!;iE4n26yWZYQI7&!F}+@0p5WhkDj%Fgj&<#bi(rwpWs_@0FD$lS(?G;^vbj zp?sN~bS%bbktRXV)<)nt5DchCP1$lS8B$+b*)rO(=YBQ`F* zh{K#1CSJvBCU#-Bi5+;w#1QtG$YNLnOjsC>BBvqUvPLvTvVJ2>9Kf4VNE4qSuVH-c zQ0Jt|%UbcNCBw$1IrgDI`p8O2T7k^X)+(F{8`m}TDZ1~oS&^G{DdK)fSaLShXHOvr zN=K8=OWv@j@=4cE`hhB2L0QS<$Z*QU4LBx>a7}nPK|0=2o||WY**U3v${Q0U+%%!! zn+Q-gF^5|kCf4q3EmOulHxN|NRL$Yu7t9}CJ3|d|3wv5AI>|6}C$H4602N2qpL7dS z*_8A>IYCu&z9gsYtP*No!^oN`DJ+deh>C{1Sr!hJlx6vQK6{jsm%ZtV;isbSG8tPUa zWI;AlDQ|L*MDqio0)NI1=-zcW(#>;+isU3^kYCQy6{5Ed$9HnY^L3I#OyaCdiYBv~ z4Q-xT8u7y%hO7S%_X=KOCw;qZr%yedepFxS8Rv=%jaK+CNv+~I{N8p@RIJs&;z_qW0MZiR_w(fwG5M}!F)kG+j(XYCb4e;ZHfI0h$OZ~ z7SNuEcPt>f2)+#+1U^ULx6q?kuvwqSHvKks>Ys;X2}DAQMKbn=ZQaGM477#4{TL4S zB{5nv&Ve}ldHU8MAHL-xKZ zL!EsT2gw)uDka_swTG#FD~u0Ybo9AbA=k!uoX8fntOn{kbm`x(;Mr2dqev4rBc39D z_R(NOvVGG`Bi;|_)PG!Jt5LVrz%d+WB{7B*gu-}tDFGO7jIcI8M(+c(w>=z+$4RmW zlou>fADc~UFF(eX>Mrg*#nze$+h!sU385OPs(wFFe*6qmzlUD^7aY*<ItB8JLN)eGCMZgClQL=c5t zTj3Vk;4dTwX;FSm2G*tLo@ za%YB}+BbLOAcF}9bC`FKhHYbm;dp%0hlMhnjt>|S$8b0{16%Y6Eqa-Btwsw)3HnGM zRUC>gC^wa<;@%rraqkt07bKtJzDZL@lGY9}?lB2PIk51v19{9)W_k*kB_1=D^|@}G u16J`F$wz8R(00%WjMi?9apKtOV-kclU5m)kzd(_NRb*2c60nMCWWE8eQs$8W literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$SinglePatternContainerState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$SinglePatternContainerState.class new file mode 100644 index 0000000000000000000000000000000000000000..4cd093524eb9848f4e77c0c4b46838bee3f7eeb9 GIT binary patch literal 1276 zcmbVM+iuf95Iq~aagw^XKtpJ`6bO(D)Io@gRD^^gpq0{6$tdbuwRKmCk+Y80Ta^9< z;_|{*6bS_4fe+xL5VIz#kf4>42YY7LGiPSc%=qW8?>_)E(agia{h%l80Olc6k7-VJ)vImy@*bV?Kt33hpW)o zqeI)2&amu>Se{5AI?PAvLbQK@USNop{+F?>gch%MevN%;qwq40DVh=C4cnK-DE z?Wdi578)8C{_ftYiFT1k!G((%7Y*EUv4}GH={Vl)b9uNMm}@B^9o%-Y3XfrP>@hiw zK!)ezhI&-moA2nfxa^$J{c^%CzI7lr&jvgW=BDnW#ZL2t<-p z9yVzS*C*MW|4dlNUZIW8(Qklu$F!K_G+97~9_lvPv!vZ4+nh|-8(+ZcjjzajN}cBD zoh2t&Z!k}~YjlEGz*&+oV?u!jVrK+Vu78I05qSe*ACbX|Q{RwfN92=%!7IWhytiqhx(Zu}f(Qo_o%nyZime*KYu3k&PjWX#+Ygsnv{{ECVKH zbzIgluVaBB;)s3WFt81Vm@DcsFS!&tuFz4iWH2{eS9og<_kH0rtmF!nvL#F0u2hBV zS885CSe|fr-QBaQ-1CLy^SYHUlth`|QG0J9K*};iWy$s@W*O$Y2chs-{<$klLfQp_ zx@Nn!yv|Tb_kh)XNK?b)HiNcSDGG-Eob8IuT6sr!TYSeMPcm02aA%u)w%RwHn$pam z=bzfus_+=Hy(Di0Qw>aCa!;;1qAXm=a5tTM!uPr5aH@V@dbYcl{Vz|&+q3FrCwQw> zNr5{xDg3O`XS%#B{3+4vey>N>yDJwlnQIvJ+$wom&{(_=zME1E;BeF(5=-6Afda%LHE}c<@G%Sk`fsdcTL(|Ml$SomD9bhkC)cZi-!AbL4IA79G_aH@Z)-)==JpNc`?t z>K?QC<&Sn!&aXaby&gk2t%@4<1@+)u*9mZj{zW<%`Vgjn6&0H10aa_VN%aJDmZUYH z(HO!o?MG;}g-{SNoS8ZV%X~p7qa7lgnLdQ}iOxev(VSFK>=k0{B@*m4hS(b%C4Y*} zL0F?0Bdb;_V~DVi;{;iiffIg&Y&`Su0AcMhp|^nz1;F0IVDAFJg~rtuU>qlLir^?5 zr)j0q#Yya`fOH&ZF;3LZkyoQz6Ex1_LNoC$-BDswjl{)Al=%gW%mK8|h_pE*6c&3= z!aiVxeGGVH8j&p?sTPk^i$|)-qci(Oq=|!)y+}i`W$i>!C4~0v%F(yotQ^B+AT)$b b5IBVd*)gJKVh%@0N0jU_^7WBjjQ0Hm&l04R literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$StartState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$StartState.class new file mode 100644 index 0000000000000000000000000000000000000000..f21c518fb4ec346b41c038d38adc365acc66bc7e GIT binary patch literal 2419 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 J*#FIk{{T7mbr%2t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$TextState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$TextState.class new file mode 100644 index 0000000000000000000000000000000000000000..a939b7fcdfa72eaf8ee7f3c6948dd9fce9f8f5a1 GIT binary patch literal 1540 zcmbW1>uwT36vzJqlr1o|QpHQXv??kWWuevj0WVQf6BA;Z&@}PmbeYI1%#z)~&}Z;v zG}_c^;sf|l#xuC3)R@3Fo82?#?3~}8J(v0Q`}X?`qi_mVafcz%@Y<4LvFR%LdeGaI{+ zOvFr2yq8--Yw0V7wOLrBT(?6XLZn-x+Prj4VzQIBaSwk1`L+4PKe<`}}x6xmTuU z=|s2;^QK|VOfY<$AwlCvqXjm@NSz!5I?m#Bz5#SLn1(0GNdsA7dY|+~T0KOJE+A7X z?}L@f2Z((pHHNeFOwuOAz936$Zq|fZLXISG0hdF>1|iKm{sZwhrLSNINPHrFlCeL* z;A6%zu7r$dAtPt}zhRCA0`64wEzGB literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ValueState.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/SchemaParser$ValueState.class new file mode 100644 index 0000000000000000000000000000000000000000..d6a3c186b51ce7a3a814bc96fbd972c61c5c6b37 GIT binary patch literal 3320 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�GfEM&4mZC z+8Btpqu9NM5cr3&&0KRrEp@}Pqg{J~&ZsSuP^>#am9#AOqqw8e+i%-!@%IFv^XbRU>y$lQI%TLlPM(FxuR5c2N z&NtxSt8#SX-rAZ_js5`LG(xXFNw2vdme@vD(0+QUf@yjsq?g0PJ~|VN!0)gWTtJny zhGx-Pnydew&ei`wwfY~i;r@wM=zpdr{V%jh|0`|NpP(!B|I&W_A9O(fC#BF%>;I;# z{vUd&{v=(mKSeiU&%Ptf%9cARf~|8BEVvGK%Bt3dXu)2teUGXGu58vv)e%=#ucLB* zMeP|!c|C7X>-kZ>h@0_;G|rZ+HcniBaSkMn*rbJqF2*eE@L@rQbtQ~C&457uG=n=f z&Ll2`NOFcgQa1(Xzt^q`Rfn`Y=}eHCx}>&lgvyvPHLnZPeYJIE)uEGg1h^)>wyru9 z!ja|m@)j1x578T%j2h!nYOFCHqMK{hXoe6H#G7iuHF}O!_b#ZHGChous#-{k8%}wT*`_1jqF>DZGKI!WVhC&T+ZU;k`v% zaZ${f!Tqp}_(KDDOnD43a-aC3yqu!9<1dj^ksM1xalCK!0P(+G_4vWI# z|1eeG*Pf&4SeIvD`K)*T9B21)O!cec1K>i=*KUM+ zxYyy}U2vuqEMXI?Q^fKM&H={flS{(lg8?L_PJ~1s_ZN{Ep{j|Hi1SrNB#Ku~I-Mei zIN^|3>rALoTet57O$nC6jst_0HDGE3MvlP$>_kF@2RIoZQDrc(VAH0s9cw%n#0#@C zLX#&#;%ZJ8k$8wEO@u^-vs9*}Xo5G1qlaY^F$@0fbrRbwVb?5S-tYHo*FZyj*rD4B zd&>tE?2XSTPvCe7+h<~*y@jw0<7?3Jd_TD?hJ!_qK2y=J<>xzA^^0B}Y}c_x&pXWv z_=N$}<@v<-S|r$MUc}cqB>ZmtG(>{j7))FfzL;MUAdwNQXs|>t<(D}Vy#wpAe9K1U zOMQgG!Bp(;l8Ea<5!;1ioITU3^>W$Y3%iah@GJOwM_{D&&=U!d2S^uA>{%Y`-2SiR z8-k?^1$)UjrGrNXN%tzgF>rRCCL#l7M@3WKUv2`qfY>YxHthIg^VPw0wP#BAHG$s5 z!DNHI>9uasu0#0}(ekRh%c}04(s+{IEyvd*50ajvV@S;0^B7fDz2{+i@7@RLo?{dS zW`y4NAoa`4+TNf(>Zu-S>7|&L*8#8b5jhF)O-Ke`hXnTrfa?a7F;@US0JsnELBQRB z4*{M4JPF4h0el$mrvN{Q_Z;Ad@cv;y`44^`0sJWNU4S3M`=x*%2kZd+1mGorp9K6A z;G=+#0e%|rGk~83{2but0lxtFMbKFT_$9o58SpEBt$<$z+z9wJzzu+32V4jE4Zy8{ z-vqo7@LPbZ0KX0R9l-B~BeVkWdw8!0d>pVA@cV!Z0e=9v0Pu%^^8kMYI2-WCfJ*^? z0{BzFpFysl1O5W=mw>+l{?~xN0sJlC?|}b3;2!}02>2)P9R~a}e*X*LUvXyt8{iY6 L2>l)K9~AjN5zv40 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties new file mode 100644 index 0000000..63d7d7e --- /dev/null +++ b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties @@ -0,0 +1,38 @@ +no_comment_support=SAX parser \"{0}\" cannot report comments +any_name_except_contains_any_name=\"except\" in \"anyName\" contains \"anyName\" +attribute_multi_pattern=\"attribute\" pattern must contain at most one pattern +combine_attribute_bad_value=bad value \"{0}\" for \"combine\" attribute; value must be \"choice\" or \"interleave\" +expected_define=found \"{0}\" element but expected \"define\" or \"start\" or \"include\" or \"div\" element +expected_empty=found \"{0}\" element but expected empty content +expected_except=found \"{0}\" element but expected \"except\" +expected_grammar=found \"{0}\" element but expected \"grammar\" element +expected_name=found \"{0}\" element but expected a name +expected_name_class=found \"{0}\" element but expected a name-class +expected_param_except=only \"param\" and \"except\" child elements are allowed +expected_pattern=found \"{0}\" element but expected a pattern +fragment_identifier_datatype_library=URI in value of \"datatypeLibrary\" attribute must not have a fragment identifier +href_fragment_id=fragment identifier ignored in value of \"href\" attribute +illegal_attribute_ignored=illegal attribute \"{0}\" ignored +illegal_characters_ignored=illegal characters ignored +illegal_name_attribute=illegal \"name\" attribute +invalid_ncname=\"{0}\" is not a valid local name +invalid_uri=\"{0}\" is not a valid URI reference according to RFC 2396 +missing_children=missing children +missing_href_attribute=missing \"href\" attribute +missing_name_attribute=missing \"name\" attribute +missing_name_class=expected child element specifying name class +missing_type_attribute=missing \"type\" attribute +multiple_except=at most one \"except\" child element is allowed +name_contains_foreign_element=\"name\" element cannot contain foreign elements +ns_name_except_contains_any_name=\"except\" in \"nsName\" contains \"anyName\" +ns_name_except_contains_ns_name=\"except\" in \"nsName\" contains \"nsName\" +param_after_except=\"param\" is not allowed after \"except\" +param_contains_foreign_element=\"param\" element cannot contain foreign elements +qualified_attribute=attribute name \"{0}\" incorrectly qualified with RELAX NG namespace URI +relative_datatype_library=URI in value of \"datatypeLibrary\" attribute must not be relative +root_bad_namespace_uri=namespace URI of document element must be \"{0}\" +start_multi_pattern=\"start\" pattern must contain at most one pattern +too_many_children=too many child elements: only one child element is allowed +undefined_prefix=undefined prefix \"{0}\" +value_contains_foreign_element=\"value\" element cannot contain foreign elements +wrong_uri_version=namespace URI has wrong version: expected \"{0}\" but got \"{1}\" diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/Driver.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/Driver.class new file mode 100644 index 0000000000000000000000000000000000000000..0edca23047d906a0413477a6c635bc06bb29a892 GIT binary patch literal 6748 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/ExegenDriver.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/ExegenDriver.class new file mode 100644 index 0000000000000000000000000000000000000000..6f37f322cd002dbfa36b04c25aab6eb46734f448 GIT binary patch literal 580 zcmb7B%TB^T6g@+MLa96j-^P_eVyJtF8y_1RU7&1Sn4wO}kkXny41Sg?i3>l#k22mV zCb%FmPBQn-eat!M=6-&?e*ieazJWZ}3uqc>VMCcs9a}oK8S;JU%lMQ*Yab06vS-1g zV5r#A7uU&jB*I%h@+ecc1BZJ<9!eGeB(w2YMhsos38q#&<}!E^eiS63Bdkz(eCE4W z5=+mzm1>H_Pssf&)o7jH4frX`fe{(!9$mD8!O5T#vmoQluB0Z zH*!~jnb1*SFhxrFkVM=SI(AI#V$Vbw6^7&g$YrQ5HQtOS!igCU|3X-d%20|#e5WK_ zi5G@ud)2%+K#umKPKGYY2Sbrw7I{WK*LeebP0I$^e45lyqPMwdAiqXYQO!pg^|?=8 jeKzWuIke6k*(E|58dY*BZIK9T(HiO1DD-eW% literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/TestDriver.class b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/TestDriver.class new file mode 100644 index 0000000000000000000000000000000000000000..7c091d6afc1de54ebe3ed2e2206706f09c799aa7 GIT binary patch literal 6974 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 AoB#j- literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Messages.properties b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Messages.properties new file mode 100644 index 0000000..9f5da9b --- /dev/null +++ b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Messages.properties @@ -0,0 +1,17 @@ +no_schematron=option \"-{0}\" is only applicable to Schematron, but this version of Jing does not support Schematron +invalid_phase=\"{0}\" is not a valid Schematron phase name + +elapsed_time=Elapsed time {0,number,#}+{1,number,#}={2,number,#} milliseconds + +option_missing_argument=option \"-{0}\" requires an argument +invalid_option=invalid option \"-{0}\" + +usage=Jing version {0}\n\ +usage: java com.thaiopensource.relaxng.util.Driver [-i] [-c] [-t] [-e encoding] RNGFile XMLFile...\n\ +RELAX NG is a schema language for XML\n\ +See http://relaxng.org/ for more information. + +exegen_usage=Jing version {0}\n\ +usage: jing [-i] [-c] [-t] [-e encoding] RNGFile XMLFile...\n\ +RELAX NG is a schema language for XML\n\ +See http://relaxng.org/ for more information. diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Version.properties b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Version.properties new file mode 100644 index 0000000..3634f19 --- /dev/null +++ b/thirdparty/epubcheck/bin/com/thaiopensource/relaxng/util/resources/Version.properties @@ -0,0 +1 @@ +version=20030619 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Equal.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Equal.class new file mode 100644 index 0000000000000000000000000000000000000000..becc9394a07ae74387e7dfbc6dcf10e2ff3f177d GIT binary patch literal 504 zcmaJ-O;5r=5Pee$g<1tsP!Gm zO~UrS$_TaJ3`q70XuS*iB4gN=log2ggor8VagDXeEOi+2qU zmkqp!_jP<=;0mtF*B=_#z%>KcaYGI_)A&fo#|BKS%V9H(Ejizk2S3rVEs$(=Jb@F9 zN7lDitz-4twXKfjc^d+$=Ad`fu?0>Bn*-nJ)b?zzKX6<2rrMKM*PNc?-w-I2USg~s z2xwdVBQkOgr)TdBx=q`?Z#5-#w$X1{ode5t z<+lG#4Xp+4ycYE}bu{W+VoEu!3tWvsfBip5%=27~y+EdI`$2sL7E56sw`kN=E`~F>Ukmi6EW4WNE)Y z60g4cWK4!Ou*4726u(;u&aAw8Vo^D#SiuDpIljr&HZ2mIjq)>ya^)!!zbM<29A}V} zJJ2wV48L4&aWx-UV-csglDm@5CdAt~9Wrl)%siRN$`D%ecT7D;>Sx*~Aj#4PAU8qG zN5nkN(EEV691`~!i}a;1B5EWaCfD|3sB?;XCa{mFg^)@HR&bVnNRQ8j{0HP~D4oUFs@~_bU#7$0#A<~UXzB)wa`r;4BRg#O^gCUH@Pe{#9H_9(y9zH{s zRhpU2aTp^194DSamxyt}mXRiR2|AWpwiUL)Sr+mf!@NL0O4y<=vOQ$lbGVF)s)X~L StEkaS`V__>_*W|1;L<x0i0n!MF)9;UV=VDe6EbDE*UyU$5V!IZ0C|8FO-ot^>QZN zgP3Vz`h_ipo(iX$`iBgwh4Kss6SEdt&2LwgvgYc!lx@P0O^lIltcCZI&RrCxUGi!n zlwC>VZS6|Q>q=?)8ZN!k?w~}ks4Ak4yoIZ)Q$Pgk*Fkl${;~s`VW5%^G zk9^}T!@qdq5CQ#evlwlfhcKp!w>1!*yn?+D5g;Lqi3W0P5oT>3p-WlQ-)V6d+Z0pk J1=yq5{Q`y9co_fy literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/OptionParser$MissingArgumentException.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/OptionParser$MissingArgumentException.class new file mode 100644 index 0000000000000000000000000000000000000000..198f3a7ba4716e0ab5f7ba75dd123d0cdb447caa GIT binary patch literal 462 zcmbtQO-lnY5PjM1cI~>gw)Nmu=s`Ug?|vagL0CUP={;S;HnN+PBrE)qm7s$`jA4usL-$x|y-qh7x z+6OT&Nf~7(7v)S?)$kuN^b6$}wy%|QN*Cw0s4J=c#Y--iUK!1hUTH1uv=q)sI(e4m zrs94flvzscOl@!h9h=6A%9+_z1asu^my+I8?Go<)ifQH(Le$-i!5 z7&msj6uRIm@0t9?6*~y%kDJA4(?o<_V!Y)*wEqV7N$cbW);jw5zkk>O@Flz&#ZgQ}(1B@LF39pNS!QIJH8Cgq#VDS_(@~hXB+F%4Y+2?_ z>>>YK>W!GC8 zDlJtDj#p`tj25-ZcvaSMC11?Jf0BR!YoYN%A6URP}rF%dgY4kRi^EH)d{jB zeF`ndUC*tYREWp#x3GoL#I%BuDK0n)yGC5k8LJlNozi)GK2J_;q?ohw({{;~bDe2a zmR&}8WF%KC^jDT`x47bX(6CZXj+(ICY~MJII?9(Sd7 z?agI)NT6!rYxs_ZK0IWhA8Csn{ACLRvZRn^nl|Iv!o&EAiRUeR7vB@@7c6`qKd|sa z{K&$K__4y^c0h1w>nB+F30`6vwq@e;@~CiVJNgp+*DXAT(-wY;pRu-^A3I!KTy)s9 zl2y)!9t%ImFD#tGH-!47gWbx-U(*B?!HIZd?~pTFYdDjMR1Uem?o)v`uw#4eTWtGVLJ zRfS}8*ZZ1-*`}7d!^#SbL-Dzc>@9i6TdFK;7o1BiIZm%3dNkr$X;ssenKi!XGbj)# zSLe%m;z=WAw`|#CNG1wyyQUg6MKP)Ik&Tc4u$+w*Hfz3zDC z|J;Tv#XEzfLznknzkKkDL?J;prR0uRCc@PBc@Mq(d>rLKH4&5EAQh0l(K}m5@9ZAE zvw^tBq*u7_!&fP%@QA*9lopggkLxjVUO@;ls2@(=f=UK&B9K%!5fsXhC6r9vL`yQg z@kf|95l#n_A0Qk|Z~PvS_q4%5u165z+75%pB52_k)MU6}>}3!KNFBj$c6BF?Q>w>z zhZ8u-6CLa4C{0Pg0R~2h*Td`QE_Wfi4cs6RfH-W?%)Q#6eve1jcy&MsK|$N4R17b{OD(y zjRDbVJVvK#T>@%nK(UXEyQo+t*nq=C{81c490?@(MM<$dX@ac}XV?d`{Low^*JF>Y z5tPpnaxbtqUc;k!gMINfJL5x^?a##7KdAX1oKPlCD$ZTig&}p6V|EZ3bsCSUQ9Plh zI92b!`V4J6PG1D9x=;tg+qi)z=u6SN;5NYKXy=Kun5&?4j!i>&;GllLq+)@+HXR>lf@q4T$xcprOi;{j%QZ>+0^edKo6u)l@_HGF}GgU5_6<1c8X zSgfap-gO*k()c1Zx(LR7TE2Jvvv;WS;Mw3KMyHWvnGZL~9->&XQ<|YJ{i31PKl|G{ zhL0IdVuyL(90Wb~-Xm~iv%q^yOE2DHRonIc36thekf-@a9hl_EIu8p|98S~ZT%gnp zku%Hh@*FF4k?DPkr%R~dGMfgc5Pj<;c9XiKN%}!sXq!?>>{OUDMO-S7Dn+GIQKWL)q^o2j$8Mc<1^7^X9!b@~_`tz5#d!w}c|<7IsQ7P%mN*k9648>Blh8H3j zg>lpsUaX|=okWz0)Q6*UQnSz#sy(H+)^PsOz%bY6qkgI)*Km%=gt&~kPc+NZCf;-g zqN@&^cMQ3(Gq}B>tVqLDn7U~Eo{c-I3C!q|K zh+e(#iVG#fz(xu4Hf$`|SjBxCYglL4`TtHB7AKQa&E%%xv{9#@p-6vykQhbZ)t0u;vd~`#&-N6~@^Zx$kcC26=b?28GYmVxU5C9VSH!c_Ofh zVu{AD5y2+Cs#Mud$Du|Q{cR=mEV*d`1`#h~C8PJ~)U|?pjlw6oq$FmNEGGl)v>_W< z(F>xC);w3ZvO$gDYG*G literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap$1.class new file mode 100644 index 0000000000000000000000000000000000000000..86c8b4437e339f57abcdb9762fb206ebba8c471a GIT binary patch literal 936 zcma)4O>fgc6r6RO#F(h10m}DRTSS8ph6_S!#eoVWi$IV-mEg9qmv$?69oZYy@|!ro zsS-$V=SLxCov4k%p+02a?#s@+neqPl`{NgYM_3Kf#LYHth45Ux-Nv0ZRs>p`+GzVs zpt0WD7Vx+7R0%BhwNY=z`$JW{m&1&mZa+_Cwk-?o&eNuEcXcTMflh3UDz-9NmWrKw z{UqOy?5@=LNSQJp7m13-R%g-Mf}O%1zLul4#~U2GqpZNw^-}?Hy3yE z^S#h5A5W7%O5^DacM&VUIGXp5Aii_sA>`Vsnm*2Q-HfQBHfKH&J!bW0T<^v8eiu)!c#bwacRo&pyDL|e;f-l4!mOrmvLo^+@vPw nAovOI!x0+4=QMO@Gz7;!0$jy4GI+RN-M@ha){q^am2Ce2ZhyVx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMap.class new file mode 100644 index 0000000000000000000000000000000000000000..b93dd369f12bade160828b9b7ca5ad8997edbb7d GIT binary patch literal 594 zcma)4%Syvg5Iwh#q>pG@U-;gr*lvvOgcdhNA=qlcBGg@)UTR8uQ<7AueK)cH)eCs%rJ9i&dmM#e*Xk;ihUg$B?xR4k;Ar*9UZ#@`O9vvKM*+TIR4a(9&Oj3 zNfr9@z>(%Way_#bFcL(Iu03lCWXCcRIIsVkZjG9a&cuGQP0v7D1X}4~C1H*gF z@WFe3o-Y6^Bn*rpCdB8WvZ>rDEeVs8ElO#9eGuiQQu-?GG8Yd)h|aa~ne-}U7!ej} zapyi0D!d!l5_sj6=D&d1ngBwwH%8j67S2gW7&ln1g}L$LC6}ou%>QR%8i<`xq)|5v RLh7O4<|ynq+zEr=hF_j>LID5( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMapBuilder$PropertyMapImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/PropertyMapBuilder$PropertyMapImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ae856ccc500f6b4fd17b446805da75fe8b2aa7fa GIT binary patch literal 2026 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 F{Q~WmG<5&~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader.class new file mode 100644 index 0000000000000000000000000000000000000000..bdfb4352f61a04bbe743a4ef3d15970ab5892590 GIT binary patch literal 1605 zcma)7+fvg|6kVsc&=9T)h&KupY-wq!f&xWUkRn>^3{_@$4B-f2(u7G<2EN2k;ML0v zFgoKaGk%ogJ_&7Uktr|dob2q&I%}_;{Q3LyH-IU;lc69fqXWq>CXs4GTBdzUMh1^% zJi)YBW+Xh75yq@A&qS$gx9 zrWzZnt&8UiW5C(f%akK;soUIUP}WS7+slSpE_1TS@|smjJG-iG?Q^qiRcwu?D~@iY zi`+iYH6HZ>35K%6optWHP-G&O-%}6Nw4s_i>7rxn=1w;5ncVmlvr^)=>gbk9!TySE zFm!tFP41*Wt>?)s*}Pm(OD^~;*%*8p1r1!PqZp=rdv*4 zIn?;R09Tfp%y+2Nli#O zN`BEszM_J!Xd_#l1!~+_GF%owIOK$OLdN%?; zy}L^*m8!v*!9Cn3AcM3%z(dNFfL!w%q8s~MkaOhYqsSoPXs;LbZkTh6^m`7q)Ikip zsYfU*K;fgbcVfIbAyLNuPubOkj}W6oaY`g^J>jki^wBQvrO+SYHldHw4z$saU=q(D F{{wDbgJA#w literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader2.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Loader2.class new file mode 100644 index 0000000000000000000000000000000000000000..cd96f0005eb9b7a05fa98fb3df1a0baa7d8f3576 GIT binary patch literal 1970 zcma)6ZBrXn6n<_9S+ZVx6T<_~g%1o&DVGloOdFUHNH{ftbCt*T zQ@d2Ny{*zz&2BU*zP%}fvOwyV>$%~iKu30LRUkR#Z%TolitEYwW_?2j%l1Z%n!bwf z*tJzVaMe9lc7(D{pK#l42pAFObpdP6^JJjoNIr~J9KT))w{6#dBE5#+3>;Z%hHkC2 zB!j1}BQvol>2x@?kN{gUT$GU|0rJ@+^q0cG^|s1mkxIi%d(FBG?9lZ+LZpM1XPo!{ zSPAAd7-6`6X>MWqnIoUX2nG@6?YhpoRkt`W1JqbNot?my7gK8$o1~JS#xoDYGz@$s zU@qxu%($w=R$PvvifLgG9~-DxsA68=Doa>wFJVz-RXkQg3kw)CaM!{oShUcO0Ru}G zma$@C6^jP$S@=}F3}M*7nuT?I#txm-pe2^PCPUw2_J?N+pW_R~^S(g8u2Xv@Ej+-( zi2BQPUtshk8qu6^Xb%oUt@h}K%=_Vt-}E*Q%WS|F0HL!d4&g*uEx_dyI0#&G)BIZVVChIih z=JH2nU7-8OItz@vcx5~pmR1%kq<8bE(Za@K>4fE%?4a?;52Ee8eH0{K-}U3&h->+u z8k5BE3A2!y;2QPv7h6qOLM2&tKmWDuGw{9Yvbod318& zhq>Qbtf0shzkz!wbHyilpW$|&r_~TCFK)p|i02E3CCxe~KBM-mNN)&_|8kk1OaQW=6}1>jk73;XWBZV6h(Z z)#0mT4v#dy93!U5Zv?LsV-%+LR!qlZrs_0`tD0#RW3*Dmog`0XW#*HL(>~7Z@)pHR yY1=O~{@KXt5X)pW6jq+rNy-A>uW8RBUZotNwwDnvk%>k5K4l-}Eae;}(Dg4ZSn{L* literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$ProviderEnumeration.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$ProviderEnumeration.class new file mode 100644 index 0000000000000000000000000000000000000000..d3b393a7e5811e600ae78c505ce7d246a7485cf4 GIT binary patch literal 1524 zcma)6Sx*yD6#i~oI&>Ho%c8hIE2wP|3LCfG|_i|l<}KIiV3l#>6~-Ve!g?={q_6X4*=s>QK4ZZ!Ov|K?HKjAF%@}?tC+wY zkDK(ky9%Zh+*6@qRKa}(4-`BUNLaG&u39Bo7Z9rgakp$%hsOod1;gIWyJg+9_oP*| zYmOoFHP@`x~peK_p?CAS?zM@-i^6T3>(s1c4Sb6T0 zV%~A|10UD*n!Emb!LC`Q>T=zXdtS}c3LXhS;AwNPnszfW?co`zb7+zJguu`_JOtFD zKhhP`!(0nzI_7nzp$EMhE+FY~(;7O_rC>(GEantE*6;-L8WymqVF}9unFbvH?^+<` zoBCU{W*2KlIfV5D7=g(qYj@W01iBhE1S1jXZRGlAThh%E5JC=~kPbGnB#63U$SUv4 zIKiK4KFe@*d;m7MIJU#p32Hwj|ow<=iL~_T7=Aws)eWogci~Opj zpm~Dkm&j>!q&fO=l~mvw2EtI!XzA(Fxi5(EANh)wBgEgMJvb=upu|2P7X3)0Ab8w& z=sy)WeG+((y#zHHXz_~}41?x2nP4mSigg~L^;6+H)XihG{q%$Nvd%;pz5`LF8lWV_ zUebP=K3~_$({(=l}o! literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Singleton.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Service$Singleton.class new file mode 100644 index 0000000000000000000000000000000000000000..d475a5bec409024a3c0bbef944bfe76845de1b0c GIT binary patch literal 1070 zcma)4T~8BH5IwiM?9vY?)`AjLiXe8kV!@ASg7F0*F{$`aL!vKcyWY@kws*;POYj%@ z;)5m{5>50?6MvNP-0h|qF@cAjduQ&UoD=GxXGc^LeKy{bWiy7Nk)sN_+S1qG^g=QMey zCbDnC6@b9Q|HwO&$;PIhK<;Q=n+<{Gb5v;YZ&lKjN#F|<+Nr>uKu@fcDZH)sP(l$U zZ5k!yQ4px5+es&}8?}diH9Zcgr10z@~eOyc7Gz}(ZaDwoc z7}3ODGg}i|&>%li{0j5sF($rix8({FZG0F*&S8T04QjnZ*t_I%5A(SH7vqJjMU^?1 z$y&E9Vu3AmvnM>YR?BT1L!3-tM0GXAsf{wm$}L>Ua4cNKH6kn$L5r-Vb_o@p75Wxd Lae=w>Jb}qSDW2dK literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/Service.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/Service.class new file mode 100644 index 0000000000000000000000000000000000000000..68cb1d731a7ad3916b527a3b8d4b497581487108 GIT binary patch literal 5181 zcmb7Id3+S*8Ga_&-ARTagdE5rcZ9GBgiAz;{t6+nX?GWzgxE+coopt_!e%Gkoefa2 zt@N<1l~&LeER|~2RYVO)Hb4~XQSs{G(N;_8Wo>Kk`>yo)W@b0DF&g^E%y+%td%w^3 z%{=qQiIV^p;|&EDVRs>4dlcM+n`L}K#upWMu~)qIDYz7S#qupOzNA3GUK#rpsP^QS zW!x&`fP!LtMG)O4<8}q5*js?FiuMk{^G?ybOVFeQ&D}EYQ7{b$$KhTa60iGY+%MF4 zKt{hHJ1lk`5w8b@#G^6>WTa&bDwv65GL9GEgaSW?WIR-Whh>~pP=iMld<~BZS&xa= zGB@%iBcwRzbb0pRk)lDNNp>%!R=!=l1K9=m!~*BEU*g)*s)tP@ zPHJD&QdmM|AZ+y1nB7{$=+$EhBN-3tH5U73TeS+?Anx%tx2$ezksvin7++_^5~db2 zTeWCX&u50vDRN_IQ)qRtUJNB_#9`gKV6Z;aB4+X=R9iY$P+~={#0nv?B3GjD-}ac< zt(%dsgoXdlRuPBVNGxJrCZVkIO-^0VD#24{bm$T$1R^m#l?6Dk5Pv(cCq?F^j6|ZcFthhIu zab^vP)Gpo3Bn_#jR4#A@GB@_)dyKg5qRp>da3!S}?VEFXuWR4T1R(D@E?cZb3mImE zk&JcJZwu?aA~#16HQLdRSb6)FMA4|;rA1eV!+Ij&CYtOLM~83Gy7Y|K3bSd;VDxJ7 zgwD)z@?FAwCwMX4tl7{MSoPK}m}iTK7&RMWiDYlD5jXXY`dHZLpf}yRNGv;v2_@A@ z$cu1Lp556P>rI;UzpnMrd?_xWIJ?%Qivs7g&os8MP$U#soi)i$32yuB_;I?^BKNXN zOlFTu$~w0?`N?=xLXj;eVr3@h!|>YaAliyBsOC0*BIewwymv}uVUZaCcF3G6SlH(6Iu&DSIeof4@ zR3Rp~D%&n(o@N_b8Wye;M*W6)oFRNW@L*MP&&rHYvbC#R@346aUcZ&`I~BjjAB6M& zsNzqe_h zvnPI`xbQiV8%fiBlCS4YZTP-Wz#MZNT$-^x=TOTQziS^;vsZA5ii?Qb z_nAy<#cY0wT*~{if)a5Cuva2LT->O|F=dT;5?W&(I&7z69oF+c{vK0dk?j z(9q6S^um^TA&f@{bgoJQSseqHb00tOpbTMJo1faB-_Mb)htFEsVewaODu?SFaUZcc zNLP{C!#z7`Q{gGhXEXIUrc1a5-uy$tQVwTG`~;nO472FL)Y+E>sYSC74R+rmm>uAt zs49&)K{{t{h@+B)X;kdPcy{yHy})xwxH<)uPXQlKFm?8*6`0i7YpKUt+P2wgW0+@+ z*ukB zZ45UuHhU1qZpLE|<8Tu`gqtldH8GijOgG{2JaQ=Kt}RTUEtIwiQO+4wuZO*a)r+yW z)#@4St;I6*Qlf~+PRG}ZxMeuLew~&TaP5pgjRk=r_}i*Vss>R_M@$IW!$o2^gqpVM zK`ds+N>;8}sd$Mee}$K>U9!Sg?%NMv3fGkTcCV1j<$K8$Si{H5r;yLZd=x&*_>6bj zS!~7pTt2mAmBRECrg}xEtlaB8fFjQd?-WnDoW{~Crg+j=whxoby`BS%qZm$R1gCiN z(^#H5d$qH!W>*;B3;P37KON!a&yG?oq?lKDpIgBhQ5YX)82|^kdOO$eBE=mHE{r_DW7?;vV%h^E}fAly&Hc!228&j3Hj;2vdQ2N}@g4CV<2?;-5N!`P3LlKwb z5;KZinBk?%1rlYz_IlRTNEU;T4w1wSJ8#G02JCWJgxCtLOZ@anKP$pZ#P!iJ@*|dZ z9(vc4!?)H_Z4&2vgv-ydD1{XzR8r3>naAu9+T4hDu=SJ2WrPNCQmAZKGXsj*u3=lp Mb}id!Z0nKtKeoP0k^lez literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/SinglePropertyMap.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/SinglePropertyMap.class new file mode 100644 index 0000000000000000000000000000000000000000..a15ac795d0f1ec31666a1715aee534f2b8f88555 GIT binary patch literal 1416 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/util/UriOrFile.class b/thirdparty/epubcheck/bin/com/thaiopensource/util/UriOrFile.class new file mode 100644 index 0000000000000000000000000000000000000000..88af79d158d69154b078e2afbeff7dba0276064e GIT binary patch literal 2546 zcmah}U3U{z6y3K;J4u){p@l-5wzMFaPJm!hv>zZPfGq@y1d0VKPSR;Im@g(11iwY} zKgff!z_oaghss09lC}H+{tX}f59+=%QyWQGX06=0ALs6K&OZCx-~amcHvot5T?o5z zHiU7c<#0~H`4ARyK@RWAor`kFD7X|t5SQg*NzSeWIlL#WmK9tLAtFH{xF(19<*=gQ zg8*g&xE{hbd?<&N0CagHD~Fs!S(U>|5C+yHaz2CtOa(U-d?e5_YnDy>n1C-nu_WM6 zRaOmwNZKqL=j)}cVO`R*Meg*aD>=Qmq+6z3dz*f{VAcfoq;r*0(k|#`rD~LGmAaKP zl6BiGCNEp&qIKFV8Z!djc7;oUeev`S{g$3A>g9YgV_Rl9KQqz3B_QZ_%snU@cJiEF zT&q|mWA*aI^r_o9qiUO#GI4|T4JR_nHfS0Y^jaoYFiOPR-pTn@`pWU2;-3ME1+r1I zEsjN_ETEXRxni}Tlbv{Kg2v89xn3gl8gskk=H-`jfzZFPk(u3|JF}8>Sm>B%uN(A+ z4c%0AyCBfZ#2jpwLWaW)fj~J^)N2KU@M4X|CEa9@1MzF^xjPlrtvpTpI~+6Ej8iNb z8~w37uB(HRMHPGSic0mqreX#Ofl-IsmzF|7QAG)56%|xfyoD(h)0h%aoqJw-67{A8 zJf^}zO@)oaD(bk!6ke>|iTc`_VX62Sx8-n0#V24YE}o2oN)UjA{FM5V{7>o-bFRR7=p>BF| z1>KsXsXx9jK|OWU8~ZGhH|)7=tx~Mp#s#O^+u|L?5w00k-O}xfl_D~=XBpL^o@2QN z;;B@}D?NIZZMZ5Bqg>lW;gZU}+25%ZUTz++D;qgab-3Afai)Do$}v>4b<3_@F(qfg zT0P4~;|m~}T4)cJVTRa!9#Ia-?7x=EWbV{#gN^7jERwU`^+~B+AgIlF4ZTE+{tX4T zY?I2WG%A+)CXVxcmcJmnr0OBCm#f44QeWuSoT)X7CK^z&eMCIvL9`-fRpMH*Q z%YEDX1`^M(qk)~9F}SLmrov`0O7D|6>ck^eM^D^&o8K@CaGa3|o^D3Q=hP#v$;hOZ zmbAXX28O5=ZCwjA5IgIejY&;DM86hu0(^krJwX-y=}^MGSTxC8m&e^;hM85ca-=mkN4gJ6W*X@vaV$$o>mV)ZuqOeF63Th~pSrKokKS8+;J zcXs7#>7oUPuy~<IL(>QC%cQr$|ulAz8G*h z+GWv1oA2&v11`bitc4C{xT1$2aJL@zy23aR<~ua4_pr)b$9c1$&qHCqJiC`ylIBmlakbow=Wva0 z+T$)3D&|^cl-m{dR>yfO%)_IzG*Q##GUa;d(&8V+{fg1n3@u4C{)f!fAngi5xWOm` GOTPf|6MaQSpMHi6NSpjA6tq;bR#M9MZK*+Y$Lie$|+a zL=yeR2Y;0DIck9ocBHN^E~gR{rT(LcL2+Hp<@8W9OiV~M@d6jM+QapsN^uN z)_DyJ8WwX{QddkJI+is&(C|>8XI;87d?}DFmFohT4R6mD7^q6uuC<%Hw*SG}b!f>~ zy@ut~Enlj0V$6gGG7y-qHoT@89$32#q{f2F}L+O}x+YhAYt_kS-c9@(5ilyqI zb!3^2LE2FqujnrWF5H5;Mq-Eb%(q*wKQ`=E81rRYzSp9* z(bylUc}J7&htdv+oo+aE4|U0+at~m%v~|6SZe+_t0*H9EnR)R4CH0rRVIgg1ABgZv?v3~YMli}#FK%Lt78U#z zS-z;iY9*iQAYGk5!}KXKJ159)F3fk(vyj(1$ki6lkX`)z37Og{^qqWPr2`|couK~* zfeM&KiLfc|fI03IrG|d=QFDP>$EbFag!gzVQbw5)l&}@jPg3eQZXr!8a2pfc6)5x$ Y?h=vGcw>qyKO3yU4EY3cR261_1MQ$8SpWb4 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/AbstractSchema.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/AbstractSchema.class new file mode 100644 index 0000000000000000000000000000000000000000..9e879c343bdd1c551707128ff40e1e1ddda200aa GIT binary patch literal 1650 zcmb_cO-~b16g{tu9!?QxUSaGwqS@E2_ zxmNXhnYKzx0!??Fg5xa-PpypXxt=Gb#5@7eC@;1~b1wg%IPa4Hpln!DD% zW#+BIw)rHpYiB*qML2v`1=LK%$>(hMoWa%(>VDOm0NT1QvlT}Qrt{yqPfJ1-b2{eH zt|NvXxm?oGCbt8)CSWw6*nmvOE!@_zfIB)C(O*CI90dx*YKs>bsl)v@zN%b-(K=4G z-4KX8Os{Qh@q?mR1Qsryveag(HYK(*T&fV@Q9}S{0C9-Wd)gs%a@F_-<5ePb(ULgy!)0{yEirlmj1_uHU(Gl~ z*hqYWa)Q!^FmKwRkUPp4iPT;74v-|1%#7OP{gnVS#W)$M8Hwa)MCxSLNxUu}Z>Z{d z22UdQ;wsq$`p_RBn|#YkBF0B3?`TxZZSoI$PL&!70Had9LGWu*MHn;x4NY5zP}AY% zfyB`pj2el7*)M1gVNvN-zN0nCeXnwW=+jqW@%H!6r3vTN)rm{T*eiV?n#1Vb2v t!Tk(|{Uqi{)W^OI@1aYP?itB!*V}42Fe*p0|l^y^9 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/Flag.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/Flag.class new file mode 100644 index 0000000000000000000000000000000000000000..25ae5c3f462b8bf4aa600a19e9e9630bb40fb406 GIT binary patch literal 386 zcmah^%T5A85UgJI%_0x=;LXQHJviPaUJRTzXoQe>oLwd`WZ5;a@L$FQi6(x4A7$)W zi5{Ivy1Qz+s;57{-aY_a<1mDSwuep#3+;fzzJ~*X_wd*o_68%uX`B`dQO=|;o>jgo z*2`3hjm-2!mP+(9IlUpcU7hRlmQXvt7!&NfVxkDmSm$c6ULw)4!Klfch1NIT;Yt1g literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/FlagOption.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/FlagOption.class new file mode 100644 index 0000000000000000000000000000000000000000..df8863072121651a8acf40accc3492363288ff25 GIT binary patch literal 1179 zcmb7DU279T6g{&^v*x4CHr4vAZPhj()fEI^B7#T)LTHOA1@URK8Mj+DyJ52_`ma=! zf`Y#J;Exi|?8a=wkRrp(?47;m+;i`p`T6V1HvkWDzW^N@dE~IEW2=CSGVb86j(a+` zb?gXahHhVAw_^tbGdi~1U?}}jFb-{Lo?4#Uw<2k_JgyT6gljH+E>^_!*XAG?q8qoV?W*dPRgaP)JWz5< zD56$E9tDBsqTVK$XQ4A5NS~FHBk9|6s$NIEga&q5l|?LRbO9qRN0Obu)*@`8K;Y5& zPJd)h<*^4feV}!RYtz2EWe8=ab2d> zhQSqx3#%E|BXlYpCy26(R;sE_{A^t)Eap2f+1%K-h6odpbCvgPB$G5exlF}|+i|`luRWSjg ziGDQkk22oZZLGr~e(CGIJ@4G}&b@uVet-QAU>YxFjAKH=9SLa}VN8lgCJqJJ7^Y-e z@5<;!E)EsbGG=g3!hH!37$zzvuh&x*dne^qxnb9It8RNvMNjQ=)6lr9r(;gXsXWYxWn}o>T9Ac-xtpyZQ4%JABS*S%wJs0=OXv&GROk>26MS9KJoRG~zYSWq5u5h||v! z(Eql)tykQR(>GJNMOQ~JT`>$X(RNzC}oZi|4g4lxI|CchxXw*5e!m%xv`bjD-;n4uHqUIGeQhC3oKAUQ9#aS4j>=m z!u!*FLx|%>fKNW*lPQ0bcw%B6iA4x5(kl3pnPad|g>MLN93hfDM9&XGf{xSUBZS_l cpXoc{j*=y#WQ@QiF-BU^G=5Uk$Yhpww98XK6Yfny*hiis!)i^<95eRG35vO9Ck%^m)hkzn8l_)%i- zB4#FbLv>eCbU}Z9y?+2W!)}QYwhQbO7!&d<>ukIxjE;_{g!IPG4PjhcXC7AF%!Egt zwW93RUUNI;V0-=}rm?Y0!bPopr((m_FN|CIRnSJQxwUhSM%_E@Lohl{bYnWcebHtS zt#_A%ax!@DY@cxOm+|zO*IXe*MmYaZ5@EkTp;~rN>Ng*UNaPcJk+hr_%!R3e1KG(N b=v9OSgMWfe2FmH5IQ z_XY&BaYe=Hd}kRg+{W3$h1`xM`j8L$zoc}!;7rug9KL0|5?_Y3!Hq`fp{Wl{==LUm z4W~24d!Q#@sO>V{r`_$&6FMij71Ga~usv)N+DFs_7vbT5-($?HB?tL=K!ZT2=~n{v cgiuEUXg@l=UzbUipYU}(GOxHuGOUTLH4NTA+3od`HL*-Q!Sh1#h5 zGM%dYQBD(L+F=&SWFm9T`G$1tTo(eDVU(qTolBi9lqs?@k5sUfiJnQTf`^6GnYqs6 zGF8UjK1Zq|h63GQ_#~GyNTi8_vCXxKhrEQFs-lo_HT9Q3z#CT+?lkXp{D=KHH~MIx z$>0kN{;{J#=X?Iw<~Tu}o{&!sf=3X#lnp2fijDpX;-xCL2tAU48XS^t(am3rh~K7+ n4VYnr5h+>Q?4PYr`{~fC`q|-Vt=c${9y{125BfN&*0BExSzc}C literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/OptionArgumentFormatException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/OptionArgumentFormatException.class new file mode 100644 index 0000000000000000000000000000000000000000..5e8936ad3b463b68526def4ec9c1e14589dad45a GIT binary patch literal 548 zcmbVJO-}+b5PgM(MZ_-@?|MQ^ToX1aHhREtFH5u3?6zdLOZ;1&NIduh{87f4 zg?P}!7<-s@-n{o_+P;6hz5%#IrwI=S9NIn(eH;nYueH%`C{XR5O$5AKJ5vICp*HHi zNT(`$l+%Qec4#A+Ok}1x-+-Q*>s(+EMm7!HTxz>eCbvZvsbDD+J(Era4-2QQxyj-p zRmP2MmP&W`9H|l>2z0vPlU&LmktPntF4HC+@F;$&@?6Gc?;iw#=D6%L(mdViuT3sk z-a-v^4lRMJf6pt>|GW0!@TazkvvxFuO8HZfsaD&dJ8!3fzmrC4yu literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/Schema.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/Schema.class new file mode 100644 index 0000000000000000000000000000000000000000..d4472d37334d1f1a63a9ad2967fbc7ddf0df7dda GIT binary patch literal 294 zcmZvYy$ZrW5QJx=CYm7n3^r=x+1p$B2ZH^2F6KfsaybLOnuQPGLy7SR8&fR|-^?s? ze_U?>#)ty60)&K)w!%&}oSGfG%n}xZna&Q%#cZ;Z9P{jKwWzZ*san}mvFdy%+a&8p#R$L8bSvfe^0WPjE&zCSLJf7GybbuJLI_?unoqyG%8vyewVbF~U0zeOnD%4ni_ zq@Q@02pe@m$y0)B;d(q2+hU9qJ9AIOIxu!D99THCa6~BhLibXXaMk!9V6%9} zT!?3e?}AVes@cxI-~*wWi%tlQHA((>%;pJ|pB8(sBjIVn*--2Fnz7kz*8E*ZbD_Hw zBGglIAeqx!<|Ul07VNg4SDr368FL~}DrGEWiI%h-0wHHU0^t-}$eVN9+;Z4KE>Eyv X8>C15>_>kzPb literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/SchemaReaderFactory.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/SchemaReaderFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..230cc475c8fd02b6958499f2fac1c8e77d238612 GIT binary patch literal 320 zcmb7=y$ZrW5QJy_i^fK*d<1PgOCeyHDj=9ASkEP%#GIU`;Hz2q06vs>{(zQREew1! zvva+jF90U!M(9L{34QH^z2tf=TV4pS#1Ur0Y{N%ZC0B*Yy)#vjj52Mv%CFhjom6{! za9Y%nOS1~N`sNctrw~8id1EWW^l!5l8EoSG8Izh)2!rp8l(o0+G=9`1s9&qSF+%V2 e-+Z|d?OOywEo=kS8iYC;K)6k`f5RX@-=aQeH#7lbODB`F@4n}~Jnwb?{QKu$0Li$oR#-n1K*@8>C)KPi~sw;Im2707(euFIx% zTUy&vtyp&8se1xLmAlryRccu7ZfQxIpsoJeJvXS!z_A6AHyqaq76szdGaCYlC2yOE zG8M;_)mC#$s tK~A>f*;Zr2QjUIaGZR7G@df64;Xj5|>V{SEG&n-Y+Da00_npAv zbQjoKpd5F1Vdl)XX*KSv9f9(hRoYpiX3SRtg)=KsBPHEdv*P%Hz(@o;tk^QSQdxoH zxfC*8t110G%a(VPqm$SvMms)MV^;=ids;!@+H+?h(xj`T*S3*=Y7|f8<1LLS8MT$b zR8P+xxW~N{J17fGcEu51RJ~xuYq{IY2eu4h=#(DJ3#4mdH?KIlheo=~9koJHdoWNj zu?iZVIOXs^b_K>dB2_PRepBv5&Xw|%iI;H6L=|fS90O%ME%)$&Qtbyt18uDq}HbaUuB`W>#oaJP8W z5qfEu?BH9<+jltITnD4mZT%htaUnE(`htM#mcQyLx!jOV=?1jIee{*UfGZDzHdFiW zMivFTfE+jOFqj9#kku98-cIS#k~c~kNRVP%@Vv~o8u~~9Q-vcW3y)!Jevi~2$YlE; zBE9(oQumQ0=LiEo!TgSbFCUzWJfBhLtD z7~349D={_=;0-#tM2VMq8|OcTDZD~>DZI+xbO^WHhDR{eFA$*6UG|(nv(EymVO%Dd zD}*sdN8@xcL7=(+0eTh1rvNR5KvR0m7=$ial~0}hY~dlqVdXL6n@32@K0x2E3`G~X kFO<-AN`{=MMilU~p72Tf`3I~}*>gwoy$1J`T64EQbx-#u@w3FIHS zo*O66>zorSUjv-0US)fC&>TCJbCKF@tL+ zuH%Nl+G%GhRzC^a{jT)5SF$I)rX2K3pnRG-O&~BfY+_uH!2D_IIJdz4vxANSQ(zCz zuUc0d8K$(Ea;1(reu@PM6nRakrtyQ#^V!4*$5GDKq45tG))9nN{RHg;XBtWzN0H%J zK$iL<)nlApilZ@3KlL*rS3$Q)OeLN+?}G1g)<CVm;%T9=O0mkjLMePf z?)4G!-}szHoK7JY63=6&9F;tBiPHnl6s%Sq^2KG&q`0&JmxkHjxNcHEhk1^QYv3mS SbesK$+b!ItR^U!l!NM>1>_W8w literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/StringPropertyId.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/StringPropertyId.class new file mode 100644 index 0000000000000000000000000000000000000000..b04fdc7a5117744d788da457fb7a9b1b786a7db1 GIT binary patch literal 1682 zcmb7EZBNrs6n^eDTGmw8jbk2va7^(#n_6MY)dn?82Sp_m*u`}o?{3c zF6|q3O|`WOgD|fdn*E%iKhc8pPUj}q8A5rpsxtHzG(#;qJ7v{cQ_4DdVg<9J=?3&hK$P_B(PS&m|npszkhUr)pHM^_mT2-;ttjGS&qCLyrU#(I|Aw$`5Ih)b? zF)#$TRGVQg(T>xxH9dR6^hT-YCNJKCL8^ONno6;acf>=ob%$i%cO<*$XnIw(au>zh z#v_(JJVUyZU{2T>x+sSZsoVHiEXQ8eup(=n>cdlj{AYoZzSpW#iL@x*1sG0tHxMJ&n~MBWE^o$Y}{EXf$gGNtu@+K&>`27acqR;x4t z%{#a^U=TM=tLXM^Fu_M9%ttA&I1Nf#y0tKCHOu_Kr{qj~HoXiJt#H5d&sWPG$Fa*o zr6FLLy}WB_>{@&CZFyU**i`>y2LgUWGQ93cr{yBPOdDm~r9WH`{RtVmc@xmuM-~vG zuNbb<`x;p#vIDdZCR3jw{6=p~JVy7%7YH9Akmm^DPqZCCKfNUv8pSQ58X$YXJBsVL zK^BqVChakL265XLSRf1+h@_HVAqDUYkpnV4LV-ZQoffjlDOrU4LoV4cMtrhY^a~Ht z2`QCKA3|=!HRW=Rc&Jk@iLx>3YDpNQ5CfDG8UR{(4vMt$5M#+>u!F*P1UHTlN*$u> kr+X%ZE*HU5;6)rgjaYz;3EXpWF(il^ex4a7={tbrKUE2}9RL6T literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$EntityResolverPropertyId.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$EntityResolverPropertyId.class new file mode 100644 index 0000000000000000000000000000000000000000..4490137f7d8e09dce9445f7fd592f6bab5c51f3c GIT binary patch literal 1560 zcmb_cTW=CU6#fP%3(G1Nt+ur)wzP7S^{xp<6G^Kzc!?Mi-yC41(=5AWSxEcf@A1`3 z;_bosX5x=Bp4~0Alx@p{JnV92&V1i@&U|No|M~s{z!lt%<02MgSW@YoQ4z;-0xP(r zAgdyWyn=#)B1819G^KNoVJ2JM@m!)nvQg~Ux=P%421pMwz|T0w%1z>+PY~9yJGNOPf+H= zYSZfI&IXs1V)m@Q-4yzO8?wb6q1Si*3;{9+;g(6L$vd8`u`(FKZQ(FfvO#2hM;iK& z;0f=Rb5+Z3>suW|@9`~tl#zJUu3wFGSwZ2bXTsVxJdQkH&YE8OEnAv|zCHDptT-H#6&M;5yEKxg4)XvgqJ2i6Z zRShbxDY&j-1~>fl1G=x^riMA(Vp#nzu3=aVz!@=wYuREz(t#FbNH<+`XQ=87Rh^-# z_t}lj`p3vqL6aD8U?m`LEX^I^r2zdSMUv|o?i_8-^%f1szwvt3*c45N zq~|9f*zp*{TAq{<2c2q{i8@CMG=AEBu)`9Ii2==g8P)?5+n-wZo(hut%gmOefSrzW5nR0M=U%EA40PVyPr;!Q)bK4(B~d S7d#bdOuKlr7o#4XK>RO~(7bm5 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$ErrorHandlerPropertyId.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$ErrorHandlerPropertyId.class new file mode 100644 index 0000000000000000000000000000000000000000..e20bebdecbc0d618d14ab344775fca65e5082b6c GIT binary patch literal 1540 zcmb_c+int36kP`>1H&j5rM6XTZE58uI+G^bqhSe_T8Vr$&t?3NOnqleB`kkgO_IcB! zom9P^y-ti;Bs6J)PoqYc0E@ zItSdK5UXeRMN3zYxM^tI(bdM_&k!IJj9Mm<7VmhHCQ4ukw{?f%VK#`W?--^!gn!Dr zy zLpFvvYI&dfw>+Jgs;_(3^Vo1NKmF(3l-$lsxTc^4m0^+ESfVzTsEwu3HY()J8wzCH zlyFNy8n^x6z@AIEqhJYl87lw5Ck$%=C}S3IEm{l+nrcagm6mJf4Aq;VdNWk-m`xex zN9M{iJ~=7sCy|SSrY<01Gazmv%pKSD0QF-flFJ#k|82*rM#J!XoSrui^_D}@^D__( zoW<~DCZ0)}0A~7(#po;M{=y(PB0*1uR&_)WqW6V-;T_m_BvYYJ2)}#}_8L*z`H09{ zIu79!J!LO+3(MHXX<9G%sYoJ4D+0k;oFiazIGy zurmUdH~~xGJQh8$B_i~}_DFr0GUP(O_yJM?*1m_e>PMYm$t3Nf$0g$uRy;|UJr%2% Nck$>fMm;)%_%F5sv3URh literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$XMLReaderCreatorPropertyId.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty$XMLReaderCreatorPropertyId.class new file mode 100644 index 0000000000000000000000000000000000000000..5cf6a3ee702fe4bb222ca8eba34718990ff68fe1 GIT binary patch literal 1685 zcmb_c+fEZv6kVq+9hi<*P*m`SP!QVE5${QjCX%2vMU4=mkEiVfhD@i;bV~3K)DQ3z z^wmq^?ZNnF;zt?R%mC8%G-6^OW_srAz1G_M>~((r`uYvPMO+`kc}xysO6NPHV+hkJ z%;18CSsio8YRGBG3nXvauI=9v7@aL|$}MR+(p@)Ke9v~*i*suNiN!|E5=fVA*Lu*d zS1fN;RvdmADL1OpS(Ba}tam;p{0+M$F#cq@{MeE;%Ukp;={LMbUZZJw{vk6ff!SJp#mJ*5c5*DYUQ zbyh{!_HD=9rC65D;+!gKyY84Rxovh!AhF(z3bccYrd7#36jan~Q_=GSDZ10P9k#Qm zg6^y9U#rk65sN@x#nWBFt|oy2o>!ZVpI4>zmB+TNgvY&P2LmFotUacmLCL3QQ`HI$9c- zBd-YRYX*UZYG9)blQNy1$*{5vJJaJAf#H2d4_(OlO-4AJUDY+9NSIN?^@IiY$CRR= zj;d)lfg67}L8(Sp{_*w0%BEHIDLs1tf}KefxPKs?UK#~6@6|zGtHCc0jxthw8eFX) zff(PXvbpyVKad`YeMbE02Z%RF^2;YA-f=sILwxFC=nIVFB@T0aJW53xBU}*#M{$h6 zvJ<2vWK17YxMk9m%&`Mu15M0k8IfrS`y5IDwNP*cb^TuzOS=XNI23=08GH mV7(5pCZec4ES=I$hg>?&;A|-AT&Q9K!vP-m2HB${82Sy_hw7&Q literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidateProperty.class new file mode 100644 index 0000000000000000000000000000000000000000..b6d147178681576156c8202bb4e82a87135b9aae GIT binary patch literal 1758 zcmb_dTTdE66#fQ~T@Z`nrCzGFimewE?M+*)t%X%dC^SGwc`_@kvS!&e%VP0gwJ|A8 zN!s`RsHSHYkxTV~r2DXE&Y5q%Ip>=*yTAYZ_z7Sghh99#3jr?$Yhds&$!C%7%8KbRfqh(=^OOSubdv69ZBzl}sHS?j@pe zDa9bg^F}Fb6=jvS(aT1~%q!swSyKzLrG&HBgJu%J+iABM{8Azl%jAwyQaTyWa^`~` zneV8DxC5jK5${E%)KP?NCQ0Q+&))I7uNEd(9)Fl;m+q;{}V?VByTQ)F=OsJd$HGB_8PvJ9?>QBX+g zxT-6OO6gcJGxD)UkwDzY%UV`8RqkI0T~<-0CRyuAC#uWcNR(k=v90Q~Wvcq=_EKA@ zDTJfC!7$f7kua=%qoNn2YF;_FR6{3fM|GVi+tTuyl|kIeYuB}U({>Z?tGu$&?hahz ziv>h{h$2M7x47(d{@Ildw*^TUHYlo`G*aVt#D^dje2}ou5cv;xf%6^sFo8+BT)pvi zbWHQg#R@)5;Q`&Jp2)hJshw^bGYp|#=okiDDkhK5l)OcK*b3RQG6*MznUG6#ZXSM^ z5xG*Paj3nIGDXw)%)7Lsm0D3c@^*N$?Xq}8U(pfz>bgl<5|>63To>C?L1aZd#4H#g z`6FVk!<%pOoN(|{C+uTFhRHIreakhtztX^gC-ipP!Bs5M*w+AH3CrY(SV4$Td~t%T zgKS{=JJ^?a9nM@0u9a`-`(>|jq0dIN7&mRkF^am0cNJ?kEV&PHQxgO literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidationDriver.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/ValidationDriver.class new file mode 100644 index 0000000000000000000000000000000000000000..9eeebf1d20a767c47f6bfcdc56ed47409f8be4e9 GIT binary patch literal 7111 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 Q&0o%bLsRVG^UnzU7sN)~{{R30 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/Validator.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/Validator.class new file mode 100644 index 0000000000000000000000000000000000000000..773f81f5be84746cd63c7ac3e5f7b25f5237725c GIT binary patch literal 263 zcmZ9Hy$%6E6ot>VSpT6_=p-~ouOy<7D2RTno3%1#WOj&WQ+NOmB?id~%{|5Uot)hJ z<9Y)yL_I_`M2*mj*^P~MtldoNtzt{)^!jsSV{thsk;;qsmP));MJ?VY$8WF1I~2TA#cDZTjdv-yL&aL$DHrcj z@NN|myr&B9#rss;jrWJ}0o)^pA5?KK?hD~V_;3gx!AE89V9_Vx|RlE>6CMJmgu>hYXvPo9h2>wcT#QP_F_Y0Ao7%FSiG%uB^Oj;z1r2&s z$g?t-F_UCppt0D7xoG!!(A-#=o=7{!XvdJ$3Cz>fi*0aVXQM zK&=O1rgCz)(*#;>8z)R_NE%?D54;5H#|s-h&Ezo(TDAo1#f>rDP8)6G31iGLQx3N#hlS}?mCI5Vmvin26KzkTsdv;9`m9=8+okjwjQ|H00KY0+d`fMg(T-xy`mycDrs3CEXY+OEWt}OXc@K#>vA);0pp( z!-muC8lUN=&S$=y3ojf%-cG59jBOIX7n%o5nOSP*=7y~@J_L4OVNUBzN#$vH8DjEt zlZKb#1_fW#@F>2b;FN~1;H6iQ#dQIVJ7T5l1XD&Pqx^@nNh=X3fdOfn;6k;CTGKrq}?Emm@<_`yqunn zSSj{1V`C|s!56tLWk;lwHVqk$k&uxoSth}Acv@h+l}RQe`NR{UQ$*Yuf2z@3rYysW z9*TEr_?FyveGv`K7Zbj8B1u1^;oEqIIb~54exrNYUGD#mg7X?K;8_LFNqc=y!S^-% z0MBdqA%3jjCvx(q3Vx>H=lF$!7c~45ztZq){6@iVHT(|0SMUc7e?*LNx+oKK^O}Y~ zN$0tUKMSn#+uEPLH2ejBW!%k}b8ZIH@HhNjg8>HL;!OB8Aw5`N*$nFL!DBS6K;1&J zglvh=>4T8tU2Y(#zhD*{~TUO4KkF97fOp^W@2N06gXP6rkR^w7O6Jo zXM+ONl}LdlQaKZcz{!#}%Dzt!Y9VGw#p zIt^D%NPpF~(g)KNgr#A$GhW4+grN!ceYXMEBxi4U*m08 zrt#uvNU*htFa=+_%y7lg2(*-{X}{clWaOmQzgEx*704j*g9@yjeO2@?y6zrbNTwpW znKVo*?dZv5uI}au);^m?fuGXzWT6%hxK}TMHM3Fr??W<3n@Z%`!|T=a-f=0gi7vI! zb`Oq9F6O%hbGxdUxh>HfPngMMSIY6`cxCi%Uc5!y-hGng?gB!U#*!wJbN*h+3O%1y zFT0N}%~&UFear_N^PdHCYdBhJ<}kTz5$pM`w3|;&*YjT^FB*J+s$id&4}P0DilLl6 zK&zjI7??!aB+4J-xD0#vRoMco5JDI)mrx!oZp2=WB%Ygcc>0LPg{_}NMSa5sROj$L zf{KPG5SYQagpj~B&^fR1P#wqN!;^^+;0|p@Y-VC{T4*Q$rR@vREqHWm#M$+nOw{X0!afG35-dp@B(NJ?-_I*w0T<)~&Hnei%9()AD`oETPpbwsAT1 zG`2s0W#OuD=p43BVMiH`gjESp6;|EhSz7xd{)J0?&|@ps(Jq%nt!%|QvEChD#J@!Y zANnqdHL~S=gFBY>1v@oV|ph&pWIQ|M+|xsE=x1?^}+ zHz^NbD~^)F5Lb^8Lkc@Eft|REK71d&;(qQpNxyrDK5>dZI!XUIM}K^l9{D^my+Dt- zi2e8{+9=CGN^>(_M7s#0Lsa7yQHz7*xJNW0E_R_;>_MOCz#(#fM0BCw^+vh}`Me6P z#8XZ#))LnN1j$z`v9%*WPL`nqw{Y%7zMkHSPN>ATiuAe=BJOpZ>*ib+b$Tm$_@&?G zqDJ;!fjE6z_IlArEo~EZIK;Vf%9X`o9HFnD;)6gx^%0 z@LF^vn~KtPtr;Acpd+ nB7|Xz&Nm#4xbP;v%yu=2jPZ&0OC)+XpNhZB_FlF>Le+l(@!9%P literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f0f127d848368b4d0ebf603c84017b5b474a0a54 GIT binary patch literal 261 zcmbWyJqp4=5Cz~j{zapOovnqntB3~>L9i0c3C49W8{$T?Yrv~ncmNM2ZqnL01H(K9 zKA89C`2w)OC_)q=Cd5f`FSYDUE`-VE?u$gHa^<6FF_o0_j4LJ#l85!Fc%vf>32R+k zl~36eH?gh}RK>YDvlqnyQNPk`NdRHAw^qt+&d!M=jB8)zY%l6?%0zp@>JJ>#K)1qc Vb+tnyqz<}G9)uZ(JE0f0{uhngNO}MO literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$Handler.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver$Handler.class new file mode 100644 index 0000000000000000000000000000000000000000..613861af5a5db662cfb82330d6aff734d936a520 GIT binary patch literal 5156 zcmb_gX?qjb6@ITQYb1HF!Pp@(Yd~Nl84Hp?f}N1K28t7djZGa))50JP_K@+&j7DH+ z({xF*b#K#!bR}KrlD2^a8;3TeTinuq?YI7uK3(2BBgvy^VkfkZAJ5&+eb0X8jBfq= zjW+>o$6w<}V=~5v6-OuXayBI&XB60RM7*7X+;QZx7{ghdi(?w+)k|&>xqY0miLXRVfPe<_?xqdo|&&u%`1<%IOhUXgaJYJCGpKHM9@r4F_5npP+ zm+=+(_^RafHTif^!Pn)^H{|1+3ceLbJMsO|_3WTO@fmH)}dpt8e zX=V!Abmr*6fni2?o~3#SA!1KIp!#+lHJ{FH7L@LX&B+tGwF-K`+a^Whl&zmKrVnaUQ-(EO5NIAat)0~}MaM8Rqk5K? zNfmJ>j6!m|z|N&b=%pN<7{hv2H_p29$41Uu&V=q5S%N)aScbDlV6fx1(5f_9Fw)jh zfpA|wrwcR<7?yshIC)aHk7y@N?len{%~8!ZNJwtZ&|wCXKICl z&VvVUN4#VSjaF+e=+54Jwm7LWnWx-9mYx|B)a@OuKUWmly_uS2O$79G9NBgKfB($vNU zY0ynU7IZ_)^@k*q(UsF3%`gQ7B^3RX)zqyr&>?M-{;NOZjd88QjHY}yF^EvGnK1VU zu@6d^a-{CpWWb-NOrZkB-|>F$^I~H*Z#gt>C8*X^N!eF*O8WS|>8w8G7i@-9V$SS&T%% z4+J3a%>Ols7gg7-aJA(nxxr_BW`8gZ^**2s+M1uERZU8 zqg%x;+$U$3RKAXOsJI*V2rPeR0abA?cB<$?M#ancp@JW&_%SXk_^FDY;pYl|q2d+% zQpKr z?q)md$K$tG%>v7`o3v#C*1Mt)1dazvUn57Lw3Uo<6CzLyD$tU( zbvB#T#{#GQAysZt0(AY~MWGD4v$8=;5zN5~R@s{VFN<>Sv)?c*_L8Pq>T{^}f$GlI*O|Z9l&^fZlyh>2%*k9} zR98z^>uWYROX@VNpEInS{32i&q~8a*z_N3OX&%Zu9t3^vw`@gqzDt>y)jglUI<|Fw z^6GPn()RAB;eb4>SI`(9Rq){cIEOqF5<8~8cg$;NFP>d`El z5`IgEWc%Wd>|i)H%Z|kz+2D}&e$D}fbnJS#?%~Qr9shu2Dt!&1)GX>!;u^y8QJ=bj z$k;5DYlx;guOW7YbRj&zXB$6@fwhPsfkv)YVl~$BZxhzzL7v<}I$~lEdO6COlrTh| z>>Em)_i!z#B9e3c0(RWp-AKJQ`LH4ttcdK-h#_QiQNntRccd08Qm-SLo25>Z@oVe&{;X87%9r zPt>PN%Q-aGp*xa@%wymNn#QhT`8=AMS6oN)*lSpR84>QxVr93|+(Ic^FJf6jX})6y zt1hE~vpcz&=#Jh%+gKt>%=%fZzL`oyIE~F=O^D52*kiSJ4(kNG{q_7vP!h^K!dK*- zw~}Bk9uSQ$Bx9Keg1y5U};S=6!4x8)z zfKNw5m;ZAsp`<&vCBk#qQjZ05A7c!F(b+`LZ=mltGdBAeohKNR78~v-8IjL3B41=I zUSu@BL=#_PY`sFq%;F*Toe#6A?8QGAG5^9|5k;?P#D396x5x;)0F`)YJc9VqmIg^g1i#a>Y86%LhVa^yooQ>cJ!e|mIK7>&^d;|W8 z$8c2s41{MfhGXRRVe$_X<8l78KlQ?clE`oY5;R(P9t}6p&gAL1DVKBDD%kFq)5nX& zM+o&O4K&~?qB3Bue_Qt8fFhz0LPTwzzauqltE0;^!$tv0gK sOt@JuX9i9a%&R~lJVDS9YtO?R+qj?Rk8lrhC&y7Leu2N~{RFZ90`B*#-T(jq literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/AutoSchemaReceiver.class new file mode 100644 index 0000000000000000000000000000000000000000..187dc822d9b726899aa614c1679699fe286063c4 GIT binary patch literal 2258 zcmb_eYje{^6g{grR_q8|OlbP#ks5GpgPhW|O%1fvkOpuJlhBkf(3y?A#A0MAvt9@D z2l{*HOlf$`(C__Go!*t4IF6igCsTh|t*-7p=bpQFcm4N2Z{Gtbqn3h&D|+}Ujd^@+ z;u{m+rZJ8MJ$#qOF)Wy;kaNnFEq6W^Qo!Nd&{KQe&9y6yWyRz2Qsi#CI~#QlaR zBtv>j23tZZSDVk*oSRvR$ut4DU|ClB(J)@tFANroFA4|Ov*5)-7I3M&#o~fszHM^XKJo5>YdhxkPo6N zWNU%Ly)`af{oXSsRMVxh&X1;vizQ_l*KaHCdA-FVq@{c;%ULmbJdwWyKv`x<3cN!Q;bq*7hS#grsEa6tW{b#g%2&9#FUAug_|fcoIM~vrjp@w-=!Xe z`|GB78kIuIKw9_&w=68;Cx*(9lVULIcxtdW>+_rEBcNwl60gB;+ey;a6o(V@W z*du`so+tAoBZjD;mdW(V!!pr{`ZSPr-l8=b%j<(8r4OPi@3hHM+TV>2nlgB<&xnDB z>{}UrJ6aOTX4V}Vmp{jwegs=AQku!rQ)8J=9!#TRXj?qnY9An7p z&ZMg?tJ{>G6PU(F^zCDsgKjiN4e}|CpV8Yo42l3Ug&j;3imzZ4O0U3vCzFBCY0M%) z;~I^>(Eaz22-b0$EN7!IoS~WiWkOQA4QZxn4I(&)nI6p}qSZ80?~qzA6xj~a%f-?g zOd2S?BzwfAlLsDS5>JTt*L^%wdpuM40y#pRq-@UP0!2>XBJ%Xqa%}pda~LoD0izF` z42>s4Kr3>_OD&X%IxV@ET(;Yws|=zJp}(Pnds&kqMHLAP-%f2)7*K xYRO4jg%U1>epzC;Og_5|HvQFzC&~VMk_P4o&cK&Aq0^&ThUoP2>i;hE{x854V^jbD literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/ReparseException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/ReparseException.class new file mode 100644 index 0000000000000000000000000000000000000000..f8cfe9b8d76c37e9aad4be389226d29db8e7b8ee GIT binary patch literal 601 zcmb7>!Arw17{y<>NTvG6w9Ht=3@47OeQw4==}-o-P9j(GiSX1=7|BIqG=Gqx zh+=s&b!BLj4mu2WH1ilPTaJ!KeCm5V7E|60!o>74N~gUP-E+s%7sM*f!Lf}U8%?ri zgj*U54X-XJTkB#^_x=&6y0R%W&Pm)lno}GYhnE zZPuXDynDakHe1dgjd$98Yae;~-E`!@D99>Ro77pRf#L!C0DDF5B|B1}TB0qWi~=es eW-CUuNd6jNG1{pRWSzVM!K;MdAiYUChuSxq$D^D8 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/Rewindable.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/Rewindable.class new file mode 100644 index 0000000000000000000000000000000000000000..55830e9d3a00aab236d37b274ceabdcd69475519 GIT binary patch literal 207 zcmYk0!3u&v7=-6n)3l-R)XL_Dt@>^qdVn4(+DfR)48u1A^LXCw z0G1d=NFodfqgH9XHg+ppRptbLI@=S%s*7>PEf0XgemQZ4N(uciw=H}jW&ONiget-W7U>+}Rr14+?79QGogn~ZJ*bJ_XSvJtEP$vGVtp%Rz=x~ zqvBij#SiPU8YnMpcH&ChQnE3fz%24 zj%65c$)KYQz=S~mvLE{K3TF!5%ofvXR96B+Wj|CKokmr)HZ`F@wj9-Duq9i*zMmJ( zc+aPHtKo+g|0}zUf(GfAP3}MiW}&3-qRNlDtin#oOK6N}mtu`Tg#vaZS@yNBX(p~* za&BK9NC!8NcQAxu3-b=1;+ca%WORAd!gB`;cwu2tVEKQX6d2ZI#XyFiif^j>s>V0V z^h)b8-lOt{JmgarxD8FdG*LNf$EqPPAX_bYREwHN0&bz)o9{v{c~_JYXBPiWJnry+ zOY?U$`3=Bf9MoL)2ZL2$+&zVGjT5BY5fk|{7(db{ zFux^3TMJA!h;Vx~^l5@DnlXm$&Zz)XU N8newV3s0ESe*pb1(7FHs literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/RewindableInputStream.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/RewindableInputStream.class new file mode 100644 index 0000000000000000000000000000000000000000..5ca5ede781eead3487812f6d547df532a08a3fe2 GIT binary patch literal 3229 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..5067152bbbd11f096228fc36ee2a604b8182abce GIT binary patch literal 593 zcmb7B!AiqG5Pg%xMq{*E^#i=MB8>-6RlEpAC3vtB@VHGDvXW#aO#^^DeFt!Y0~cKngdGoS*mco!u}A2ft3p*51iL?o2+pNWB%vFs zLf+2vsVwisG~-Aw)Un7SQ7XfiL8nU9jBpdiIuEK;DE%ahnVy%i3~G_7L{u^m^GXMk zIF-4$lOmC2s0}ueSgKl=))1HW)oV!MaUmo>Bd1nfuHLTZ|UAzW_uot<(Sj literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver$1.class new file mode 100644 index 0000000000000000000000000000000000000000..1d425ebd1978940b35daab63b934aa71a0957d16 GIT binary patch literal 1453 zcmcIkTW=CU6#fQ~EwEbC+FGnyFQ{C!3)(l-Y8p*QsG4FLU#G)F#w@#Jb|Ca$X`=D+ z;1BRe8PBjqH>uJl#7%b2%-M6kZ_jOh{QUMEKphWq$l_`q4mR?*hU<2@QNT@<9Ncnn zn;~m@Dk{|(9<@c-_e_tga3F&y9BLuG5%*P>8|m?(3B8W!$v)qcyesu|FQght-DJph z4g=GZMhOCar~+jkGdwBJg<9EX$n1n&$*|Z~fqXISA4vV0ANZtMYKMaR`&=t~K2m0E zI1FHLTR|Z8j?be=l4g6JA1O5`Ku5~~*AX#qm)oI!>y7)q7xA&z3I;>dnIx=PnMo5T zjj&QGU?~0*g(3fJEabqbFo+!7aZq+pA#Kd^T-o?HrX@IDj?H&`#9b^P=c0hBgPM!G zxaVRMo`brJ2JTbE=O}oo!O%F-e=pA1?^qbNX8E)N5o#@ki6cw6ttIo_dHN>tY1zi= zsnBb^OlZ?(+dIu!Y$vodWt$5jqo~xV(|D*kJNXoS5f2u1$CS8kiM#)ScxaUGz0x%3 z+8plk0dbaRr7GEJG+9DRx)WmM>y+~+*!oadbO$Ima{0Mua@Fp5Wdd0d2vMH5R!@TLgY8H$~dP@$3{ zVpz)ZjFt54cPZ**hj++n^qKUfdd{$0$@0jKm4!UVUEO2IZw5^&qvS|myouX~B7Dye zJ+hRYz~$Z^52Zf$jd|6Ql=?;%{V)+8tKg5y2P(Kib`u>+(vKAPylw6`JrNS)cEt(8 zBfHo3?1=a5{T-(-TJ@@-wqg~Bg7h+aA;Zi+=%@#;damdw8TgTj6*_a*6;ZTUuh$ux z7fXCuWtqvIlU=7su?me7U$umi?(ZblbQ1DEBr$BxpcjLQY$OxAC3VZ^&t4AR)26K+ z^DehgK+(cYSQf_cl;+@~*}p`r#We;nSg(Cwgqt3ZA`xlYRfhFz&@xQuRBeyGQ2XuS zv2YcGePzP5T87!P)7W^qKO7o{Tt$C3FRt07JuJ|F#v}!9z(83mOaGv<7MJ!s*~c(W zYl%(=gviles(nVTwtNa!TRDaCkxT|AXf2ZiFiGna5#1)oY1|^q!_?0!$I!NWyFo+Mv6_SL6>U)W~-_qya_=2+Sp<(jzi<$c0{C>~%wgMwY1!l3eX{tI|Qdy#@@k?8parUa1W literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiver.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiver.class new file mode 100644 index 0000000000000000000000000000000000000000..07519c21d8cc068b3f574a4a38f57e1578759d20 GIT binary patch literal 296 zcma)&ze)o^5Ql#gV@{)>VB;fbs zYkb&BF9iPQj313~eH7V=U-RqRR!t(@{ym_2TK%puArMCS0|1Q)Cm3fw&2-F@97V22 GI6DBpi&m2W literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverFactory$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/auto/SchemaReceiverFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..36d85ef1437b8a949b267fd9c20ca0b674821913 GIT binary patch literal 837 zcmbVKU2oGc6g^J6WGjJf1qO_dm61UQh>RD6w27BOC8VlIbehDY>w2rF)SeutbpMJc zKp??8KMHY^c1j0(LXmRsIliCA{`LFY4*)x8*06>f0d5AkRYL{q`R{gsy8#*udm`a! z8VNIs+>k4CB6VsqD`Yh0i5hSxBc3@E^~6w)_w_NQUK((z2V4`qJ+6enL#WV+2nQ zxK%lxk>2Dv!{*;*y2iClrU!2(LY_EfG!5lVcJdnKw6hr)YQ19Lw#vJ#U%2P9JT1We z5Ss`Y8fBGY?0@<(+$%%6rU-g152r&}Yix)Ih(c`PVSq;rFG>FRy!`Q*{BbUSeBoFT zEf0q9t=7^OO=QZjQnr5AKbFFgnk7|)F$9OkcKL`l_V<)l?iE9&xqU#Fm!lTXQaXA% ze`otcYd+@EpS!k_Wq9#_Tc80S0XE7+&bcT_%n zLG{UJEc~Plpo)be;tKhG!Gu^Qe~nn5s;pqOVC$&kD)G}E6@ZB$?H$qLPlPSxp71xg9eDo!W8Z5FKiJ=FGMJmL zEBtkbcRGSLJgeDW%L;b5q!72`g}yDUJ?_XR4}`_Tz_XN)MWy$Ms7eXAycNssOOGMF zEdquY^D6c*kdD2g(~I;$vAOf2J?2?N)4+%PeQn+eokl&p>w6XUqWu=Rgxo?%)6+;b062d*lD zx+n3wj$38`!(ShB-xCUsyE5 zW)!LRoCmcx9mt*J;AoCKYU~O-AnBz62o4IL;r>88{WJ<@n(bK{?a`B_OEHk6 zw@FqV8Kh`EUn;)^`-XfW^%3dk@4#L`BhLq9-q7b1PSD$kLrqMOb&~8e$yVf1Ad5h7 z8lwbEKMDGl5Zs}dh#*%keZo)*U!lDwGXc~n2sm{NEO!W&!&#h*!N!R&0lP=))3n1V vmloecS743CSW`*VA(lbXF2r00F5*%wX);zZg%Mf{2fFtZ#*vMhC0K(@y7O-Vu+ro~8F9gPl z^)Qs$3B+_Nr-a?Me<{bplfG1QscXVFk-lo_Xd<<_st*Xcme*{#UZ+R+)$pUSZ7zl4 z<8T_yv@h+s2-H9rX^WYO>_oc#MD#_ZN?7x?WRll`gi*OM5_4e(A{^Rnqg6PpCM7X5 zDzKjk&%~r!Ns4+aRn8$ll%_c`DhdhT6NKO9e7wmtxf4H7p)x-R>2jq@$T-nJ5|$b& zl;^W?U+RwN2aFWj|4LX>@n-Aw+n+jd7(buT{Xc~#Y_y%9?%C;u=Q?h^>v|WpQ>WAP zdPRK2ZV?|)Bz$|HIAQsvcg_At`iATJKCb;^LiXgTs_RL;>1K(CJy1K zh>rlBRICu8iYBv(mQ-XK+ZmL&h|E(n2&lrJ>u?dj?Mx~FI6&wpP00$>tPQg{zD8fG=j zr4Yq^HO!~bjr$tjZ^Ik-Ac+rC{QoEg4GT*1KuL@3Si;9@_(a2}?dZg3YWQ43LBq0u zR+H|YWlDj8g6UNAUfHmmU1`^xx@*dO-LoqBQeZMGFlSbbS}jY%Y_nl@&!||Nh9|Q| z-E*=fvn;E|BWX%&Pr6Hn={fF!Kv!YM*fa7K!`{v>C{J|RRywe~vh*xdATejzmNzdD z9UfT|h%Gpq1nVeRwk+1G8`51hHY(Jl3yx`2)(qED-=Q+*m93h9~TcI!aj8@L0zhzSQv*)&tMyFP0O}txn{r=K&1rm_Sb8PKz8a za}ktPptDh?m5m)~vb#GPD!*>L1GgNv$i`+Hs{3cbsMjcupKXTKvg>@UE*qZe#`=bq zx5ruYpi$Hvrn9kmDePIiV|X4i!{PcChwF;(`1}Nc%SLV4apht~R;BIH3$Mo~0`0ck z_d=zLf0isrb`}GC2fD#JAcC~oAHF6@wcpfbC<8G{>=ll^{3;<%2^bnZLSpnKwDlj5 z`~w~7w&zH#|A^#MB&az;`_It7r(p!wIi~mzw9}c6K1zDv1pTuU1jP*3aiajT7^J%Be_ROT$9VjPzRF2(oZY==#JjB*}dn)nJ$ z6Ej#aF^igsud$()-w4P?+FF4ERN8Oxdlyv?}%2obz z{AfJ{COBJXrr>|fK8CR0AoJrfvag~2&R7N(NA-|_5oj32Bxh!lk10%Z1@_~UAuN?^ z*tOaba>vkLah0Ixan*$wVLV1O1_%Z|C2z%I7FYXNkI7SG#I&dCb%HG(BY*fFS}8`e zle__%iEEgP(M((?u3}_jp8Az1yiENQ{$QQ*qB;F5YWAPdYSY@@5k`(scnf2D@dV{X z6{3uWW@#tTE$tQaMo(Z)zr=`|sz@e@{J4<3;JGGle-=9sY% ed!Q>#0}uQ`JN-dB{n!oVmEZSI;09M2IR68=0bK$B literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ElementsOrAttributes.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ElementsOrAttributes.class new file mode 100644 index 0000000000000000000000000000000000000000..b20bb2d7ea4fa0bda5571f22704448438453c4f4 GIT binary patch literal 1270 zcmbV~+fEZv6o&uZIkpTGt0ELnpkiB*K|Dud0%VXTl_qo~sa}}fc7!3*sp(9)G`@yU z;EfkrG$a~*03XV@_NIkK;f9-a+IznBuQmJkpYOi_%;RnfDddw-Q4r>qf!P%K+aj40 z#ujE?m^%g*7>1pa^W0f?E3a2eOV1csk!mZgFp7B?Z}OnyDFkK==_S|QC@#Nnor9~Q zoM154oua$uY%n}1)mu$F-sXPmtrteEPP^{eyFBn4JofBn7}-wXHN7y7%I&2%Zu_-P z>_tx)%)SJM)KL=#b-C=WG3dnTcoD?*1WdMYXMao4oCdyjN7?ZJ!`RywT`S!tf}UKdq`^0v#=an$}xk%>6JL zEGoJDONP<@(NSY_u^#lMp*u88sv=ju>Wcv;`WFXxJ-5SmxrGVLSQv+8VGI`-?w#hh z2};(&8DuP+73Q2U=aC_;qKh5yaLX>&cD#CwtMuAZ^ju72F$4?r!o=gj2<7R4e3VoX zk!7fo{?BFw8mQ4sC@r+KckoW`meJB(GLtQ9^uSlrx7d}&(fB@_AC@W!NKDu@Y zn>rDp{g1eOEMgkhdMX}MLxE2V3EI04Fw~Dwl~4aDnI6ET50zX$9;2R!nK=ey;s$1V zYGS!hp!5T3RoREO2VI1!3=I)#GBib~%P?vD6qmcuD^;}%qf*tnFe_EPi)3XFiuhYh bE_DnV#Rjd?q(79z6g{F@`CM+wadUqGG}7wi literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/Hashset.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/Hashset.class new file mode 100644 index 0000000000000000000000000000000000000000..d0a5c2ff0fb8a84a4bc8bfff345c1ff09f4aac95 GIT binary patch literal 879 zcma))%}X0W7{;GTHrafvny9f~eph1>!R@IOEMBCghfoiSqPNLrFk?5nAv+QLi@bOd zS_KOpJ@k(%eP?z_#Y8ZW$(whc_czb8JAeM(-2?c5S^;^?+gK$UY7N; zVq?|DdxnhSEnhHHnrHl+y8|VC_ZyEoroGLO{VW5ib{NvN`XPh08@5S3)s%twKIpbY z{~(^9ZiXKB4|!ke|4GwQ9T_pyn_k#;Rfo&4CxR#(^gZF8b6>W(5^gt$%!!dubY9L2 z1I1-PW0hL$$>+hTyVp7sp4zUTkdq(cf?;}eleT!f{mdYl&v?GzeTKrmvG7&u;Eqm9 zXK(5J4jfD{%#3*!4hkqbSi`!5DmEOv(aMb%CSxcW=A$g+_Eac_>bRI=!}SIv|1?HE zs;-Z=uuRt=PuGKIB!66v3Lk7qk=iJ{|c`Y z;dVr%lJ#V>p!;e_*lsz2 zXY0ODK`8xU5J!%*N5WNyLQC88hxV>NY&(7FiGArvHImVeaC8tIH3?NGl6-9XH(^j~ z4a7*;uJC(yTSv<8HD}SpTDkUzh>0V8v@619eb%W{F(TH1JBtb(Huq5z73s@*KIv zJkImV=13fiPftMKc#?y~V=3J%;~LMc>;M+9$SanL>pUjO2Mm_ySgquqeMkN)igf%F zh0o7VP(0@S3~M1hV>0PHe^!dQmgP+_837gCNO`I}U*=503T{q#wm9YzJUTa}wXoTCTiaUP+;ua?H literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.class new file mode 100644 index 0000000000000000000000000000000000000000..80f5dbb76bcb7ebadbbdf8f9283b8d2cec74088b GIT binary patch literal 2869 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 S4;b|J*YN?>mql|PBmV({x_{FE literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$WrappedIOException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl$WrappedIOException.class new file mode 100644 index 0000000000000000000000000000000000000000..a7aef377ca097e3dcd2d7d267d1e7d8ef1332b24 GIT binary patch literal 1155 zcmbtT+iuf95IyTSHZg`kxTKU@fdGzE>Qv&bTpkLMB1Iq(6rQ)vs#)ZlY^N%J1rjI{ z4}1V0g_yP5qyj$>@iIFzJLk-8_vf$gKLGU6wNS@hCAKUWxYr=BhYSsI?29Cq zal~+K^pPKNPsZNx?dwzb9)s~rMlyfFu;EljbSDh@emoTn&5?}6n|XL3()auzAWv%) z`#hNNR4V(#spm79(cOoXCyAJzNylIhqe!It0nai)F)v4c9D4bT%Qz8H7SB^(ct<>t zQ=SVij52TR&qT@w`E z2d1rzKSlXWpblf-Nadks$v|~y;GKPG1-AsJ8P~+x}%`&S12ieYRXQofZw@pK Ai~s-t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..8006a6e9b89f603c6224189b50e791c9129b4318 GIT binary patch literal 3846 zcmbtW?N=0482{Y`ci43h1ktoo)YWiV7$h_mwFs8Lb{7Lgp^S#v3p+YHv(C-}mSx%N z$G-L#^wm5mDd(skI;XPJztriuGqZ2G0$XR#xp(K@`~05wmuG)JdJLcs--YoKWeF-0g5yVxod>F=FT$L~%Mi^JcvyUXGVKif5J2a#v@Gx4jD6W?zWJ1t! zO)S^LXon$=vl2`RmV_Jw802x&o)hOpn@mm3Uz!}J>%=v6Syc?xTvDbSTQ`>m31-+b^Nwmd zGpbSGO%U9QMaBpn__!O;z6OwDH;b;0076e0@S5uz|0PiR(FaWblI<+z!*3bw|T zW!2Ers>7A6nOCN?49}|L*_;s(Bt*Y+BtANHDKR~toEVAEr-qX8CO8bOszYKe6da!S zXc*WWL!Tz>5Fs{^YBrG~n+UOql-Ur23RPVz3ZbWNnofp0y2cPZtDCxWp6uB*cWj2X zVON)ygl_UwA-llsX`!mHnWd@5jB4xR+dph{GCJ8QR)^-qzeN{@HVogF1aPY>VcAQ{ zYSvKl>Z)=jnV95in%je01fJv?*O$31OgngNLn5`{SiU1h3r@inUI^$E9(!IO0$t}R zqy{!bEqk|06mnZ;>!faA_(lS-$PK&Fd7&Tgst7Ybqc(O!*Om3mL|;F{_jN(mvi=L$d)4E=7`Q0kNulzM`s6Fy`+s;iJmuEKQC-xOmU5-)73ebJ z7?p7hQ5mnHOF}`$GA=N5mU-89DZ~Eqla%E?8sUqc-)-BnW%Of3#wuIfJqpW!YM807&>k#vObq<14ZB z<7*k;;9G|1)`2#8JhYH^Y*llLO(?c?b&%F-_K}R^ilPV+^zU{KF(DF=`nKGgmfEj#5Fq=qih8$+U14y%Pcg>I~}Bu!^* zYsH-i{JP*y7Ufe0t-e&-n(|exMhMtZvx(9Wkmn9fHx3O+rTOVVb<3^39u#P^^~mg% zq*^uX`SwKE4NII%ezekv6ARb4<`gTdYeD~rI_PEw@uMd{VGoriC-QDQ5l_Zb(^Cv5 zYl&7>UTZ;6r;t+d@#(SnB*W>=?NJj$*s>v4Abn5O(6^#nz1RZiq)~b=jp0Gs4(yn$2nMKCT)8sBjm zXM7eKQ4uxT*U>y1jjdrvs=MbQS_0^~OUE9A9V7?XV}#ig>|{?}@Tf;t0&mA4&Jrj= z;T+BrWf&p6iMNQBVF+*g42OtL=+wN9*4gOK2z0MuXPH${K(Jpcu=;7K?P5L83=1GGIwdouPLj;y0yz{@`%bPv0JMDQLu*04M2zKcD;p3AW^*WK7g zTz`km{y-~xhA#Fe`q^Ku6rCP^Ns0ly<2q6%_l}Wk1LU-ET%cXJEJeFeuPyou8t*37 z5hR~UBv{iEp&2Q^jeee4U0tzK(lrPf?;_#8YeSN_pcEDgeGMbJg|c< znCv|u2;ul*WL?C2KExoYB!rZr-E;R5s14#pkK}{UW0EaOz(u%8O!;tUXcut7DEX3Y zgcdBJ1qn^0i-#7#G|>kr;9sFVN*3Bj2_@2@nf6!drk(cv^nHN#PTCLBehB;i0X%6T A;{X5v literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaReceiverImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/SchemaReceiverImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..076e5d2b1c64af4a6a53a1247e44e49abf3d589e GIT binary patch literal 5395 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ValidatorImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/mns/ValidatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4df8b2011ddb64744d0cb0673cadc3ec06b7b799 GIT binary patch literal 10356 zcmb_idwg71asFnd-7BxI{E#i%@>8+o*j~v}9*&*J&cl{vEF#H{mDrI@?5tMT(#F!R zvb%ER0HFyXKnQt}6l^G^X^YdA(j?eY6hkl&l8}}b`XYT0N+B(23A7Mepau7vbMM~W zYi}gy_v;@z_uO;OnVB>5&77IDdg<5CJPY6=c{GY|;}r|vvG7k(l;OMD{Bsny;JY)B z#P_uMzJ*t#nBk86i;n!Og&*kiwF>-Ol+S;Uq6$CMk=HH!D2lo6+#l=6e`xccGw>7q zG>SLyGkyIpZT?$V{(J^5!Y?Xu0Kcrn|KNZ1^;g>awf4@i5ky5KWJx*aOW2Y~6syFF zVxLs#$c!jfN>rQ5sMu0fAv1M&mL;>J_+6Q!O|>?2wV9{iYN8}NUthU6DGQX#LS0;I z$)YGW%3?|&ODbilEYoIrh15mm0$D*VNWC@O=oSyLe~UD~Lho3vT0 zug%)D%s`)9q|L?pdWrTf)!sU7F4O(2*Jgtfyj+_rv}vU_WuqmV_)V=dSFWs-tK@1+ zuA$asGfgFzSh6Kba&7vu&XTP(hqOoG$hJy(n{2nF!;-fPs&;0agUPY3_{c~yH6XA% zQYk0XHWbfhovgs>8STqu9ETd;(!P0D`>q2w?CKCycis{|9B&zlrv_Sjav84NNK$R- zR5lk+<#xx1M!8~+x1w`L+vd&#-J84G1(k`>OvXv&y3+leQSLr2?o6bITXKW(WO~F& zWz(aXgwt|3K9uZ_=bV<|RJNrjG3X4(JBCMw8gvPnRSd<)wmKuZL4i=9ki*WR&U9v= zWo&q;B^w`WY0qTRneFjZ|B#d6g6K$w)HAuHZfj*Jj-$EcP|Hqt))6X%i>#q^BA!cU z1T_KLo$j#8k#!YBq8myP4Qzvo(LJRzW+$F%Nn~z3MMu#+8$CsfEa)6&}> z&kkmt94S3eVK{c^Eo=NJvH&~tBQ(T{lx>EVBzYLKve0XiNSa#p2#^Fa7p5qM24KyfVxk#eJnvoO44~Pxt3r|4y4i<-N&B6WX?q+=?yrZ(_XrI zdSIUGueM>^KIG_b1lO%DvZoh8&TFLD!#C%>Cc9BLTIIOZHz#y6mUME+W9SYETBo%| zk>r83Gz%lhXv*m)SL%0Rzzju_P|YcRm!zPKDrP&HVc&Hqb#I#BR`(h8-JT0(r}D1f zmOkucoPK&x2_>!BOF?d9kj=IqHkxdm9`6BsHRQvNQmW45u&@Ea+7fKvY`3cS*@bPm z+7mQPsb_bVI;OU%YzPc)^y__Bg53Glj`@^ z=!*~4D@v*3oa66Y@G9w9iHyTD%$Hu!HMO}s)lBVSJ~=8Qk~K%8>(_}xexNk*t0xyv z9O9(e8M;P1TP#QSdC75}HqotCQfK*SMbNL-v1;S=fwP5%J}-Uh@`!t=QGU`si%Ln~ z;F@s8Vc4V^7_Wl17A#}rDvlq)@6=Nj7j3qX`DLddNA#HlAVj z6micsCKx3)xuyss`6DbecClc^*&n*oxozoDVlW?>$u2aeX>X57jQZ+9p zvGE@KhK)OMm*9dDYl8WMjrZdNj69s!983zD4|{oFGn0bmz>aPFExtu5b0W5i^E$@)R^4QSTL1#eD&M-bG&#S zs`M9_8X^!CRh172mKMjjp3OJzjAycrA4+U_P#)5m4_opPfR}|Y2>VWFOY@hb!`ey6S8RBgXxUoi|K@x0B!Nn zEc;Ex0r>jCO!_uceiX;x!l+j>hwV%(y>Jx4#O@@a;+gp+EO~~-<;;|>#Trwjt@hC647RA9Mv{*9Av#8kS z!Q)krbNZkr|IvizY-2f+qoJl$g@VD*F|*0R^41DsQ|&#tPH>@TU$dRvPJ%T!cTzY2 zcl6!DLDHX=s+*yy^RZAH8O^eS$`d!J^eB}iKAVa@3(w5M3Q~B5(A3%ARQ|yYM98Bv zK1L@yk2=j0Cc7h3C;&)f-E^ugwT@|;+9sY%W%Hj+9>_9d9%b^X8vi6<$H^X`e|vD+%{{9Jje=&6*QOdqP>A! zzcAYb_W8wus_@N4MyGc(!Xl=_btrS`S+lyM*sJ|}&)H`?FxNP@j>d-w@j#i94-NE) ziu^9La_HxYP;#Q`E5XW*RmPlzdn-`vKXZxVg6w%bUtU5N=ZA1qnR=~I#f6>Wk(?Gc zBWXtJd32P*R{e+>b;G)Ql{?dYVF2^|vspt44&rQ}03@xU`+4uk>Qb0p_^5ruzwXKsP;x0xy|LJDd2NBFBz2-ooa)}r?gjR(0md5{}ObEfUG^gX{zI`FAfq#P|Ey`zpfx zkqS5vn?NL1b`n-hPNE`q3Nv~q5Iu=XeYg2u)%z4?zJOWPv!2H6-p^s?aYQ&WfjK8p z&F^zLf8I&d#2Qaxeyr&v7Q~*y!lrT5p2VUj$s&Xgvu#Et+iOvdCHxtz4l{89YOw;# zP>-w7fDUw`8(rvOyB|AnKWEpuBH{r&$Ttd$ho~S{I_#-RLhQ35@wRjo-$VQsQArjT zI7iLsE^fHTP@V72@~K9&nk5a<@|E9IJ@-=1FrQ7a6R2n{kJXk>V98M|uPr};rIT33 zvv>)g%gdo7b*<&c&%9FLSk2YI9?Zgx+~poLqStUlyE;KyonMX_A28Odlt(!hO__qv14vR%(16;l?L8Hvb7ub)hofsJ;&t5(G;>Vc-xb1HSQ=P>FdU ztnySSS`fRc2^}HSDga5x8Ygh!Q7rOUp2Di$#-<6Z9>FX&pmNZFn3+@Y-XD#;Ti1r6tzOFXcDWPmUu=)L+zF8yUyN+FYW|r7>;SP2e)~ z)D0;uRD#@^#K{onhokU#sS?aF1#jixxTiBW3^!ey=!X2Cve3$T90DxDQxU* zELTi!YK2X2|*hL)8y)A6?=eiQ;})iU(vh9+aJUM0)Y4#5p#Ak4cLDqOsy`2H2JCD=@<3 z_7EP!?-MAm(t|z?#w=2s=k=b$Hsga~QoI6>GYDH!g}s#HFv2n)*WnM@iztNh9?Bjs zJJdtj`wV+THhX`}9>XYmpCym-B3}*ZwUy@yyE$7uL9tJGE#ZR>QKOF&*hYMVjaV!4vd|e+W?pgX6`aRokH@2)9#z+9ptANT1GM2dt5JD<`c0TT zR>Y*b;ekzmA&OPtp4+{18r>EpB&(_qRCg=~1z&_6w2npg~X>>BqTh zoHlL57QN-8n@Ah2v@SH1CG++a@z4&=lsn!=yqAP^PNp!PTJ^{O{ z>3P&PHl4r@{_UK^b!A{@SJ&|~uN5}B%n154+evQn87v@+I((jo=qaq{bzJ^%T*4gU z^K>2s*9L!E8;p<=5RzATo{%Gas*nmsBTbEwW)eN2ydyw!62IGDc zj1TGZ6X1Dr!!hjlUv}^DyEh!gwwU{tkFD2w@7|=PM42~oqef$Qa<3*uZnusByr2yi zhD?d@BDL@W0rEA5wwG`}&Io^xkgKrQ}-=rh|B?0y~Mq_8E0gwBZ zdpsXx2uv@?u;&JuV#x7g*>n4cJ;-gMpf&Wzy{ECStBDSI3j3Ity`#&F^DMh*4;!jt zrh;<8B=(2!1V?tC#(~1g>*DTZg8%O@8-I_5_y;=Ix3LDV5d7cq?G0@5W!|J$yp+b~ z{~CP-&(XRey({+QyU9b_f~HB_Y&;+@C7G|;Q&8$m1Iq8wx4us>y;{U-fzN7z#|m@^ z^+?VCc-_pW<{ORt)0im*qHYj<%@DKQj~=mtHbpP6JreuLUVUR>O!I^|&-p%P3{;ps zfdtdx0%cd+*E#=36z0c8;x6>XU8tAjhU-FO*HDp1ie8p`T)X&G51ym>O20zRW<)5# z?x%E^H)xoj8FuceFvn*%$75H#HC~ZZ0M*WwWTDzId3}W@_eCkPyPKbr{4Ws2FN^e5 z>5&)xjmIO^#HW%9#R|xAHT|oil_7uSH;H{$2!ExVwNj+S%8>pd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #default + + + + + + + elements + attributes + + + attributes + elements + + elements + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Action.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Action.class new file mode 100644 index 0000000000000000000000000000000000000000..ba6616a2fc379b86b81aee601148fd0427a948fd GIT binary patch literal 947 zcmb7C%Wl(95Ir|`W5+Q~Xeg9tOAE%1Ma`NbBvh#qQh)`}MRzyuRpQ98+t}#`@E80* zyI}zm1c?P=#e$DQ%-A7RVG&ij%9xGvC~7eVq|HrXT- zc4L{*9xXE9Ut3Wmm%K%MGYj<%x4?W!=}n5iuO>U2e8^-A=>^IR6bEw z!7{yw>_!upDWkapRZz5o))X_KFISe@pHcZpK?zqaiuD49>8W7~ zBiI$Hu%H9#W2NN5Ir|`lhk!rpruQ?0c|##F6=>-pc0~0S|oxh5HGli)w;@3IZma%^Ci6S zhCreef#@R-dYlM@W!HC&*Ir-!LTG zL8Dv_Dk88FjuQ;YOQfjLYU5&P6&=w6F)x-v4pExmYZ_OQssHHfU}?{&?V4*%+cs;? zrrXtGI5p{*5ATM*pTZIl>l~e`n`ACj05^w#R&;0lktN5guZ_5{ZyXvr`Z2&e5q2el zV(I8bpN<~rG2GB`6So9XVG!-aG2GTMgFAA$D=;AI$WMEnG`^SwV`=S8&xOzR@PWfoqs!rE&UCath@5%rhc_YAp^K(Ou$;t0V&vGBJt_Sx*t9B0 zd;lMXxHAb!x|+zcb!X<@bIyHu{`~#<8^B8(*jT})jXWL~@dR7yvu)w2jUDW&?M(~M z7z(e0D3C`Chn03e9(i)egZNBDX*^E)!aL_-;BzUwC<(m}u`fQRd>|UtE<>(GONO;} z5Q*dQs3($B-V14GqaF8o*yTx}*3-?L90n=Ffsv#chVi#%Uj}j1U|1df=VYiGW9I@H ztTT~(iIWk-D|2QYp$R*ZQq{@jQ)N*vjFATs2a(R z;}emNLpiHYPSuBD&lsr*80?Pj>)Svzs=QF^!>|0DJ6MJ7;5qgzyl_xK)jJA~x>(tzi)Q3WMSOa$TB` zwc}*qU5r96J@X> literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttachAction.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttachAction.class new file mode 100644 index 0000000000000000000000000000000000000000..b1e5d5a16eb63a8c313059e526fce9b044256e32 GIT binary patch literal 1561 zcmb_c&2JJx6#orhD_d-#R%>gOYOw+fY}F&CNrN%Q&>lodJPx}ftXX!OWgtEJ-+0wa zn`+|GgMXCq&4RFAx+EIHX6EgCzmGR>_UEs!-vJ!psg5j)Ix^T@!F@bXk3ID$X?Un( zACJ_#qJ}a<=9%L;@{plXZd?A)lmqVgr@|ZgQ;gu9N-r7*p~HIIE;ydCkrXjZxm zsTOS+*4mCIPR7HY2;T6XOOf@qZ*jNF14r#=!IT_0BVvgqIg*lFgCk2izSm^P4*!rc z7_r3*g$&xM2;Td_km0!8_Jh88HgwGqKQmjtCxs_pa?f@}(2ND`h)_&NQXfL++F)AB zuyYkKLwclYmT~J{I?lh=)*33tg`fB1CsQo;Q|?^)gcn}12R?P z0_+Q|61W~_sHl!KWv_rDTX%3+ z@dkB0Bo<8DgazVA6Lyx+HwgC*q3+R2F;}OUbLJ9mk{ZQa!X|E$t~83F y8s%&Y+cP!KsZM#we?#V-Qe>P%yTG;26q|a?geaR4fB88}o;2*xdxpDV{=MJ7WV6)( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttributeActionSet.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/AttributeActionSet.class new file mode 100644 index 0000000000000000000000000000000000000000..a4ec93efeb9aa08fbe49c68099d5268b6cae4da4 GIT binary patch literal 1299 zcma)5+iuf95Iq|^apO3ow2+jRLgq zmVp*SflJA~0RuavLnw}gCmD>$8;B8)7&hOwyqF645jq4z2CdA3?#F9Vvm3p%KDhzA?AC(0Q zWeY`^7D_M;JhHG2m*MeM*lg_?=2dZb$j3+St6uVSrd*w~NQx0@&%=33uIYIFcxu(PQYzc(?l-qDpB6~1pPf3NrFP`EKPy)m*5(fQt%!{t3m~5 zXC6mZ1?xo-fmC^`flbqUx{*DIoLYZ1ii#=aZXvM}>$7%gBvMM2g`!w}Bmhk{< f^lM-}u2)ZTUg~F4T%9VGuu73-QkOo6nCbdY>+JZI literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ContextMap$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ContextMap$1.class new file mode 100644 index 0000000000000000000000000000000000000000..bfcc331cdc9ec335bb2985fff445b2ea7e10b7ad GIT binary patch literal 235 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ElementsOrAttributes.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ElementsOrAttributes.class new file mode 100644 index 0000000000000000000000000000000000000000..96bdcb59ecdad04e8f7798b80155797bee00a0d9 GIT binary patch literal 1270 zcmbV~-A)rh6vzM5{cKq%Rz)a^f{JZL7V$e06CjH;sWhQ0N%g`^+ZC29yQbZ8X?zWz zz#A{LXh<~r06vuQ%+NxEaKp{{n%Up^pR@Dl?~mUA=5Q~C6!J-^Cd}rJZ*f0*=Y_4P-K=}|E)V<$k3BnV2DTG;J6;&K%FV?%Zu+%$ z?6saUm^}#$siP(g>QdQVWzdPy_F4>&UZ1st_BP;~M9>%f(2t)HI#TRuSsc%#vqgyC^6e^yn41Ugy-HLXWs%>A&{ zUsQ7WR}90wqoc;=LOtkCLw9JHR7I|Q#TNsN^)B}BdUl)datmXawlE6I!U!%g+&{~2 z6O^olbI4dYFU$pDE+Ru(MHf5Z;ig@#ZF}_?*XXsS=((84VgMHCg^9<5A zBAty2sPx2@p3vm8LNfV;&`(~ch=dSvoU$@y3G(T}K3GBdjznRc%vbrrWwIF(0#d0G zK1rw{f?c7?$iZirkWC06@r+KclK2Do11J;$105)ZZ%C*g=D$#yfB@_AC@W!NKDu@Y zn>-bv{g0S95iy19T@_ELp}?nw1nvDt80sge%I9NBrus1HLnSv(#;B)arcc0_xQXem znpo}=DE)+5RraCnK^LJaLqmj`3{4U0GE5r3#N`h3N>%N^s8qEM%t}@7AX(XiBK{VW aOC5nmu|cae=?^6_NsnkoK9^f^+}uAHeCpf) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/FilteredAttributes.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/FilteredAttributes.class new file mode 100644 index 0000000000000000000000000000000000000000..049ffce67e512ed776d4928401a61f3f7934a2f8 GIT binary patch literal 2835 zcmb7_-%}G;6vw}J6A}n3iC6^9Mr~1qgt9=TX!&6kw2elPAL4X;unX+K+9jc3VQ8QG zU)YDXFMZ*`&J-CsoxXOae@Xv}w%@b6vw%sB48z%b@7{Yp=X>^?o4@|~?GFHhc$&gF zOtzpMx5a!a=1wc#!`&37FfHbuOz(^NOw8wEiees!d6?pfl8he7XhzIz5|5LZOJZIj zWqDrJS>E>SErqU9rMhPBZn)-_wQJsq-i#?UJLOe-cfs})dP^&n4bxk*9LZ!}bK-*G*=YOkKigMM5Q z(Y?h!3Q`XL`HZ=CnWL{1TGni@WS7^xb*}cxo&;B(%yZDeGo=^Sj%B)5dCgp4{>y7j zR+FD%1znCx;4{_+MKp6d7YvgeE`GBaE-qQ_b~yC&t8l%y)^F{K1QXk?I+C9{VYIkM zY(+I4b)1TermusbB;0x1a>E#I*4bW*shfbFI!EhnOfC3D#}7pPoweU-KxFC2VnIhI zx^#5lyp9XFsG}EsNi6Dkf<7Hf=+==(LC1$;2E>?R2E`0vSjPvlWeB4>Zpri(Miqt| z)qib73Ynu+&n~~PSJ+7B>vx-9Ff8kyMwp<@ScF^7w@gHg9|Bj{-{+v%?=g<3o7YIY zB!N#&Qov`1@3SyybDVv_^%$S&`~g(Hun#TYzmM22{((!h?TFK+Xj{<&9c?&+%Urn< z9OLtS&gj6$D1RhijeksEi1~r%#m{v9SH%CsXr9m5A(|9^PwgWfo8Vk~jl`sp`w16h zlPnmoku>68&VHw#BGK`jT1s&qScp4uC|wZQ*4o*9#F3?k?>O9h}aPc1rY7d;&Hu zG|>_@ap}T$@fFnX&WvT0lCYRNcg{WMch33Fogcrxd;_qA^)z}hXCjwI7v_3kA+L7@ zz0B)nA%kmJ)JrkV(qv2QWhCsel_G(4HDs69Hxec#b zFRS8#bnJ@sRne`785_!HzEs(BeQCQ48_k6^Inv!NKH1q*Wq&RIl9jwtZv=);9`Z<5 zDyIap_#{ssIF7(V?#vbGrc=so)=GB67Z{Jpv`MR~OW*cf7M@`Jl(Xz8Sr;&CN{hoT zCUf~yW71CpEgsr>0+yDYkVQQR3j-Jw8166>3w`Lfa1*yItl+kVRm_;UW8p5=EZoC= z3sX36;j#wIol$v#fgn{(YqqqjTbk`OhK}OzH|f6G!TqFnq)99tB{Vo#J@@0LV-oYy zRb^w#tE){%)s*YglXsH$A>*poeqRc@hOlH1oDM)^p>rEFh)J9a&N;>ixxw-@G7})lOg{g=vOZSW9|LCEz)Tx>0T&~n zA}&E-cAho1U~VmZMoQo<1>mknpoR3|@1Ms>`U3YM3N}p0NRVinwiMgXQeItMww*GI zOSEf2c?+YID|~B9O83x0=9nEyJ5FII0&Xa6s!h9snTWCcFT;FKUR=?s4)Fq41FzXX DEiDOE literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/IntSet.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/IntSet.class new file mode 100644 index 0000000000000000000000000000000000000000..b4fce4f505946795aad96bbc836cf59afa54057a GIT binary patch literal 1707 zcma)6O>Y}j6g|%~w(&=kQ0k<_PHNgxoQbj1(uR*vOKlXuD2*#zMQT})i9JasOvaHt z4hc)}1{N$pY*;k`#YOynsGkt6Bp6v$ku^HP;rc`ZaUWq2}mp ztztU!X5E%@SE+j|c0(XDTdA$(y%p20ty^xR)~r{o{D$e+RnxQbZr#ZjU9W6;Q_Nyk ztIU!qs${P90jm+K{IL{avmDwlIgY^i6N5^mfGk72PvnOEA**FGvcqM|^OI2!RHtWG z%?&f}nC^0ZuIV^eYqslI^_k6zweHz9mjy=4s{A)>*>udWJ13*!cp69J=tF-T1Biw3 zQXJ=TLEzK@X3?!$o28~#TDn|oy46MxSYY(P>#)oMXP%5hfq?_0(&DOBVT+Hc%3BT3 zTH`L5^}4xLsjY7b7@5cV_G6}shp0Fdq`6=bZi>*%id(d{N3g8&OeT0;-Is+pJAwenbhhPvxlz`)S)`t_z^wO!> zH-1Fm0fvn5y{N>bq$Nv+E}jn`av*@jXuA4o)jF&y%tV&SIFj0enX9B(q7<_j?5I6GzT;31y7% z7NB($C%UA&q&!5;!*O=;6?Db0yf2Vgt)NZn+GKD<60rk2p-amSx;#(_B=p=42D6D^ zD<~8@EluP~?auFAqtDn5hI|)a+tQWKcmEHgzTNqQq)k#B>1jPu_#i;MhTMGgzd!^2s$a1Nj10zStizQxOA`W5_wSMdO^;Wtbv z#tS}MJ$4^*DnsP*818nbFv#gho;6NmPt8MT#veGrn0h}aIY0mXCY8 zA*C#+bpC4z_R^ik^WESLddoql<<@H3i2a1%_1g&jEE!McZe4jK(|+(uX{>s|Bw%Yh~q$tks{?hqn97j79^`e09+-zcDdS+@ok;x>}FD#^|(lnqXTj)C!^flddac(S?oJc0l%P!?{rY7c6DcRsr z5E!4EnMtH)6%3@Z4WsTJ}|nxV%_l|p>7yrh$^x1<%xGPtN! zby=d3CH;E7q%V=)6$R?+IlZEvuP=3`%9Z8#YOxTnYOC>7Ijb4v3eD^>x6M`MSV%AE zMZIK9YAXslEsbhMz7W5lRda^6SP)!QGpN{N&Ctzl5obDGDQER+m0~LJpU#)^#u){t z2DeMSI}f9m=;OHQSbK_YrEA4Sy)r8-jiNu7MvNiRZ3&ecy_`4lXb4c!`c z4>mO-u@NX($;iNz{f^1j#e8YW4jKh#n~1-&h-PSra z*eOpb=v63Vmad7sr0X6jP$#73syGc+nuu9{H`f*wC-Iz$Z%K0sQ58>PK*ci{Q85YL zpYP~Vt#nJp`?#+lx>L$Jp|0Wse5m3h{6xh?OeuI~$D`X^R562$il5?V0sLIWFEFp- zm-v-}eOuonDt;{weV{3*@T#@fPWcP@2mPP7Q>!;#WzE1b82@sV$St|DWB7- zljVwTry8xamh{znxmK|GE#io?$Er43Hplqpct*E04so2x=JcXQOUDPJSHDyUYbOhj zUw^Hp6?mkxi3rgv{FLeEXBN`{PZ|3pAHCdK8UC@k8wWanh$gSlxu#1bA|`c zh9$vF8_Y4YXLy=DW7X^#sqDj&muAn@G}oD(>^u0!Xe06&j&7rczd$VZ2ukczc;+9W zWewiO&=>Qp!5YhXTx1Wn&NK2@PWK)Y(D=c zAGzFn#PWOogxeO6j+pf8=wLd1j9`pu<`*{W{45^&2Ow!VxbxW?;#g?F$(zrTxRWN`=AaTht$`xw1RFc2gVJ>2oM>2nLO z{VMgDqu2D+(dH5^+d8-t@?hiAt!yrsrnhGEOQf|un-4YkTZdPg9=_5PxpynF(e&_D z3SlA7(p?W->ZWqNUm!BHfp(U|zIi6n;WhL&3gBKd%~vVuEr!h-rd_K*bUSi%Q`}Kg zqE{S*Yc@h}jCXX1FbB889BjZ?S@I@p&|CaZ`fXO++b*bH2ddYBTHq~O&SdS}=pl+( zAU5D@`NW)<$lq{O)Z_nZY^{jt;7sStgX{kT DI1INj literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ModeUsage.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ModeUsage.class new file mode 100644 index 0000000000000000000000000000000000000000..0bf39527c9a8bebc50bc34206eaa30437962b500 GIT binary patch literal 2966 zcmb_dU2_v<6n@@(ZJRD7{U+2v3s~}1f{IdU1+gtsObQlSrG9SHwb`0vG1)N8c*noM z8@(zwT!3R+lowYkNTY5C5dfk+6yL=_ha|G=Q+=F&UyE*e}4NNz*$tI&@dCl z5N12Mx+24eGF+8mPQ$e*K0;m$3Q_c<(1{+*%c1L0u5QS)kGrsdn=;(euo%S>K9R?t zYPc=)tPIN{U}?EMK%MIj3Y;_8qfYw;Q#hnY(M0tyRM@bJbcoSD@XbLRYa- ztC>|twhEe@E*N(dvimxiwyTbL&!IKl^cjv*vsN08d81|*&3fIct|_QFg~*guwVaCz z*OU9YbYnW0RceV`r`@0r=dG$a->9sZwOhtYnKXLycF`y=88u7x{=<+{vg!(%1NmR9 z8*3uZ_pdbQeWBYl6@op*l2KhVr`uC>^MDbh_5~BQU-FEY-!+Ufvu>B~GAr}1G;$_q zaLsfs?^SmlX0=htTXjca$cwn)SmoR-pPDtpvFs{O_gZyd?irIkvdShP&7_dk=-6wB z3%(rg`6Y^B*Cr39ED=ih*e*(ZIV!= z5Uv^(llhF^bbJ4bC4JG|O!*nfqmJVkli_n62^`aL1aTclWf;b53aNwKA#Md}_(I2* z_)5naBWVG+4)<%?|92LMEQ6!)t1fw*WQ2| z+0LR=ILsC**fn#uY*tv0^wL%39qVru`d|8NZ%^j6MYLczCDN=I_edi-Hz$1g(jR~Y5$ z8czf{cce2}wGH)z>i|x0jB*CQeHuNT+uBnt2=}GzE_e%%Er7gz0gevyqWv2%cK^X(J#L znLnWYfN=0p<~g*2IM4FGfe|jlT!uF=AZT1ho}%Lcw9rF@f{&WWy)LQaRCk1=M@jlb zo5~Z-C?=3WmgwD#VVuebxMq9%@f5ii`X?oVEp!Sxr~6Za{Q`%EW!^&c{?zbJ=rP2o z)ezMhCBc>eCw=G`b8wag!!L;3B0k`Z4;ah*jIIqt1(3utJ0%@&^B8NAi8V9FE6Mk` zK|zJWGF=4&KjB6?%~fa{`W6mJ*|pF literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NoResultAction.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NoResultAction.class new file mode 100644 index 0000000000000000000000000000000000000000..83ef6e3df077e6a1eff042c48e57c2fc0ddaa5e3 GIT binary patch literal 711 zcmah{%}&BV5dOASDg{MQ5pSN1NJ8<9At6Lh$iXV%x|9{xv|X}o39seJ#DfpuLm8*V zpBN9F!_3Y%GdsWUAFpo!IykYhg(C}f3&#wFD;dhT$Iw0>dMa?@1(#|m!bm0B6V8hJ za>irfgxYs*)l57@d@j1pF@rfEm7y|}p%^8>ROov?^$DpBmB;-t*D}?=Kr>#*h@q34 zWTfsyl=yMqi=_&?48`C(Eki3e{I^C1Ybo@j(gDL|esiwK61p*UoAqa3uRXC$i-;^V z7^>cahjTGVv=(8U=3$uR|C>5?o4IxWYuk3S4cy3dqz8Y^?I*tCWtiBez2$A~Zz#iA zUchGZ3=O5{&N}d&h_4;DKlz!5c?yGWD5aEB8K6U=SC4RmWZ|Oq0`^QV0~T>RLrdgW n#t!NAjTee!NvVJmS(pjzVvqi+5N49xC!~rRX*2@j1`a;~h-%8V literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NrlProperty.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/NrlProperty.class new file mode 100644 index 0000000000000000000000000000000000000000..5cacfa84bfe30b25b608ccbf3737da13c0f57b2d GIT binary patch literal 554 zcma)(TT22#6vzMLZP#thOIcY@Jp^i(?Oh2>l!VQq-GrWETo)Z#cVk_JK34P~6!Zc5 zP|;blj2NU@M6Pwk7OHC@^Gerg_skzcm}i zy-~ktT-F$lbjurQ!GH_z!FI>q#J6m1${o?;fvq(i-oN%K;|GteUWFl16|M-*7^1~e zhapz?dNxB^7p~o&jJmdO@~%TlPWLSCbht0Vcp=7uffzF!uSB}OqqTkKn@UW%YB>w4 zV$2t8ija}{RdzDuQ?5e68bkU2FA6($Rmey(9Ik5nvlYQZpyqJ5uU&PAwiPhsi~3SD z0$;fON~wc=`T~i5hoKOH$cxaSO-WHH(#SHh@$wApX`W8eotTRWtdp;P6(EfaMKZEK f%?F5*0;FCMxywaoh&>}74q;dhktxcN7Qx0RBI^nY%lC=bU@zoSFXm{rx9^XP8rw!2Mo4Q1K9t5_pUW6_a?P z;Hio@QVP-vG76>`;%^MgaNjaSQ|U58Y{9MwhW?^qiPc7JTgVN*ZPLtO(bls3+XC7}yrU&v*yyS6;a zGYsoeP+I$EhTT+gm+y1U9DL;F}&g0T00lj zkhFMB)E%yiO=)<&UZQ4Doq)s;)bV5($)!?gQxB!iFddeCSTnUcKh!?16ib3vgk13U z!Io4`Vn?`Zj%(N!!(7NdbZ;?ONifld*NnRE>#=NjDvoy&BIk9S#5E)tGF8`g<~8l$ z;2_s7YR=QSwU;EUf@~7g$SKg0?+l{Q;JP>DQC7+S@TcxFU zi%X@g1&SMMC5Ew!hB(VFRLH0W%OaIBg*=wZj-5X+vRXY~i-pR&`ZP>v}f z03Gy`lT=9`RnSi`13p0}0BI5s9ELICla6B)H)-_{RelS%{o2QHr%69cG2)@KbB>_! gVIOxi_}apa;I5AwAqKCedzhi963Qg~hdf8(4}ne8L;wH) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path$ParseException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path$ParseException.class new file mode 100644 index 0000000000000000000000000000000000000000..b9999c319e57a28e9130b15d94e47e2978a7cdb5 GIT binary patch literal 618 zcmbVJ%SyvQ6g?CBOjE0U`B=H=q7O8JxKi8{6){So(*3j@(vfshl4;SuQcwgJet;h( z-lPR9-H3}!?mhS1bI+am{CfWYaEM(K36!%~LnV!^G`1Pcu?R!%ifi%6P;~D3jN2Yp zuHDsvRPG5w>QpMJ&loE8)pDc9kZAiu!BB9d61UTFUj%o&?-5dT`~mlRJdjbo026v7 zLx%MZ4?=PNFc1?heZ^p1DJ6oo$HP!i{n#1!V_T27^d~}v{xlc}d&WIEZBSBn7gR96R^9^Oy BjIRIy literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/Path.class new file mode 100644 index 0000000000000000000000000000000000000000..83c882184ab1d610fa78959fb7ab2ba93d8ff797 GIT binary patch literal 3347 zcma)8U2q%K75=WY`mwUkkBl5Ua)=X5P-GjW2?$DTs4)(45h7T|A%VtOOB;KGv=Y)P zI6&F};kONtghE3*9movhnUqf3lqi{IrnECW^|^1I_My|qPG|bir_RuRXIGV#*k!P1 z_uhN%x#xc8obQ~~AHMv}ZvpJYPa?P-hdZzlv+_C;f)Rm+!}6MoKu2C)g%C`U9F^C6 z2n!;lP6sS`9gFbjGa@U7PzuA2Ac}Grl`x(Sp(?wzFdR{>M{pd^g|R5Y6CHRSFNE=8 z1Sj!bk$f+VQ!>6Jl9xkxMPcoJqgpd37V~DsvC6iBK55%#b-ZZQYGzGAtCq`-f;yxS zu#J+4qM2jHaU)fCtYT`$%sb`k9&YBQ$EK#KIH}M%UbbtFVLLNMv2OYq2`Gdnv$NT; zM<-;d6e44LrzfUb5}(2vPm;@w<@Sk^Um-YR*_Ly^LU-cO%1d|55Z-vXU@EN3Shkt1 zm*&jsv@uttB$_GbjpB?^wPf8CYR-a12exPOp0SM2VPS%UTEr}f~0a3##=bWl#&nvVviiSO(@}xAWECqkj zWT5?X^`ig_5|`{T4+bE>U0wON)lF)t2nu9aNo z9HZ(?+68lw8x^|D*hE@X;38Zyo-xH^g~Tc#CMTOPR^Cx1XZ)sJV20!-4kg2))7^=u zR&j=jRL7_z7&sW!d0yVNiYD>p+;r`=B*`6;r#pp>I?_0;BY_<{k{IMgE=Svdd12M@ zDqhp^I^NLnCf-t5f3u!wd|$^H9{k^C8_{+AKu(^)+d3Y{l#X}suEOrGL#Kh83vGSf zHWw?bAG0u9W4SGe4`=D2S*kcEX1!Q+wp6?@4t$-f#Lzv=aqDc;{5hNt;XNHc#QUss z%XTS0D~5GEjC~<|pyNllz|0K~4~OufjvwQ!j#01zRZ7PL_?C$1aa+_Ln>$7ycqSqB z7&Iy@DW*N17+*<_7PYmS^*r;(Gi(T@hDx4gR(|A+nCR>{y}spz#! z){=WVY}K-PFQcno#%9wN;@pXvW0n}Ma$Q2?fws!2{e>zDO`(Bs43YCmsfiF391^!>T#=psTlpi@@4c|JySe;nQ|NAKE_l{u?M!2E@7p8J& z0@TMDso1=Rh9Q&JNisODhFY-AT*FM7Ed$nX=EO-s;8`uyS zS;C*Jpn;(46hxlx6%67G@FQH3I2bR!z9npi)uB*7^^B^r;a4mqz@&3fd7Cvb{ z!to(jJtpc)=yey}vS>Fwd>tDP#sarBUZbCP_%#}+nihJCwYGl98Y{Z!P9!505 zQrXF3DUt!tk{2h*gO@RhkI0Qrk-;yJ#brE(EBuUojvRiEX?%eh{0&dyA2@`6;%WRF zhZTRYs&34wUgXs_6x0ArbqD6vK3HlBMfC(q>HutY2qWqU>gp7pQ*YsfI)fL~2RNxd z!723_UUGTzG#Rr~C5htO*^8_ z4>FE1^|9N#$ba=yw@n0GrfFn)lzil;+2cBFYD=+hO2%1vo3g{#5dW}AqCUx3TRgqS z^eX$=YivocGmdYx>P)(%hfHQU7n#haU1TA2;R)jQx1s1@G!HaU{DnIKqBxTD@4AM~ z8UJV>%RY1wkF!0jxr|$*TN>ye^m@a_>~I5HoAPax`_o!XqwF^KNDtLz5!2X78W=dO zv5WlG?Ik~7ZnC?`2Jpv9h`&`f;BE5a9oE&m>=9>)_#E!WdB*%bdUBo}`wV9BzU%8< z#Cb3K%ahd7sJ)xJBSbIWczuRmkRMOcdWd_H57p+ikGzpy{2koEG2-T9BkhF$3&p3c Aa{vGU literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/RejectAction.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/RejectAction.class new file mode 100644 index 0000000000000000000000000000000000000000..03f494239d744dc52a296574db818b9adc0c5385 GIT binary patch literal 1445 zcma)6+iuf95IviliDPKeLTCw)a4WerZh^O;N>u8*{5+GN=L%k^*u_h^ zR#s4D$h@^2D>!6mRl9~e)`JnZ+=*~}cj_5JzvQ-M@<8a0XY0qVDL(srDB86?L#jhl zhK;V}h?D7fAiOg^u*tI7bq#L!xo64wKVvEwSw6AElAMYQVFX7;V7X44Av^w0%Fu`n zUS`OkOoaE<^~MYb@zQ$4Nrb(Cw1(=^z8tQT@QqLg_5I8c6A9)ks4*0b5qE~7Gxa>- z1TsN}^Z10MW4jhB_{2RG{?uO9D<$j2up1j05>UFmaHBt1a_0)G#cy5kORhmhPD33H z1x*cmXlc-~ui*eWhGtyHtl}wnrC|rJsitvZH&rogyWUWrjcwiMGrf0oz9=z+HWXn| z!@gwLtH#$%Dv#QD4F#*aOQ*#PyOSYVl}AA1rr8-;wkaVQKCQQ{5qEc0Q^$1z>W+`x zF>T?64Ok}Zqag6C!88#4=onH{Es|%b#g%czx3^wuYjoTKw2cbgB3Zg|fF!-tD4>$i z=nx5dfK0t{4fdTz3EU1nq*Xd76_34}N2 zp&W55JY_NH zHQ0RQb6$Xhb%xWlS*~7WI8ICdoCia7Rmgt({znPt2pRfU$x1Ad0DUexwFuA9o;_(i zgFVqH1D9-mi54ht3mfEDKC_UcNV2lnL;=hJ#kZ+ekuZn$9YRVdlgF@2HiNwn3YpSs literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..bebcff507deccf6926d1b974079bb451f4126fc8 GIT binary patch literal 235 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$MustSupportOption.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$MustSupportOption.class new file mode 100644 index 0000000000000000000000000000000000000000..a77e69a4c6a56e8d17da73cdb7a6e5a85e7e1cde GIT binary patch literal 1291 zcmbtTTW`}a6#krcE$uS4m2KQ%K!G+~QrkDvXxypk;WLf=XtHm&AtOnQ2+rD@a&V;xsy>q2ULd#$-;*}Bcd1Vnf zjk11W^F_;0d|jC$zkjMd+j}3Rx!KM6$v-!WT&%-&QN|?~6;xep;BgrZhJ&2$UHS?c zw&r$^`==t%^eh^t=e*@{u}{ygL~pTxno&qm&4{!!$)>qT-v%y&j8PQAv6&t3CyL&a zDID+V6b0|u6zn_wcd$j{9-#tnsPZkLwQ2V|T)}&6Q`Vd9C!Sqe0XvqL*~lR0 SSjBhAF32RK1FF-JRQ~}P_B>Dk literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$WrappedIOException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl$WrappedIOException.class new file mode 100644 index 0000000000000000000000000000000000000000..f7e6974c9e187bdd4db01d92e9189bda4a9404f6 GIT binary patch literal 1155 zcmbtTTW=CU6#iy`MQ|0x3$@;=q5?Ht>LoF$mxn3|3DHChK2MiP8MEw?-KDAjN)ru< z5B>mul<}M078>P2;>($H&YbT%x0#>6zW)HwMzf3pZW^&shK*Y#YPXB17jajhqz*kb zNpu(pTt zAbmZQiE@L;cl+K*jb(Q{@#}x{v3zG=CG&O!YK`X7E{eD(0D;c(CRZtAd&i8#I&2%U zEwHs3m|N+83X+jZv?oxOo~Pot{;*BDL1PuFCF5A$JG1oD$#%5aS!FTOE%PKCRB^#U z31uVhJ1F8*5e~F&Na-?TmKH?*C_Bmn4MQm zN7VALOqcYWrq!Wk@hrDy$h9`VA^(Mz1&8u1a+HsVcud3-oS}6&i{{;VTEwNSd;?~D zN1QHCJ~I?rUy=VzC8M)b=hKwN$pYpyrIgqd^or3Yt=-z3!CDlPq1!2XBa4`$ZPeJB zNoivZSIDqV9rRtrHCl#uQPd3L&!RHgjYc4fpa{o)C#zR3KLx9$rQf< D4jK)t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..185c3d9414dd3bcb8a7f752302b66841d5a732a0 GIT binary patch literal 7730 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaReceiverImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/SchemaReceiverImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..755c01c22d5bee3316911d7801e4ef5854f43fa1 GIT binary patch literal 7112 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 Tv=U_&7T}V1NJAQ{n1S;F5X`V~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl$Program.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl$Program.class new file mode 100644 index 0000000000000000000000000000000000000000..590ea1ecf678416641f27acd7872a449c5fb04f4 GIT binary patch literal 690 zcmb7C%TB{E5FDq4&=5#@za~h(38=);ZLKzyV&5dnJek)Yi5{cy6Dt`P8-eGV%LbsH(42v~m+x#w4JQjDnYIGuXa?raa z;NWhk!(@-)sPqqk-#Az64EZW~VF+rWmM1q+L)r_`P*fSOnWj*6VZ-#?FXod@7?bBS zYuZ*s4E~|k(pHs-V@Vg=e>$u8=3wk$bgfqUJoIu2$6n4CXOI=`Ypdau`?ercADe(S&PraUC~w+|+SP$6Fd|Moq`cxf=9- zE8*JtoCc#em$RInj9DmH1r1yJ68UW0O`CRp)XEj|V@|?~kDD1gX}VTC=Vamo-X!nz zW=AtEzMU=&p&UPt^o^L~W;|o&Qt^J*v2!UtnUl0e-LwX+S3}shm3NA7kGVF@5>VdZ z+j=39wz4K4*PFyRZtXF1$&4lMubjTn?b5^Wm}~9NC#|CeGi7OLHm4SSoD4E}OcV1G zX*-iVC_Ofj6?dV>%W+D)0S%|XlA>ev)z|8TyCw<&ePmiW*|sr+kl4Z9+IkIexIGQ z4vb}oE$4_ioZ(8OFP|_o1Eyok++VDg*jY?wGT9>p3*{R2&K^OKo36gRlZsDdGx35s z5$}<#_{sTg-C%tbrBnGRJAJf;2RhbK=1d%3H(X^6>jropx0KMZ&1@%3DKA z*$;i=3_I8`8rGHlBtR~O%S3dS?jDtlG7OisEZe?Fs6-J7c0jPMVTCv?v;8!zFVE=H zenRFbDRZn5s)L5AR`DI)HIbm8aAOyA+~&Mrsnl*;RcFA0$kTdJBLmyeWnc#e48+hu za+F4usE&d4h#S;$HXEebD9t8mo=2RUp!k7O1_PV%f`KjAYT!k57>J_Xz*@BFcw58f z$`sVsB9^H?5~w>3yn{PB?izR(_YAy;_jP<=;6r?5;A4EE<5L5l;d29D;7h7rX=eMo zj~_Cff)&tY;49pxoO(14Ss5$Ky`|%81K;3V1K;6$@%e*}9}WD3pDPX_I7~cdmHHnX z_Hq`RjSc@}66;bjmi{l2AP5Z|vss#!de#NYahDgXhDEI<>gZups?s)_(USU(*af9a z6K=_Qz?$TV5H=HX4zzT3Qva{aUgguEmX{D;3EIl;(7+z|{&VF*3SQ)am$KaHI;&xM zYg>7VT+EMxJzjeHkp~{{^~K|VzbR*aRo0x~4WPBRR~}E%v_WXvS1C=?q3v>dJp*YP21cXplhC3M5sFq#qAL0X)q@W)XA(8Vp)*{2>Jj>kY$?PcEJWm!K6;9NH7lbo}eawV}Go%6w(aHhl<$z-IAoJl>&sENa z{TQ*;`hm>^eP)!)AhkF~l;b4$0#@K6QC?#9E|-uT3sA)rwSp?f`q-^VKFkX7uw3`C zM2VwuN7H?*A*iqd)g(lEByv6jU(2D>>Q$!c8td>nqrJgI-eeu#Vg=nUK@$zoME#V{ z;T}H1eI_YCiUIbruTqRnkZz`H?Gc{+6CM8O37Q7IVRK|T2MZoxg*RXM5UUf%5_fxF+9UQkYjXG&6VSHJjii~TcnkJgrhY~`#Sau*=G^{4+yO?YXATM literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/nrl/ValidatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..235e9dd49718e947890942e48d1ef2177757af5a GIT binary patch literal 13988 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + elements + attributes + + + attributes + elements + + elements + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + allow + reject + + + + + + + + + + + + attach + unwrap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #attach + #allow + #reject + #unwrap + + + + + + + + + + + + + \s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*(|\s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*)* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/CompactSchemaReader.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/CompactSchemaReader.class new file mode 100644 index 0000000000000000000000000000000000000000..6d47f3c12c09f88818252c8418ca708017b73ca0 GIT binary patch literal 1137 zcmb7D+iuf95Iq|^apMF60ZI#{Pzq8SwYX9R5^BXu1R|0_s6`Qd+&Zh+$TzK>Dqq33 zaCwMCB|dN6#+jKd?@5TL+!u|z4Qfx z*4Y{`=)Gu2C0e!@inrt7M9BC2#3xVNjvVd}xb&1gbLy$QW=LK~Wf RH&m3MzX>TBYgyBKzX37cDs%t< literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty$DatatypeLibraryFactoryPropertyId.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty$DatatypeLibraryFactoryPropertyId.class new file mode 100644 index 0000000000000000000000000000000000000000..7b6a3bfeaaa9b6070248eabd6fd4de52675c36f1 GIT binary patch literal 1695 zcmbVMTW=CU7(D}&rOPTUTDA3tEv*zNYrQ8JO>EPM!D^&w;^P1lI?b|6hNY2z;6L%z zOXBUp_-5jdGJd-Yy@YK_-G|xC%=evhzT5oy`{O5oTX-;u8<UQdMb-&0f1M)E2K> zbds(*4Q_37CB6ONFy`*aE<0eU&3oF+^L!W!TDv zarRtknM0x%yi;DTI;v$VVez-5g5>ytnc)(MSnmW;N-wO%u_#DUr$>t3jiu;mPg+f( z%BRwG+9Gjssp<P=d)&plXx` z)hG?CQ3|hyL4&YrK*wzjcMQznZs0#|H8tEbFpK*PVLABk?qrw`Y4#(H=S@f<#OOFq zhSi2QN?FQIc95OyFgwSL3&ZrGk@qK&+BY8HQ0s<02q6wjA$B8X-b=C&63>yKY1$Yb zo;(AUCJp7mSih|AiiS(l^J5SU8kOPsSUjUNA-@X`PP literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/RngProperty.class new file mode 100644 index 0000000000000000000000000000000000000000..a3dd8d7f0ac01367b7c1d7e1208eceb2c719aaf3 GIT binary patch literal 1989 zcmah~dsiDp6#q?l>}I=7%PI&~BOq-dJOcGq3lu|0Y$OH@k(&CzVY4J#!!AxX1wMcu zLO%uCbHF3#*#G;XJl>fA8_=dn&OGki$M4?zo5{<6{`wohEPgcbDIRE;*RWuq3yX4i zXy6tWbu1b93@JG*%OR~}Ma~%w*(lz|=LW9hk&c|)e4$}gN8Esgyxf1Op`c^fzyR_( zMm4NySZ5es;QVvLF0B>I428Vy?A$vWWNp0ko^BIOYTP85(i|Uwg>ioc~ju9%A z`YVty^yQ!OXFOTwgk0rME~6WVUQlxa*JkKla6LD8$j~)DvB}V#_A3s%Boc1%z^DFyc9KZFiTBY zu$=?gYYWUj3CLWvk24xdZ@GXJgad^X}E}Hlb-!t6l#CXZa zR>e(>Vnky2fkLEG^~f$vg-qq6I1-fYl%s-0VjG*Xd?n z^4ZF7eu8`^$2<1w$|EEnhD)B#(QRUcp5UU#Ewu)9mk_&1ky3nlSeT;!_BCVxf zM6#InttT>?mOcVT}^jYlO0&aKsVI`1qn?8A@7yZlA&`TW_4;&FAPp#X#A5>jZ<((Wll!Y8{gm iWvZevWfrFp!x*HtMDPinMQ|VQ(rl2HMU8w1(SHHB!UUQC literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReader.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReader.class new file mode 100644 index 0000000000000000000000000000000000000000..7c6f9fe053a541ceb986ef0514bee86077757db2 GIT binary patch literal 1163 zcmcIj+iuf95Iq|^Nn-~>Ln#zWp|nV8XmJsbt&mU!B2qwzR8jl5byl&FFVWhm@)djw zmxo9o@d11kVs@Pd9GOZy@Z$Ac&dfP8yFY$@{SIIs4=q%&Q9~K`s<>~#z-AQ>EV4JM z*kZ6#PjsRr<&i5G+Fdseoz&xgJQ7h7kEJV|a~}8uo(iYudLrcS1Rn@_z)(5#BR_q{ zV6=An4CYZhpc0L)ABi{P@Jz^Keio3Y*^ONu^ttqvJ#(6==O+wLE^R2Iq0@VQve4Ha ziu5<--PX>fH5R}PR|?YdmdiwB^ggtT@RKlb5_m`Iml@1IyPl>CTc?XT=8L3j+ea|tV@Fk7jWiF)a)1+FaY;PHEY&g-yX*Rg~eZL#3il&X`+x<*zF%V^FDtm_Ds{fyE_iZP9^Xm6A7*Re9o>=6}{GVE_KP9N>= zO<^iP)-VIC>SpaMZPttcxPet&(8f*N($s9Mks^aM-I;6I(h=RDd^$zt3rb4SpNy1_ Ib=~ytFK5>>)Bpeg literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..f5e09693ab62da9347644eb0cc16dcb604b6adec GIT binary patch literal 2186 zcmb7GU2_vR6g_h6Y`iR#I*^tSN?V{!h!gQ$i1~6IhnPAEvq>|dFBxU6u{X2cb+zkE z_!+$RR{#&BQ)c)9{3xbZUOVJt?IAC^lJ@GJtE+RQ{q*_2j{t69$;27_GJ;=COkygF z>zFo?$BgdHn&7x$;HH6FCbGC~Vgz?g+{HZuzZtl1-~q$%L)Uks#|%T0Q|k=rQc#l& z-&9>+F1MRoQmu(Ck7jb!z!BcMP_7<#C(}{G4H@RDPSE60L%2ap`eD#kj^sPSb88}! zT={jrTHIK58nP*D=}31+ss-UhfqGS7IOixyZihcJY)@9V#g5>f(90v``t?E*OgnNt z{z4J3ie4>=R$(g1Yd;y$jskudi*m4h(Uf6JIPy>B>b)L=W-wbZh%0Hw*OEYvr9wsB zRSv^UlJ{=YEr2@4m{F*1VN474bl~&{i zKEwTlN)0YTypqBUwe@z*)y|16xcZzg^*gFrT@wpu@h!uZMijN?I9JjWyMBFEXX=MM zj8xl++Dh`9vqZc(3k5th@W{er6b<}tp@ex0Wjr&ms0S5>TM5+ZhUIRvevpYSskFCo%CSq3qe;p`WZtZZ#dCt|oaC|Uyb zx+*vnE9N>0Q~uo+9&zpb!Sjug3R8bEvF8apV%gQY4b!S}CCau@ETa5uX%=5$;eQVYK zveK{0Mq;p@%wxqKlImAp^%Qz~P{p)>ZNJ_-DU$qYdN1jDqsMcIEL~>Q=4iypGP0TL zdth&=lfo#q!=1@9I7fXecEEXz(TL$Yd{3=j{F?kSWO*(%{T@UAAj96gLpuK+ndNsF zCTq;4KVanL2V`H)TuAT1%>jCGdh=#d`9DFPcMkO_j(uy^9nU09vz1&nu6 z;kZa%I>H1l;Ro8$1obcDN2KXHU2om=9*|8@q|Efcu)cuCdmHb7jKvQ7AQ@cgfTVD> XljJo#C7UC!JpEZbp+q^^1!VsR`gw;A literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/DraconianErrorListener.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/DraconianErrorListener.class new file mode 100644 index 0000000000000000000000000000000000000000..9661f77d40534875f7b5d30c94908bd03486cd7b GIT binary patch literal 842 zcmbtSJ5R$f5WWkgq2IgJ_YVL#fLalzV8w@3AJ%+WN64Q_CG9!FRDJsaA$O@;0-+R0 zC2qQLQ+wjoxD_l3+al)H zXvMA!54Dn9HH^_Fkckyam=gs5g&QT+6T)6Sc;-FcXZ<*0)^L?PY7?{jQ6)^HABv8Z zTAet<1u=pMJCjopiesI`hYf^j;XG0Qky{?61_|7yA9F3;3ToN*_nqH4n1(#U*}oQn zP^Z@8T(`#@+t_k^69ny)ev-1Y{N`(hA zl#6r%4de(FsG1uLQGb>Y5}v0CCvZgJW`B{Lwxc-W%HVQHbkqeXQ7+S6j?P7j%2@1} hkQ4KEKV43(4AjcM)V#5pm!Y;afm(H9wdK@D^#|HFw$=au literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/OutputHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/OutputHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..32c5459b93195aa7cfc8f1b398ffc1d1b87f7d52 GIT binary patch literal 3940 zcmbVO`Bxj)75+v@nn4UUmJIwOXx8|JwC;cP3e0N3~34>2_dUQ1Jy*uyS<-6a#Z~pP` z4?YAifDa?Ea8boqRAeHkLslNS2;XGu5l3Dg1r?VfsP`ncNQx>P8A}>2M>t-Ipb_&T zxhjuq8onCAb$m@0UzelL$>Vu>EXe+EXm}xl8(7rvqK0p3_*MhHjqgP8U3^c)OB%kf z;RmAghjQdc8h)(dCmMb#tDmX(xs1PvpcgMUU_Eb znKCjZ>a5S?lSan6Cf*!MB=gz0lQyh;!ORu&B|B-xOOBO^Cn}rh&u}th6pLNl+O>IW z*JUb78IIXiOs37O;n?|H*O`)2C^_Zu73``BVNCQ;Vg2OQoRc;kD@i{ev2vDkT*3bC zdxO|Br64$#PtpCI2_MaK#!QBisO#&LVOz2;3xiJDDk>PQ4jiIAhNWHU04A`?cIlF%h@j2OOV;pIJSGITSS@cQGR= z;&(bmFsS1TSl01-yshIMysP7L_`HIqS%WC1j#KyszUHRumklqOmPYNlUM99}j-o;B>E>2pNK25t*5AE>ya<1hHDhw$C4vV!nEI|&I{ zYbb4I3hXFxlEWxvs!g)Bb`!nv9bvz#!s7CZ-Doy%do@|tErr6Hz;ecnQjyi#S6eIR z(sureG@X&!a;Zuc?5W-E)sbjys@j}%uPWwl&UDV&yd`Yss)EC{=gO_B)`owT(L-K% zVQHqLBtfuyyodcVY!rCiFpK-T$F?5xuee$_+`Ew{%}XUC!%p0si)PXp>ESil zQj27@8S>I)08?I*8>&5f&qlk|F?Nn!Rb<9CH($_OiiQ^s zI{BeBz>mCoM5UQ<7LbPLj_i3Hqte~nH5;6}W?SL77msjM@M-s55BISnajr>!qx><> zfiVALIKlNv&fY|b`hmw|>j=jJt59RgDzw-g)K9M?vWkXS-70jh8>ipLj*qZ2x^n|f z)3>l=8DUD+v1=94Snn!!$D(^S(7cM4n^YLUDLxM~3}6p}&^c?w4*uG(6CJK|&2*#% z3EYRza#xGz2u@?1E4t){&kqIZkbEcZ{)?Zv62L-i1^N=M*9``ngZtk?vA4ZB`0TO4 zP;=;AIXlIFkbkir<3Ca!8_Q#-jMUMvhWnP#Dzow`m|8eR^TPuCheQRic1$tkUHrtnQr7alkh#t6&&N>W- z+Cm=@QsL7wT4HUX4cza}Bf}oc+|7sl&3{KzTPWJ$DheyZA)XKxdTEJzww9npyOt3W zdk?JPFw-*77k#keMYnsnBNi08dIwu%m&~I*GP_CC`uN>2goBJm=sAJid=8R~LpZ?C zg)Y`pAM58K*2@rUXPA}qC`p=NMlXr^?ndEo{U*@dNojr|bh;wbWpM~LN0RLn?OSTuc z#6B#clF+ZAy9|J=%7lJ{_35Ef5ysrgUdHh)sqEv<-FMJC?J4Y2I7%|qz&eiHMt=bE zqHYbbD%B3sEs&T|67wkQZEM02*UON literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..161767c1aad65620fad74239d82b6c178319c6e6 GIT binary patch literal 607 zcmbtRO-lnY5PjKxY`a#g)gC1Fm~)5Zg#CR1u5&Obh3K1oLJjQi78(QVBI9Ce)bAR84fm>6FD{$PA}xG~x*} zT1nbvGbOv3f63X9>kf;I(su_0b;)mgn#uH9>12^0Xf>MQ4V$tVoh30fp9uOBYe|A` z*1IFz#M{4h+jD#s6yX!>y2(Wp)6|W&g!Mcb#{|d!{2;;EUl|tLTCykXAa9T8o(Fq7 z_*RyzN3AAS7g}?Whb&#TvX}*Z1lF#+1F&K(SbG&~R=VPLMh29g;9bp;ySFh9U-jj0 M^`%99HAAhx0r7sJ!Tv*=@Ii!R~_(J3Djd+;isKx%2ba_iF$<*lePPCk;$vxsH`4rtq|m)jHM~ z8b(A($c;!DHu|6VIlu5OqR=y%$LU9SSG z>PTBgnpNm)ph=MjG&`d=SEaw>K7Vlq=5BvO=wV9Og5Ahtw7+ml_a{Zj|;Y&uX`RVCuyEipusCs$VEjAqtR$rC7`)mU3Vr(IV-2 L+GkkG@Q;53vg|qS literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ErrorFilter.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ErrorFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..0e0554f64f96364b1b5bf3aa8972aa696c4d1de9 GIT binary patch literal 2017 zcmb7FZF3V<6n<`!vfE^(b+NTY5P1>Xr0t?qKmx^@2B;Nuk_`hy(Ly=mIr636;w@44swJoh=tZ-4*r62KYU%i<8u4#UR0 z`h2QB=alZei3?eLhKnYO1}>SnY+@mYEBM^RVisSZl*KTXawy}f^1o(a*}#_!DbZp$ zTnWOav)T5Xh;KUOFbu-$+;4ayEHVsxL7jWL{FZdeyiSGt~4 z={r$`p(12J{$q*6%7@hCap02cyK;fy+o^;{De$H6WxsgBmS}4qeN3-0WJ*CpFpN}O zU#xW7>mt0(*FDnMy5BV(y6V2I%*d7-G30cmtF9;2$kwv&i?HPJC=z5W532l-@M&-< zoT%OsZ7##WcWPQ(6}%zB<#xwA70XHpm<{2HCdDuuNsPG%0%|o9aw({H+XT!uf(#Q$ z-1^9>nXO3jP?kNR0vK*hRqpeL-0`^IbZRnm{bq4rnm8pEB?Yc`rHG2UgwNX|>hQX_ zv%0Lne4|32HY?=FF!Z2zX1J7u;Y4EKSZ;=Fd9yA$(hdB`z*lsyX^zojP@1v5n9ixX z77n9g;T?=w7{|L7CNOE?L!4$f-IB6%(Q!65Hs+F~ol`vaBS$E%8>m`X!3}Cu-x-d^ zhp#Q(y~)E!?6k%JA~_)t@uo0v)50yRGNgIfG*Gj!fZM96I|kM)6!Eo%k1%E6E<(Y~6h{ygbJEsQ`?Dzl_l0QZNnZDobp!E4coy8}L?_2^~ zz3AINVGJjd*uFs~4e$8@v+Rc#_<;TZ4$)sjnoimPl5DjEbf(lEXbXso?-65<(5*rG z44tF-!ZWb^%obAl*)60W>xiTDwYB|64B-{Bc#RSKg!f6G@5SL5PSA}q;3Q5_Rwb#* zDJ`kmY0}dAZCAWT7G=xj3tPyjvO~MY4w5tQGZp)Viv6k!jrZJl3gz@5jMC8-kxh;9 zJxq!Lss;PNQyAaj@{Db2VLtx^sTUZ&M`wC6V`uH$b69C;@hvSr#X&M=o?+xUMpMWa zW@abp_V#XDJq&&)EdD?Vf1-lFbZhgyqC2fsF-^EA45}!Qq~@$*h9oss6|` zZ0e4&tLNr#Ej47cj9e~RCHIQJ+3_~D1>16^<*pc3!IYJ`!$BuD1VRgTK??L|o6&C? znzX04?cAchSyQ%S6ZvYO{=yb^z<=a|)-ZsY+H#Lv3ywIs(0pYgC#(1%l(s zF5XOuxM-frk||YGfg9t8dvc@`KN;p-GHA2vO2^An5UA5WCpAVb+Z7_-Oog~=mQj|@ zwvm_XYl>{DJad(20^tv9Yshe2COy(tuP+=m+0!a55`_MGb<-^66}<4W%rCf6c zdimAjoQD?E=;!HzZC1-xV-n&yk3A$B;|z83Wk$u(kixo#Aq;DH1S1-bV^G5eUXS9I zhNtkfhBPJxCbnF6dsf$Xc6MgkxjCcgYB{>sV{hORY8t04Zycj|L&KYRD~h)@yn}ZI zPPNMGim!%g%n&($pZxsO@E+Eqcwb=o{}~j4b6p%Y?u*6R2=Sh2zY+wF`!lRlndP;Q zLA#O1GS$nvSGHxeW7IkfczyZ9v`Yns{lXT#IQk5-Q6t#JBTY(I+6}aNmEnC@RM%B( z+o(8_pQKb5&l6-~LfsF|tLH)&bdPeMVT`{51K@3nARiKwKP>@8Rc|F*x%Ti$;RLlF zk3-{{DNNmN{!#B^MG2v zV+?-~>IW?RPg?wi^Q`p}{>B_0vh;tjECjBJfLGNTV$=^q=iiSAH4@y7aK{>&5N2_f zEmVMI@oc@BS)Aieu_lY>*pm>mxXSDX>C2DJ1ze=10)2|B@(~an9T#CAzJYpF!HgT0 ze!7G@jeC5?;imB{OR0tR8wWmC@jWtolo7pMjW0Kin>in{9Pn8-at`1H&;J!73UWtq K5^vxXV*diMj772l literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$SAXErrorListener.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$SAXErrorListener.class new file mode 100644 index 0000000000000000000000000000000000000000..ff86868864633b9ccef4d8b9f7640d0d546c86e0 GIT binary patch literal 2897 zcmbtWTXz#x6#jNH>Etrd(hD?ID3=zKX~PI2Xp1OfO9N@Sq!fxEPLgRdkj&JXX{op6 z<;_>$;1BrX1FR)>A!~^~v6lbCzu|J9$#j~u1pyy&_Bs3P+56kqlfVA??RNlg!bxHP zrxHlxL$RC|%STCGCQ_Kh85vVD@-ogPk-&5kam)z*d9hp&$BQy9$tcR06{pKG<^;Wx zL=Uc}Fpq0u`B)sU%eW!q6B#!N5u-*JDA-O_TWQoaS6|U49LIL1bgNP~oN+?j{oM78 zM!rJmF5J?Wb*-*jRjuebrd1X9HNE10LZEAejuWP3dM625=Gj^|>&ea$q|Ib}mz*6U_P_YBP~*NlelIku%0{p}?~uNY3gu~;A4sG7Y^RSj<{ zbU2#Hvdi)v-LW_rgj~k=Y{ieI=jfKZU^@+Mc5P=k6Dwt7(KBspTzE|ETzl|^$xwul zFxCzP^~H4)qV6K=9&Aei>%O2nuF+~B86G%NF+-%DkX+C`y&fbr5&A(m_cH$dr|no- zUve2`UrRa6)*Sne$TG)Tu5;Qw0qDS%t{44OirQcymM3;0**@@tFD67=tD%*k%x$?qYoiHV15L{yzWE{ph-wHfdrkwcA7#D<#CYj_BOxA8&LVg zntZ$D?}X(D??x~h*wdJbyO{b5B0uw{X`n+eso*PAngW4BesXY#r3Ba?7>2}jSRMHl zv1wKj9esq32!2BE%wxpoA0siJTSamesV5IuO$WO8-+&w#84$kHMRZURU37&#xQt$! z!w_Bd4XdoYm%q^Xzlw;-aOl%84&#WgZxCKh?| zqfDU>{UORdyaQcFjBX%BH_=CB^plP>m5`-Mh&0`TR1J};0n!vlelybJFM@R2%OR~X zQj?M1W~4SFZ7@=ckuLrZq!5o)ko3Pf9$bB>a?ZC;kN%0yyNHkefzBtqm+xT*ldgM6 zGTCt#v5_Y%*FBSaimu1#ndd_Y#!31Hlk_dl(Ra8=-}^2fZNd#xQVmiP v<7OMfIBU-_J%RVQ$R@cZPjafHmV%1leILUI$TIC_`83WV!=;vBT0s0?Ve`X4 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$TransformStage.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$TransformStage.class new file mode 100644 index 0000000000000000000000000000000000000000..9bbe893acc23c2e50f8d101b2fbd77b49c08ba13 GIT binary patch literal 3069 zcmbtWTT|Oc6#f=$3xop26bOW32(&TApg;(;A>k4V#f^a$QwnK%5w>D0l_f_ODedp* zOMXG0I@8P)+$l4qed$AgQ>W9jk`WToxS8}pI;-7tcE9i3w155c>u&&V;;D#!+;2r6 zR`~0E{#xa)HU9cQKt{lae3%u{f(;P@HU(^nknoX+kFm{XasqZlyn#;y?27mldm{Gn zP{3yb9*O9|eG%RGT)-CszGP_6n})3#_PSyebk$-Q$eLDBJ}T>SRXLJZ0;}^3ZMLNt z)yJk)=E}p_C(1KYI})URX6jBu6@TD zjD*=A+L|tB&y~m`c2_erdx7D{WGHq&<4}blxtHmLp}2@a2#YX-OR&dw86qoYfjr)k z)eLp>uza9eJIaAhGjWIBu3~BYyFMAQOInq3!lRS3l_Dui8N*Pm6H)qOc+lf1ws+`v~7 z-ol`S1coFGs|eMz{60Z!q7zw*?z z!kSjSLbuiGp>A`U$g6i#n&~oaCuB*NB17 z_;S)QJZhM>fieg*_pr_s(iW#0Z|_9T|F_{}68{l@>L2#`kB?zK{6|smX`#KtO}%-3 zmPF<6g_L*4VCDPsgzCPRmMq zhEU~@jA-=16L1BqQ|PKoSgNH2R+GVG8GjuA=qMUD|o z^+k^ndqFx)NYQ(cu3=zzBol%9O2(|9$&LgA?%-`Wk2;ZTIq?>6RSZa5vieVgJcsu z&8Lv|(=}WB06#Q1Fmh*XXhV?KSvuM{f_uq`WJMakx}#nZ$3x-6y0<} z&wdTPHC#P=K{$YWSfUH3%Y7DCi2E4v9LF?EV~$N=o=xH&o52#hiDfp02W%QSb_;v# zHV)Vkm z8aHk-Nsf+tq4g&kxBz2(lHG9*lw5`SmW+b3NHg4}3#83M5aR)Fy$G$yXW0UxY|+`F m$JO#c#hg@QG`r-SxQt1X{Y0V<>zJTxyFl_5$rh3i(DE+@;bKPs literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserException.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserException.class new file mode 100644 index 0000000000000000000000000000000000000000..f42b595fb14864b27c428be92b1bd1775729623c GIT binary patch literal 711 zcmb_a%SyvQ6g`tx)5g@Qwe<}yT+|AVI~R%|r4^yLuqtlHbZAHNC`l~+2^IVj1x0Y- z2l!Fqomiy`-H3}M=bkzDoI9C$dw+Qau!SWHY0PGkLea#WiFt;s>^rg>tH5ViYy@GO z_dSXAm7c%&+kEp<^n?u)3pU0u zZeo$4_Ai4n6tp*Yh2Q2w_FtC_LNBaC|j2FXC-n!HPF X>`%eK#-QP}sz8z2l2LF8Ib=Qn+%U1t literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserWrapErrorHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$UserWrapErrorHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..eef6e6c11134a24c6c5d88ddecbe1f891af26c10 GIT binary patch literal 1430 zcmb_bT~8BH5IwhDSX!%Sg;J{sA}U|9y!n73F$5z?CB`bsZg`eOWe z(D?CyQJYAj@BS#`xr@|RY9eZzojWsocINDv*{|O|eFiXxxir!^W6YS1vo_A9Vc|j= zNlcjJq%l)Arftj!^j>y-H(C%Fo+t)-!)a7KCzK6mN$WsglYYfhdVX?Mz*-C{N}#{! z`f8+T=$sC7K5_%R;6}L{3B^an{FsDa644`j+V9dasruU-&cCklVPZcS}B%; zsuOKWH>fE;4C=b9oGt0O6&WcfEN`l+jC9~TrP#fxWJT%aYRwz(R(_uKRU3PO!tdWq zzj4ReB;h~#QlT_q|_c>V5Fn*{(=JO)}z#+ zC#KEhJsC+amW)9u*5j&cv>yCbf!X_VOJ;BgnGA9m63Dj?v7MTYivmmkB6N$Yz+oeN zD>nUSjd3y<#!v>Q4U_*mQ~{?8^}S_X4C;Qw8Fp^jr7lnW$yV+A7TRTummoh;G`c&U z^f#QA47`O=r1*82pT&z~0mY)XfCT?Q@6>b?Vw+w9M`+V=_91%k2>pz6yC@vRaYn>r z0E4U{%yfCr)T$AkMW5YlLC-3#JVNAh@29v{e~d0-w1j8K~d=bq)6rI*4uj#1L1g17XSbN literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ValidateStage.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl$ValidateStage.class new file mode 100644 index 0000000000000000000000000000000000000000..2e093a2abb445a7b29c452522b7d90c69a44675c GIT binary patch literal 1942 zcma)6Yi|=r6g}hE-o)7i;*>zzV4w}faR?jU6!R!G32|#cYO09vZCH=&E$dw~yAF{k zNVHP_L;nRxgeXL!-}|Gg-WfY+izb+UK)ErOT>$DyT`3ryK(n`MO+uU8_(oyr?VmfR(0mE32RIG-)L1)dX=LuPH zc@PNNzLTUR5**k~(c+=>J!@4DyEUw~+U{%&m#TVdU!;EO44F2U0ZEyO7qRNKJK?JC zLs_Mpanu6Cbga~arx4;aHp|zO9*zX4g*?-}pGbP@Ib? z_yB-JbVV;asuzboEYz7_`35&JjU^L@FlAub#Az&;$YavPVH`1V$HX_7HLzl$iXRz{ z3|fBm)`KWXh6@R%joMZ9Y+p)Yhg}U(m}39Q#21)kSV#cabKbHqAIGy(ku?)@C>glR zu#^xSv46H%{wIq8oan1nj$@cqrL-L1s@{)sqtCgh+;Vb1X_5P=KZCW6@ENRx_`SMR z{Exp#x?spFE4;3+i2HJxhuqa;t>__ju~^f3UG6okNUt_rd0$KJ=Qfq<oj?f+()C7G6lW!%9{F3hSVoOo&ORHU(xIdolDbuy0i^en%_dIbb1Fv3|mN- z7PgRiO`9pq&~pkIdIoenq>H{o;2Q+^6h~>b)CEBSCupV!6e-iAJiaCbwWb6N(JFlr zw4&(i6sPuPOK*^x-$6D78fD(X_zU@646pBEWPKaCZH)fiSCZFk&yd4!l;m^5d!bcK zb+IB9vp9)wiSHCKWNB|0MVgW0>8aQsQbvlspb|Hggk6lS(>qOna~tD3IFLf0cbwD% zFDdGG;`?KOvk-9>Fi(|X^rM@g$7AU^kWsL&2%=liEG+|nY8X?GGd-9T&gfGX^%ayR Lqwe0qF%16)QK|gf literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/SchemaReaderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..3e7ea2a80e27439619701d6761ef256f52a14bbd GIT binary patch literal 12533 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/ValidatorImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/ValidatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ee6c4b4779121d3b81c337d4e8ae99e65df70c72 GIT binary patch literal 5381 zcmbVQ`F9i775<*FJhnUrV`9LpCM+?MLF}n*Lh9HC9AuN)#z8bK8Owt$B1_6>giXlW zW}{hJvXi7)y3wW^q`^+&b4pvz$q)U#e@lPs>33(O(I^ZtU?06V^WI&*d*8iJ`uG37 z{yTsjn6JZjJT8MJLtX}3hJp-d!iZs7!%P^pn6ATFJQ2n@JgMQSFmya!k7w|#hUYZ= zq!vF7qY=*w+Y4c=$BV-Al7^RM<-CTUX?P`!7QCwAwOYI$#%eqt#!CEL!!I;k2%{Bm z)Z$HHeM^S7HM|qXX1pslyeGp&8QvGMAA~9M!!Uk{k2HL&;S&v?YWS7H;s?^%o0fv!pUIe3Puj@m&AdXrZ5f&TsjM|6n;YV%jWfnfY-TDQ^EP55Ws)uhjRFlj zOX}u$)|zl=^W=%U%cQu=V>PY5nWUMsQ`w9{WFg@mEoC$(vl-jW*oTeGc-piEvYC{l zv&j(>OBCrTL`n{zk-qOgVMI;pbg4{IujW*tyC)E4ZUIh9KrwwdpWC$m#Ad(uc{b7m%=Em%o2R45QQppQejm^6#6VHYZcRiVwX;sc4c4`*0pV|V5!_EQv;cLM|z7=sNq`- z}QHvRv~Ab<9=M5NZy-G7N(fL#Z#fMvaQ0T(rFQq4SCzJ zJPxLnn;;4s13{I;Hr#!D*vTRR*3&KL+02ZWbo2DvSyFoY3I}hJsO4<&h`TB=^vj`A zZQ3$&Igp`ySn@)dP|$QLlF zOvlv2wu@jL`_ZZ6UVKl-ZtT%)=tHZxIKE!gVQ<;>+hW9>n_FF~bQ|C;ZrVuE%Z@-Vz1ZLM zY9-e1uJrEsK-|5-cU4>?d}q@!;*mSl80dFJeR0HZ_5059mvMT%uSfgv2syVJ=i(D^ z1|4xVER?BJXBFBOfZca=b>@%nbwx2|ZaB*K4}N*t&M!xb-{@-5B;AJJ?y97iIx|}k z=O*br&dm1X%+Qb~{t|C-^tSLXL z&k=5)Mg1U`^u)F~G+ae>B>EK=D^|Egm$0O>dLE65rloUex^{&sI;i9zmeAN|ihHA=N>ec9>5?=;J@=YKZS)t{);F4dq)uXL))MN2o)d z;uxTgZPU2NwpR8^77GCG#jI4g%84Z6Eql&h$Dm@5K~$Em)}84u(f z!LcIeXVfFsc1FIyvTqROq!RIe$=fXMlDAnjUqbajL|w(Q==Dpe9gJSzc1>QZWLR;9 zUNjS*^;pi3-Gd0FMd+c-t`8BS0{W@Z)5Wy986%`0WwJa>RF5-ZP7u8x64^%_YnPL+ zl^h32Q^mQ{^O%jNX!il`$X-n(>ex`y6?RrnG8T_|vPk8{qQ*%^!I}Mww1VD$X_=(f z*7qK_1tMqM51%p&~*14HWCe@6G{vevDzeW4pt3= z^Vlp&x8+(p@d|fVw_k6mzQ+9(-=IDs^BnG>jy8erK8E=aq1(q`j?#!xf+4dD-99w% zd7QsjoFYsGQk@~k40)a;*AsN>96^1GefVioJ%co!MGnt7uD4S9VbnP=E)w^OAhZy~ z6NFn4ZZP=lmHe=iyKtx)^3`x>j3#cSwZ(j>ab2yMMMT`H9c-60a1+Eyj!RfEAfC62 z=bhEg8vT}>33rB~*IPnDUL_cC`VvtdJdM?0HP%tvI&5&}jZBdhvYaP6Le&wOMSDE@Pi(%3+UP&9`7)my-RH(@eBO2u zO9T$?NiJNLXCk_#d_wPLkp$jn?tQ=u-iKJqACgw$Bdo>8*o045L_hTmlxpOb&k)bb zqcmQTdkjf8Xim|U+7TkQHDwiU`Dk{;xaA|nJdv_w@&k%E6(}NfJ0d198DK^A?TAR> zbbyFOw)Cck^0yNV&wBGD79Qo%x`$bk9hq9IRH>`uzVB@>9t4fXZr&{iQ!1ywwb ayEw0+O)cyzJNewokNlnE51GG3-TwjTn}I$6 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/XMLReaderImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/validate/schematron/XMLReaderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..21623a4b068666923809f263e5741d28695c088a GIT binary patch literal 2560 zcmbVN+fv(B6kP(_vW?9x4WWbp&4mDNP}`&_2?-4iH#g=|pp^0^>=RJNmRw0@pdZqi z_NgC`hju1SX39+S-jC{Z9ZA@dY-T!r@R4-R-fOSD_TI;T|MTZx06xKf7XA22#q%t> zu#`m~mNQ&dnvWNl*YP>jV$t5Qn9IGOT{+|a>BMPdrdbhRbeX_ zDOvWBc3P`yj((~whtB2|WGil^X*nFRT-sdIBAdkPZIt%^|4S29eo(Wo5?dsjcKa%Zq)mG$bLZX5DD*i5*`hNIwNsch9W z_gFWqx-cE9VV8w=qF0TI?h4H*AB&pq+Lo#9ua~xkUJ-V&R!LLr0Ug;;g zR@KcTZO63@^JreONjqnbD{94xjNfKKQI=23qV5`&>8RLNu|wuZ!VODD0j8#-5=4dV zbK(v+rY^Uatn&0|X|CXU)V_7(<)9v4)HhFRtwYv3Myz#4X$B;%NU;=*M*~HVeZlNz z-3O!)F@UjH#OOJr_Rwj|W)*GsOu=NQvV`iedH70{UAiSqy~Z;3kaNrXZU^snXDMis zz0&Y{tX1PCc9xV@gzh%%%Npf?jljrFqoEFg4`dugTJCu5xng)t9cjo}89j$#e5l}B zcod6fz2W+P@^~VLaqQ+Wh$}gKfU7wS;hKUwVV9l7{SC|A7G>+mG=3D7W}{NoW7n-e z*5shiN*6ioFZ~1^O$zDM^|D|?f1AS|zEd#!pB(PhZSm4L6`aT0?M!wW^}1!d5h4%% z&(tdDj~9va8xGjiRKaj~pOS=BxZAU|`CuI~%)(ES#P7Kr@A0AtIRkw8PfaR5X&e1w|> zyv4H=&u-%mzb0{)Yn0m?B!8n(nA=E4Zc~^JoEK;48ne;^qrHHIYfXpu@aNu@m5 zq$o2ebizu-v2GIU)+JaUGkuA553>PQOYk>H#gm%sn3TqUVPBC*Qfi#Y42cvjA@V6} zFNu7H`yGg=aU!!Fi9EpP)Kr${sn=jY<{W8R_{{rQdG3dJWSZh;@Gw&GGW07qA3Xf5eR9Vm%{r7Z(2o D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/AbstractLexicalHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/AbstractLexicalHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..e11ac34f050577bb7d36b5cea930cbb7d486be48 GIT binary patch literal 1218 zcmb7CT~8B16g{)0Y-tgsfFLM}UsOn3(fD96CQXa6$p#rYjU%v-mJG_s-mV?z!jA&tKnv0Co z`7y&xBkBo;MPDj$bUy5gxWl_4-BkT3;NdZkrSY@N89k5*!)rf?hMpd98J!80MCWlJ zymT0P2~WLxH_tMfF3W`g%ab+E%L%(kQ$+U8xsF znRyg3%dr37Iy2n9Qub5#R0KqED~kJ<^AV}`uFr;HeLSFD|9q(*w&BnRqJKiasYEBy zqTMCWqm$8D-2Ddjl?;ahV4uxCNA~)O$$Q^%-tk H*&qD|OlH8; literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/CountingErrorHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/CountingErrorHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..876203ad395f3243f25acd71686eecccc04f8355 GIT binary patch literal 1944 zcmb7ETTj$b5dO|?OJymd-0!%k2t_I41rX&T0nrdK!Qdr6Se6PUOKZA|@}qpv1VZ$| zM<4uA#&1g58zs>Y=JcF1GvD{k%-P?6e*6S5j`<84Fp+_YJN5j!E9Rb<`(h@=Of{ep z(_$WonKAItz#{{*3Z@%|LAc`hTX{EB=w1!NZTny^Zx@^cd#U1XMxp70Q*`pt;bO4w z7Zub~g-nzoJ}^H!q3`+I@wRox*^2zv!sSvd!`>>?J@kC9NCxTQkqrfHG1zhmvFiEm z^ZmU|H+<=A=6TY*8swb(h7)?Sj}Nutj#p5)y_yU5?Bb5&1s`3%5bTFJw?saoKq@sN z`i9S!C`9zoEx44{vF#RD64{e5`8V^vtSQ#ZD^{eDSCv(2;{H`tUF4*amqPFG$oafj z7jmi&Fycxp3|1>zUwHk(2@CGhLC*bH^a6iIWYxQ;TZMrtq_h6)X(_m1V2(v`WfFK^ zo&avvqk=Dc(x$GYa*ypgpBxkI=o8an;u0>KXcp5VrWI`_E~3fAFh)#_iLo)FVE<=d z6)p*sop=0gdu?;q&9Q@>=Z$jB6$?<3i!7gu3HA^=Qo@aIEG4|7mDHn^?4y+exQajJ z(ROlom;Q=tou!VUzD0grv>Bd*`E+LM=9fg#3q9!NDjE9X47>Cc-+t>DDJy-1v=~i{ zE~d^JJ%Ulr+z*4^&CpQKzYJM7u)ZeQv@mCDgw}qNF-BwVNE@FbzfPI2(MLG7C1IA~ z+9?4H(g~137bSHQq^CkuTS?RauEe5ju99504pH}oA1Q{4emU%~2-Zu%Sqvrwr)z@; z6N9fN25Ys!Ly5uH5`*>HU@I~BI))Nx8((WQk0l1*C{4jEDW#x zdpbu_QJGpPHXju;$V|RNI?B~+y*Y%gy_Z2cgz*cFvW$Mmg%rvSmPrC8+1x44`850S zpaQ8k?hiP(7DkD4linKFTm0u6jxpUBGb@;yU}}~o!&?PhUkQ9NS+fM5ql9@ri3QHj s;|lO>2|Sws&fktC@U(!Z6TmZP!IugCgy1U#e@gIY{|r9PDx`4xFA{4(AOHXW literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DelegatingContentHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DelegatingContentHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..6347ed7fd2c8965df3068a4c6462bb5f97bc54d3 GIT binary patch literal 2764 zcmbtWT~pge6uoQw5sbjW7>6W~&$gIPw*}fJq_o6=;MPDA18vHakheyukz8rrq5rC# zX{X~p^sx{9QJtPE2_Yj)X3_^=X;-`FoO|xwg@6A2^DiR$kPfnxqm4ltq0J$>PR}`P zaj0_mio@3&Y8~PrS@Pfn3486)wJwtnft~F#!HgzQhP1bCuSw1~!m0kU`T(K=B zEw!avjh1v)1*M;umZ{bR4U}dM1SKnW1DkR+(~>)#lOyTu=|?ThW zRL7<(Xr*S@CuMc4n|51TuHA7A88SZem6%pD#(lSRl{S_$)RZa!fQCDznX5Knxf@-c z=aFr6PLMFGSGFT)qL(w6UuCjP>uk|@56#&cLBp=noe)z{cH`8LZDrb)o1uO1ORI6l z2+O?HFC6*3dAhB)+ps{;bgA}6|4A>mbgNmeD+iOS@fntrZhJe~`q&PXtK*o0u7mIb z!T2Qv45xW&Hd>PH5cKkrWpSQMW}@A+u8_b{M@iQ+P_y(C>9%!4?!T%E8e~6PJD3xc z`q6(Tb*0cT6Fmk;VBjfI3ROOON0pp#);QK3-B8j2VWxCgsaAP9VH_hIR-nmqM38{i zbW2)Ig)d`f)3P1z@o$bzB*xhY8gDzcAzc^Ms#>mcItCXV+t3eaQJkBGu5@mYAIx@J zHa09}s-H2jXt4IHTs;x8h>4a2nA{=S{YI^hO#;>Q=PYy{8u?jDD=Ie;XbJx{o_7 zM?l0c!I|KG<1rFL9LH!0Pl0D@_74)j;w3>v#4MgfLzE%T}p}=^nE}-fO`)kiH`=*4*`?}(0llyGp~eB z#i6GGT>|vXTcFYJ0rYE>l#4p%s~+(jneS41Af|f(;ESkj*#p1lZwoCM1Mv)0b3teE zmOy^zx!`OCgndeoiI-pre9I`oN}m$=d{Gu0-hiczwn%}$=%?k?WNv=pX0l7yQnAb) zgJ~5-eBv=J`#ZzTipbc{tcZUmI5Y10kMPFE73pIfx@1qbxIY3N4SY#rRl(Ph^X*;e z(qJ;CVjU`;!o7;8V%Famswjji3ZaTZpd#u4uC1%MC#SlUjdMQ-_ZGOTeYiiPM_z3U z^cYUD0|mIX3J0RxxGmqtJrw8O2KNrQcmEeRF6n@~UrTH8mac<(4=ug#QO8^Qi=gmh s^rct$XtMZ&5D@lh>EU=wzXsoTXz4?b&%ZjOx5`tGFUnGZ)d_m`9|OhIwEzGB literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DraconianErrorHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/DraconianErrorHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..792d01961a5638b934beb5efc2b232226ccf3bd4 GIT binary patch literal 756 zcmb7BO-sW-5PcI{qqWxhRlg3RCqKZ5pch3Dt#~LZRK)8xUF%A^E1RhOTb=|DdiO_( zv$4cd1of~p`)238yve+Oyu1R~#6kfBsQ8%iG3#TFFu13*O7;l@E321;+@Wbo!dOjd zd3xV&NP8g~5mzQ^CKS=7u*%_XF_+w^n6Om~O*=?#gfe$h$L8LKGU&9UAQqkA$coTt zC3MwVV^4%`M$+yQ{6}H6(k;UBO3m0-MyMZLoeLYwYA2L;i86ZE86)nM2ttd z%aOPFc&^q@ET_cE*JGFHs3nYXEHlNq80RyQiS00QV&3{&D*J6?vPaF!)Vv?mCjX!| L^JlfG)W`HERhyEo literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ErrorHandlerImpl.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ErrorHandlerImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f7ad7e8369656f2fd23dc34a249036c2330e1cba GIT binary patch literal 4497 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 D)_$xJ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ForkDTDHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/ForkDTDHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..85b63153e392cfe14146b379f45e668f4f98fd33 GIT binary patch literal 1096 zcmbV~+iuf95QhJ?ow`ljrX(dK(3F;A;uOs31{EP8(h5XWE>cBsxp7v>7RQck2hztv zqC(|@2jHO)vrg)^lu8x0JUcs?o&Vd({QCXlCxAz=voNu~fH`a^b1R2=+*am}iMuB5 znYhoO_Xdv{%B>*mJCmX3M10~j_nL3G-}6Mcl_Wf2n0q088NXzBTDvIqqIkW-V7v}` zf+63MzStcPyCU4;Dxxvth2V4dt;YYzZbVbUz6NI16 za9Vy4^H>IcQ@9?(^IB`4f98(I{l3$VL+SUoE)z*;eLhUs&Q)NTAC0@7bl>*KjSiw% z43(SRp15M9)FTr$y4Khq@h}p-Z9kUr!4&D;em^cN5rbJL%7kR9!8e?ao7W z4+|FR78a1TkW;3J6$>}8%22;_pBa`&`?lhG`0l=N2^Y83yWlzX!nsabXxQFcQCtg2+iI+g#ML68uDZdFvw=f=BSWG zhZeC+k@e{@T%ip0J!O9XNnXN}?-ZvFwGLF4NH literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.class new file mode 100644 index 0000000000000000000000000000000000000000..f7bdfa9c7ea2aacb74641253d32b8ed1c1876eff GIT binary patch literal 1133 zcmb7EZBNud5PtTqP_I;81;Imk74HtEocNYtObC$#Q_+aIfZvv~93^+{r7d#)D^2t; zn&@|bl=0a@8coO%({wsJJ2THSGrRru``Zry%XnhJ#w`m|m@c3XGg_O~Vor;B3%9Xg z;*N=ug#yYZDkc_9+!Zhnq?d%z2Z4F_NWPbCr`>EgEg8isikVE49F{LA z>8zghFgWn*$B|6@FnHefR7)!iv$6$wTH7hL4PO^jyqMUM?wXB344JrRV+oFpehk>0 zO4Y`FEmrWr#6ug8FfNe#|J&tmlmy2Au8;%C2x`#B0@eTSrNE#j?KEUicV6usDK8ON z?2;zy>-jJQW-mW00)2rx*$m=D1|Ivjz+qh;#Ssj}D%p}v6}P0P)=p%^V59U-pSG*q zs>z1G&$$J40hD~_SJF?GrVLr$cOK+9yf1c zjyg|4Y5{8L8knq{LR7vY_XYXNXXK3z4E@b_(DNyc8lfCR59K%vOfd5ejG)M864z+e zILw1ldV%_N`sIiU>>^JM7}W_o=8W_L@fe~4F2 zG@=i_854h$@tbY4aw!C}*_m%<&Ue1cocaCd`wsw%SW6&@r$ZRVOail*lf!%**x# zGfI5^+-dFA{*Dvu3d3pG<_A%K-7$n4n2t?kbA6Dtw(B}xa2}Y5ynGEy42fD;a>bO5 z%JeI^C_A6T7;Yyqf>902NlYRmhcX3j27&uRmlYOerLt{@)P=SueBGwI^IdKTinWr& zbF4BHZ{)Dxdg9RR2)dzbBOG(ftaI4}hS{^7zOq>iGna9fTg9ONr!W}C{%Q2h!I3Zm zhQc)@kr;Z)Vwk*;S#(zyl5Psi6`rq03>9vWG~ZLae$qUrjmSp|`E0!CfJEVopwhiW zhIAjwcey=G(_>D8;THWVsSJAPF|tW0;SR6~g)AVE{|c68U!Z)Vm4Z7ojt~|kAr%=6 z;U4bNO0p3e<4DsinI?Kn74lN#S;$oA!!$!ov&1wPGNrrd9+Tvh`7!!PxpbByuAh{F z%wZ${8OkptP7$k~U|6nBp;im20reXOV<@DwSkH)ejT6MTPoQoWJ`zC8ep@E^dl;Rl+}}f0}FsPyPZnbyGh8 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XMLReaderCreator.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XMLReaderCreator.class new file mode 100644 index 0000000000000000000000000000000000000000..9f7596afd08b58e9e21625045dd5299ae2e34456 GIT binary patch literal 247 zcmZXPJqp4=5QX3PxBh`Pg5E$8Tze}KtrWpDY1eg#k(iZDl$_1N19&KLBN7CQVdgRO zJ>EQD_XmI}+5!!MCZVG(tCaoCddKR(mM|EO*2V@hJ4Z56nJiW_LUWmEzNDdv6M>e~ zp1E4ht1x0huee;~p2kj2>ZS-|ZO$@1s?c0GPCmfD`4=H{b4W%i4&-)!Vx1EDzj3^| cUxcU;2qpIrKovq66{o9C<-O)gxVeP-8_@wmZU6uP literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$1.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$1.class new file mode 100644 index 0000000000000000000000000000000000000000..46b7e6530f0859c5c8771758cf07f65459f399dd GIT binary patch literal 237 zcma)%Jqp4=5QX3Pw69xJhT{3_RxX zcpuFB^LznVAQBJ)At5~Ew?gwKF-#a8GqX~Tx5}Ok7xPrz6(Kl0Y#DQzXn_G?rt?ge zu}bnQTi3K@l^N+&C4c*qB>{wJXDt_Nqnu+$7}iv2l)cFPDP>&}rhg+b_P~~Zp`Ny1 Rc-KL<@qyRS=Y*cW`d|4^K6d~B literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$Entry.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler$Entry.class new file mode 100644 index 0000000000000000000000000000000000000000..75c4a7a878ceba37bc66319ef4003b13955e2e1e GIT binary patch literal 2034 zcmbW1-A>d%6vzKl7P^$mr=o%yR8$H=TXs>&8ZRUmHz9g~LF3)fovVjI?5| zv&rx^PrUAN=LpwzuyT8-BXRpmOG@d-A(UQdMJua2(}I*$m~`W)%~t-HRn<@_q^$a9 zH$UW3nI#1^_LGbG##i@a?)_=jDgT}Gs;{@huZFUWCGr<;d3%3bz-uV=x-!64tNSqhR2Bh;2?q(ng->-}SrLfdP zY?D5XJXH!K*(uC-4SFe%DHd>_+)_Oc@URD~U?j2CSJyuO!~jKIoK6r`Xi({wY1PL) z!sASwmYrZ0Zt@K7$p9Q14z~j9g1SXYcEAZ{shc^YZWU`iT)&r2F+f||OXu6+X(nPo cwXzTz*6A2DY+!=sSz75RQ>PoaM>BQYe<<~==l}o! literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/XmlBaseHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..72c2429ad2c0985def4911742f57dcbc8531aad5 GIT binary patch literal 2776 zcmbVOT~ixX7=BI?SXkCVfk3C!3QB3RK@u9MtyC(d)MC?CrG-+zx=D_(bd%uj2HWu$ z_yfGqEAM(+XNrwF<0a1cqa2^J8xkndAx>t_*Pi!zp7(vvc~AcO`?o&;WKh;IjCZ>+ zggMn*QO$cgG|a2!s)qMfzo43HIu>zVjh1xox}ioNsODx5meq6!AFAms9XZ@qqdUst zu4+Eg@UezZG^_|fz*sJqrMu`@o+mwlj-|5iK4o8&+y172SQdynm4ZM#S8+GePfAYO zv!0}Lm4fA0+&S*_e5>$SU^-W*l+ymDWmmRk*{f9Df^2MmP;#zWp1f(5i;i^10}|SH zUa`xzKTnE8a#bLQcdDhlbnjVthb#Sx&RMlwTg~f>F@Mvh;?(hZ$*6nM zuWJ`Lm1yacl48&+*I#mENtS(@$#StV>0=O-Hw(V++WD$af$>Cc%i6Khj#b`BuW-4% zF{fZUb}XkFIB?`MKN4ESx@SZBD^ERNmX?bGgNfu(EGpn8MS9=0LyP)kT41dO`SF8N zPew~pEx*sGuLKFbVXJfu98Twy^3A}Tc+0>Uyl!9=V+PLR4FmUZ-@q!?1k!Du4u$u? zz&ajk_|(8>_}su3_|m`yWDPu0BMW&A1p~9VXrKtG;VT0h*fd~68rZ^P0}e_8$zyX1 z^feQ8H@_tdOn&Ov=HtwUZWRjB^TsoojKEBy{Y3D_?PE+UjN<>mXq#0a(+|!j(u1F+E$rt+d^QZMfR$`?WBX76qjDX+LqUC&vKl~H?p|6X}PQ_6D{sk%PX=U zgKUN|;7x47wqG+3-~m(+WVU_IfFgmf{cG zsjxP(^2@KQmcu|Fs+{4Cn@c`y3dt%Vy6r9Gy^8biwU!o|E4gKd_32WJ|qMN}aRdR8^|U3@cH>DZ2Qw#4szM$v1&gfOGKh?rs*(Vqi@b8Pz&W82AA zLpOgX(1QuC7@--?Bf%L<6wEs0JRu{>#!T%Z)xo8 z%XCD^>oM0~AQF2-eXjxzL&vEDl6o4FCL1tT9VTVIKy(jhR98a>yU0&CVTRLA`W?~~ z57C4X7(tu?9c4&O>TE_J)u4MDQ}qaZN4h9gXMcybE?%PR_GC!Wy=G35WinNRUPI5? zB%^NB@EQk{Qp1V0rgvua&wv>8x>A z4e=(`X$l6t9KZ}yG>g-OAHzG0*rk9zJZ4$0WVnxHjN%vtMEG5~e3=&Nm`8YuhB)eC J+=nm%{U4Uiql5qe literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/resources/Messages.properties b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/resources/Messages.properties new file mode 100644 index 0000000..7f133eb --- /dev/null +++ b/thirdparty/epubcheck/bin/com/thaiopensource/xml/sax/resources/Messages.properties @@ -0,0 +1,29 @@ +# first argument is message, second is location +fatal={1}fatal: {0} +# first argument is message, second is location +error={1}error: {0} +# first argument is message, second is location +warning={1}warning: {0} +# constructs string used as second argument of fatal, error, warning +locator_system_id={0}: \ + +# constructs string used as second argument of fatal, error, warning +locator_system_id_line_number={0}:{1,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_system_id_line_number_column_number={0}:{1,number,#}:{2,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_line_number=(unknown file):{0,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_line_number_column_number=(unknown file):{0,number,#}: \ + +# first argument is class name; second argument is detail message +exception=exception "{0}" thrown: {1} +# like "exception" except third argument is original message +tunnel_exception=exception "{0}" thrown: {1}: {2} +# special case for java.io.FileNotFoundException; first argument is detail +file_not_found=file not found: {0} +# when exception has no detail message available +no_detail=(no further details available) diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/EncodingMap.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/EncodingMap.class new file mode 100644 index 0000000000000000000000000000000000000000..88207b32f642e8e6e3195849686affd0aed91a65 GIT binary patch literal 1427 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/StringSplitter.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/StringSplitter.class new file mode 100644 index 0000000000000000000000000000000000000000..c68cb4e193d8054f93ad18afa0de324d9401a143 GIT binary patch literal 1084 zcma)4O-~b16g{sq)1gE8tOE+If{L^wZAnN75lS>fLSusoC77t2X_?T0G9}Zgapl6W zaO1|9nCi|A3t8v}jYfZf|G+<^p4Y)B;=(lZ?tS;&dwb5g_v`nMUjR%aZ=eg~1~goh z$0Y+gF6)?(mn%9Zb)*HN3$Et|ivmhIvmu}^H8vfAzLM)XtF7INzjlcZ0z3=LNK; z^aUopjFfIuXQq8nl4QpN1ZK@h}O!=;JMhehh>S#4Tn- z8Eacdh%6`tWid7S8fhza1my$Nml#g9(Ql>H%`nhLbUz~Y6>;$6Tk3EtHg_S0)hUXaKD_0KB*eO9obFkU(94iXA&yER-ZOAjwY^6h1B8K1%ga+v&Mkkd%vJl_N^ Ibh5{O0$KFShX4Qo literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/WellKnownNamespaces.class b/thirdparty/epubcheck/bin/com/thaiopensource/xml/util/WellKnownNamespaces.class new file mode 100644 index 0000000000000000000000000000000000000000..afcaf22e55133460d2b30d8fd1d0be9b5b6f2871 GIT binary patch literal 1011 zcmb7@U2oGc6oy}S8x5uVU<}w`K=%P`lc-aALjfU$GN2-BCt8i|DsnTc^^`hQ;?nJB zafQSMKY$;FI4S$cL?z(H$B+H`^*JZbkDuSZ1F*4`!vr2=QOIJ2VPb#BWtex5#Am?+ zp*y^3BBeVo7^bVCj*ZY}PXq&LVU=Nu)b*x?HHHP6dd=$l?H$K^iNoL7pGot z(CxKGlGi4~m6u8@^NK3l*xX~7tcHh@Vb)bz)(5?|j9Q`{(8|0U`Xbm9kxKY2Sx?_lMI3nIvnb{=*hS*d>K=>a?O$KtxC)n$7qU4 zi}SdJ+YJ0a{Tb#iK2W25Bz?oM-ZiHGob%yuSR9s%VbtN&d0whio^gGa8pHCRvZuCf zC-rEmb!+T)DY0t$UD*>)4uuisq%TQa_?wt|cPfcwAdYosl$MT@g8Ra#whELv;pdjT zRJ0k^#-E8zH1N$JlK-f(ixr0Qc(2R%3#~&cO3?#Pys?4|{S<(OB}`%p^o)oy$P!yA zzDk@+@ipRnil>QZQanpMm*VTh^C`YTypZCXbaN(oA`}-XgEB=%acb);*q2dCOEl(4 Z1WZ$^Gq^*u{BIHNVws5H9*r5?{{?3$_yqs} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/Datatype.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/Datatype.class new file mode 100644 index 0000000000000000000000000000000000000000..d5105d3e160ee22ff84b96e69b04048462ef41e0 GIT binary patch literal 920 zcmb_a%T60X5Uj?8#m43t^9Yde5||6l-Qt9eV#xx82~xrVO?F#m!R%VQV`P3UhkO7Z zh3Fa9u*g;vDO{%2HPtmW-TmzA*%m16hk@A9+|!lapJKzkV)y1f#Lh*m)^oXIo`@Z65*FQv zm1eQU>QdQTk_>!->`8UxVTm!o>5#@?Mt-NB`5KRC|wqU9+o2J{zlBPQ-W8 z;t6B0#Rc>JCm6aG9`n|`f)O|Dt9>WIMDXW%&!@C zBbN{Twy+ERrtF!WAgm5ugg%Kd{kl5O&I#LpEqR&mm~1viWEn@Xgp8bo4`yL8Cb^T! z$0g6E@|@%osXUMIQ8A85ks?fCT9jt2u6$dNIefG?MaDQ^q_PsW>O?3e7rTeX$igOeXH-SM3yjoyZOjpBM?gNeL$%~D5K(V)uE!+9OI$> LpK*Po(4zSVn1yU} literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeException.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeException.class new file mode 100644 index 0000000000000000000000000000000000000000..43e519729c3be239ee67fc2373c87228fd6b95a6 GIT binary patch literal 740 zcma)(O>fgc5Qg8e?L*9C#e#(E}@ zo*;ZXcsY3WZXjqJ=h>uGSvgecRQtcV1S^kCX38gmcBj|>pgyWNRap|Bl!eKXqq{>v z?KmH6!DioNdN4gZ)x{fino?=@^N~u2sxbCkiM8^*nFu=lyh!3gr)oypSe2^$bgtuP zmGgWy(&wegvm=3jHc2dOskmUbv#i>d{EoG&i7tEdK`C(5=p>&OBmKhI?%GSW9@q+X ztYfE+6@=ES3-0`1qk`6DgNycYi_aeLFFZ6YlimSVxeL~uYQIHnA=(C&*NpVJuXpcX zK)Q$D;C*p{8?+nls!m`75l@@cZqCE8g>9ag=*o!mnrIPc@jDg%DWg5!grH`6^u`hy$TU?w|7DJE4TJiQ@$-yFd-$fn#0qz@s+yDRo literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeLibrary.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeLibrary.class new file mode 100644 index 0000000000000000000000000000000000000000..03f7b2bcce6980aa84382c49bacb42b62f7b04f0 GIT binary patch literal 381 zcmb7AI|{-;5PcIr@sEYxKtvlO*qKh$DqxWltZ@h{A(3?zb2SSO;Gx6~_%8xhGxK<# znYrH17XV|lY}9Qu2;D%j&^#Af=yb=kgN!z;2-AVL6-VJjA`Ts2D;bCG&`VV4D2~L* zfSZTJ`O&(B+Ts-OPRk_T+h`J6-ywv_|L&QspBz-cOBpet^NjW6S_zeovULf)+!Y^O tLi>H(YQ5z^6Z*Nz*F|Ll!7@(-tRkU+qM1u(%4*plHY%Tp>8lwRwLA5LJ?jPlV5SG82&RHqe1q6cEy#$a?n85E7rrq=q Fd;tRXNKXI& literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeStreamingValidator.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/DatatypeStreamingValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..db6ea153f603665427b31609c902d52d9f68f6a3 GIT binary patch literal 306 zcmaJ+K~4fe5UhrUkrjj=a5Hdm`~zab$pZ-oIW@DLWnkSUvm=48aqs~?%GeU4CpdJf zyQ`|x_4#%B0Pu)`LC@fh(BmwdtU0iY5^91OEhn?tc%hxI7hL#^&>W3l38`C)+y1Xq zl1>j!cF|X5ZP3?wUcCn=&%O}C@QEYG<4)!=2*3FIyXmF!^N7+O%)w_x%Il7UwxmbDR+_qoh!;WWt}48ZPBE%7<$SSL5d;uehk$SH)DL^VQw; zZi_IeMDIDtEIPu)crP<_Y33V_NfwV@ovsO^ef!^RolBFTtS)#frr|4=^5kkUt8=d1 zqMJMfuhQzx)}dJqu_~g}+?rJbSl5jdJ2YYVf6>ePQcCR;2tE4 zOOq%gnr}s-&fhL+NnB!Cd^i$cssb6rbK7`J$(*9SZG3Kck<( zYZnPnEArkd+`KDWM6;2o#JoU{s=gOu{3K zOPIi0L_!49t~e!PM#NKw@Qh|?&NGHUd|;g+m^L>#LrX?8c(%Bk=hhoFual%b zV-{3>U9~j#UJ?eKZOs-zXfemFeXT%>@{(b2E3K=x&28e(nCd3C7}6Qj+EOg8s|UuG zvZ*?%bGXNqZLaTe%U0$}f{d28RO`@3#Y(I(|C%E9E$*yw+bmiImpu{B?5O*yqN~K2 zb1co+N)7m;qNC}`yiwfcmg;DxLEu2q(ixil?*@02w`&;^ix#)D>aG{$1vUnuK%nk( zcD&ds9z}Et&=WEAU+s?Pp{GU`gNA2Lnm;J;J=Zx(;&Tx%7{D+UuP0NZDYtyW!3e`- zeRzgQ?$B_yxuX>rq@0)I1xMH+&If;*ZYi&RYZN)ulGI~TC4Bp zb$*8z9ER!oeP-yZ@_BD3YdQ;N(b%j!9ER~a_(vJW{vXD$Sa91qM$lNP#<6mZW2G9$ z{-wqYZMFSGT@m)#Y5LSeO+8C(?Rq4pi8h9DgMkKjI+u^(A3BnM) zx?`&YqVe3&VOTj2@vEGwujAZ~72lbbJABYbGrWn$IS_>4HWiJ6R=O#)(_BDk@C3qF zItXZ^HS7s(w9{Gk6>tML=?3(mmn1IuGm!;ppZJEr8Cu$drwDC)N8kuyk{lzvI&_A{ z#3{t=5h6p0V>D!cBC;{eP9S|Dpl_@TAvza{_&x660R8xY1U`Dk$LU)X0o=lETFF$! zjS14dOOEu=mwObSKp3f_cb`y#=j0UW2!srgAB|O`euSSqBVE2ig*t=>9(9ahL4xiG6#jZycGzJO!UBmQ(O}%@vb*jA#!IpZns5tdfyhn4>#(#isbPkiolTKn zpfBFa2TfHnWNh%|3S<0btE%B;0c}cpcdQECjZw#uUXV&wxe(^-6BsPJ z-cr$%wz)7b-cUNU`S=y`8s}=_%L)lvJOz&07Qth@@AKjPyCcOK>wCA%^7^M<<5XDsnYK z(1v%bs^Haa3IWntqn{fr(w##G-eF6p-ev!f@;+&|5PcM7Y zq*})+HP4fdzddi?6CPR_*`d<7jxX2tX6vXU?qQLn|1DDiGdA$q-%PlfWwScwdUD8? zD|BSXV$+=$Xx`Pv1kOLWRXEZw&PBIuf*OqVY#0wxDgIshk_j|Bf^H><>tMgXV0GE9+>^Zz4Ii{?A|E5-NsA_(NoMUV|sX{fu zi1K~J1Ij&$Lv9oLSpH`;3*19ve&bgdbCLZRcXWJXOj$(m8eq5K0$PZf4#tpcClbu? z85w_0vF>s8K3Bis9=;6tWtlNaekvwLtIpq30a{PQRQdz2o#NaJ?8r_TVv&S*m)L|6m>^lUBZ+<7jZa O&N0Ptlw+CeK-0fE`g5cJ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$ProviderEnumeration.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$ProviderEnumeration.class new file mode 100644 index 0000000000000000000000000000000000000000..897608af3ed5eefed1a439cc9aec07066eb0e6b5 GIT binary patch literal 1885 zcmbtUTTc^F5dKbEx^!7CmYd=Q&>BloS`bkwpj@@Fw!|6?Jh^O-bV=DIXSbyFpZMsL zFFt4@U^LNpf0S{~?g~5*6WcW1GiT1sH*>z3Ilq2?`vD+>oC*zhV)U6%(TTK_GAiPj zR569SQks_1Jq0rg?yFFdR`5WU0E8H~=iZ^Fkrn|uKDA@|=*akyn*)CJA-FegEh1%XW7ccegDrw?*+t8~Ux-jKF zP)6iM8G6@+ePB|4t5$7~3*9wsi($QmToUIX(xtmAy7Sx?e6`B=xaCslaB^&mp+goR zP%`u-$MU=Sfu64F#B6bUmm4lQGrC3U%)z1%dc&()vE~-vEZH@y?5x%ezAy97Dwt;g zL#-uFo8e$GD=QJIXXIy+VWv3{2DN0@gu&NLS-_!lJ8D7_rC|^kHC#Zylom8}qesId zJXWx%VF}9`RI zhW^tu&NQfkrwp^rhi8~>!kNlRElcH9b;IBey%HHJ^Lk4?7IeGE^9J?0EvVal9?s}! zwjJ{=H3G$_H|lTvNg2PzcY`J{#{H38bcyd|?%V;K`hUJKLN9SAO<@;8^rOC{_c|^+ zm2?9n0};|w`_ldr?dCl@pgT2wh*0Vn;Z*n#k--txi>(Agl`aRUj@ zemDpS(%zyoNy-YX(leSGKL$JH!cVv0;f(keC*DycJ(9@_V@MH#Pj?98-gR%IkJcgb TiX)3&;#DK*D%stnJ<$FKwJ!D> literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$Singleton.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader$Service$Singleton.class new file mode 100644 index 0000000000000000000000000000000000000000..eaaa4a0d1f6045bc87049337ff03cbccfbee0f1e GIT binary patch literal 1296 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 JW8|X={{t688+8Bx literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/DatatypeLibraryLoader.class new file mode 100644 index 0000000000000000000000000000000000000000..6e89f8d8b21853f590aa5441d9a75a50b3315728 GIT binary patch literal 2057 zcmb_dT~`xV6x}xonGmJ|@vCUHLW4qpM5t|rAXUSMwjtVvV(Hs3xsq{(8P?5&hM(e- zkG|3mMeAB^pW3zh8~R(??wc7_Vx(Q_>dT#T&pl_KbN4yt&L4mM^fQ3V_&SMCaMi%9 zfw?52$m?Z3iQ~u{xYmml783Y0$?x?f4BXI~n_4RLVG&DuSvIiJhXLF&aNEFV20j;n zfO*?>r7F~{dR^89jIva_jx8zG52g8{r?zrR)~u$xm8)33K+dR9fMbcmA|n6@=|ni%O2BYlXG?($u>Y~NFR0)xc|)~=PSSq#|9jX1sKJ=d>F z-?0T&{sS}2s~h{}ywbr|;MV_yG$Rn7cU;F`5QvVAuM5NqUWGjN7adoY8rz#vty!Bj zYEnhdwrcB^a`Zk_#{8;7{;#|R*W~7;t)%74E;Um7TzSi@H))^RU@d-XN=H@J(qBrx;lcMuq8b986(fwX;2 z$D8A%S&;rVQj2Td+MX&|+pK7>p4o!cs8gQo?4Y%(^1jsr%7JP7x3vN%I?aRb(sOTa zN&l|$b{#&0oamvk(Eo_GKG_29K48LCtG?P~K36vVP^sg0W)^Ui z$1tD%<9yf$5TnEz@&}U8jX>Rdl=bf1OS|(OyC|*Ldt8TUc@I65fYHnW;+YpPHoiyV zcl4)vpCP&N0}_uBr{(~CPhfsW!w5#W9^=mmxXJ`(k;V!>;LZ$yxF6+?4+AcRK_1bo zhq~#^k1(I&oz=am`jc} aK}90?h;jrU+5B>w?~*(Uw~ literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..8329ee20c1446eae2076336daa4707a28abbfbfd GIT binary patch literal 1013 zcma)4U2D`p6g`toH))J*t=}K*cIzV96^uU0iVs%%wAez+f{(Mwu$_`7%Vbv8f2E)l z6!hI6CEm%$T4+QGN$#CFbI!RZ`T6VXcK}b(^U%iDDps)VpyQ#1EeAUex(;?3+zHRc z@rRjU=!`No4V6gvBAtdY*Id(j__`{F4DA;(mHH*aZtxFmf6QR-WiipNk7O#|&d(-7 z9rH;-E1RP%;>nmRY5Ho>)+aJ&7&a51h-4;I9v*VV&x95#5qVxado`CyEEE~^c^oex z3WvLbmJuGHQN#0CwiI<|xwW3pV+IOPz z48vc7y3Eety;($JW)vxhwMYrBMLi-zH|RGh@vL1$cvVu)*Umus%^|;VM1X2n%e(Mu$%BP!HTH(OAa@b#$&^WyE%k z6s&^tklr@!x!=%wcMkgp)g`0x0`v-|L5W#1xwwuS#lDN1R2f$;>D?w5cc`{$&v?I! gdzDT|o#9&x;SO5`HV{R02sH&_z-WB>pF literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/StreamingValidatorImpl.class b/thirdparty/epubcheck/bin/org/relaxng/datatype/helpers/StreamingValidatorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..12083f31ae22630b760cf07d8f3fe60b3786017f GIT binary patch literal 1449 zcmbtUZBG+H5Pr7TQYfb&0%Cbp6x)InoGU$@5Rtq)hODj-* zgCLomLa~@F3&aavm3jM0wyRzq9#oXSEh`Rp21=eKowD?8ZMQb#LCt3PN_6I$a_WTF z?J0S{4qK&oe(|90undD_2*h>@0*OW-eKsMA+;)`9n(RjCPdk%+Cy=sg%6fmk#bQ&> zjx1Hztu>OkPjc67*A5;FytsgiGv1;LZl_99lG^ePeM>#JH4UTD&CKgznz)QU6A$pv zL_e;Wc!V_*1Gt*Rx``=ln7E0@CT1`#FdRL8fu+cacji){{~YdBWnWpOG9L-_hl2J# z1ZFx$oRLkUWxcN4s=!3^;&iynf!Dm<0)v@sn;$R1c*mpy8=3Z~e;yz2&40z0vB-CA zf=>npN67*67cij58%hqBGS2fs3~?Q%^@etw(#(BnBGLG1Ns+A&qygL6h<*dB(05OBJ?&fNzLHy6mGP#Y=$;4#4Lu+bb>fV;w!ogd}4SrT~`P- z7pBr}Frbx6@G?%*OP5@@5G-ln@7fpG>tY1pEdpsKZu6VL9j+R>MreaFojXN$?mK$k zo+5P&k()hc-E+rCoZ}B8LC+B}t6{FGCdwI4>2L + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/epubcheck-1.0.5.jar b/thirdparty/epubcheck/epubcheck-1.0.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..fdaaca0f22b3bb3060326cfe06731b25facab43c GIT binary patch literal 858795 zcmb4rW0Yl4vS!-0c{8)pwr$&1rR_@Fc4nnjY1_7KqtfP7cfaoG?l=8rX0NsX+!Jy3 ziM`^)7xC>lS3w#S3(_RaT*s6_bswMd%|!6MZ6o2Q5J0$zxq~uE@sA;AqW& z^eO%ZLYa25EzRDX=_G%NKfBIdL{rrO!1W$Rmr#57jJ-#mlB?u6Z z)t|>@{vWhN|EwzfmsJ4@j&|-IN~ZR9j?Q$()`m__$tvr%^8!e`nJo_cG?J9dLiCjI z#F$E$-=HYLfsrNR`$WN1_oAcQ0d(Q`mG~C?u$1VjkbHizLK7K{AAU|om9egtyjVL*lh?!wyin1d?q89pQOz#lLia#_@i-_ zEjiwdCyj-kq*}TW6YSpN&dtG&jr=e;S~$XI$+u6B`r}>ILJ)dSJZ0Z?k--w!ekZ0o z`5r2RGb>T*Goryn>)t4?=!LkM4nWabsP3Lcn6YxAMy{Gs~%M(&LbqJ?}Trw+EMlRqA6+R$pAHfS|55_TI zlzTXP!efiWc$-}wy4md0%UGmWh7+*5BI1>G;=Q4E(1AwgAVs}j-h&hD064teVp4e3 zxdzdCFQnbnPlKrIMi+2((kU8@S~SZEqjV#Oh$x}642QhjBmt?k zapj)T0`lwS>9zy#GyLD*gui*7fNUL}9V8G?C;|`=#s7=v{mt8=)z7`q)Um&0ADI#j z6KJGCC0jTY1}3B73q^5|0F(=~tZ<|TcT?%tD-*2xbW)}&;e!uf1@9~@AU*4J)Y3e`2 zjXd^(vN2(BsHvJVQ?}8T$H{hSNz(&0o8y|uH=*NGxK=IWJJXsXT-!(lJ&cEL@kroX zOha*`Ldb)TTlF~djxSb;6{$3pMb;BveG%8KIPvlADJZvDEVzwYbkdNvu&sn%Gx413 z)qYIeTEF1Sl?R*pJsYmqevrbj6)!<7@rf0DHcWbNdaeJAxw8`Zfv@G@vMTUkl|=U% z>)Ax#(er(PmU-eR;~eI3^SfDgkW{1ty-c_3=-7H<%5)D&*<-!VC@0xlU6jVeYqFwF z#wZ7j)-sT3meHy?SFq|&%o|HXSr~c2&DI}lZPu9R)@389KHRxSBCo%6;V6+D>N&yN zt=h(l?nipU6{)@Ap-XCTCZyNhRIo}V6a|qh>XWfK`7+T(w_Wk8SY@I4_n#?vnrHZr zr5%Trk6)R815~X^vh1B&6AT>Bif!0DQqj17r*!^;g4W#}=tK!5f#(vGMYqFt$Gx)O z=<(g`f$p%{0lud^DLr(LOM?`hqB{NYY9egzG_3hpF56~SdVOcYbPBVYU|N&0mY(Zc7hpmt z9Tv5ZXT?-5$;WAkDjniS^!CV6oB#G6FF0acZH}l*d@hS{0q1i2;#pl;4!SZABzQZ~ zduzVJ4L4}_FeJ<)y?lD#O($o)L8_GVdZB1Kkgrxyiu#7hwOVajbA5`5cHGO<4gjxe zZLBTEZdGnH>qZ9$_DHEQNrq7yP1CG)vnSL&HLA)Z4edhf3uzSoy+50*f1Z@=%VLKV zx}|IgdQUW7GB!={<@Y|uMjX!vNDLMS%+f&i`J9}fQ7{xKDkc_*{8m>duh*4+y~-|> zJOQ=p)>wq`OGiK;Ys8ywikBMu60b39zow=JT*xT&rFMC-np5R^kgJwbGwsr^vvbU^ zovJwTu-f|fk+b^!DbvgV!8!E8@6SnPzs<4+P!I&$F3;3{Wl4l|vL?6ommjr{w<{+q z0*eN65blOWK^Ld0YMHcF?!sT?Xs}(Sv|!tmt?S@16^DL5eoE2ax25a#tiAxVtvfn5 z5qb{kk?V?lybHz@roJ2ot`WJZK!9AWOB4RArK(p2JOqAP%nZM*y^+M+wCCy%Bke-1 z%*CrDxWI-13XCl@f62EEAb=4+?==k)@s3Q zI-GzXB4_Lj`a@L%B_lu(>v_XH;qt+S{ck4GL7!2W1kox5d8B~u?4g`;w2&#=afYz2 zv_ypAqvoxrk@k^UjA?opsMl1ZCW%AvvJ2^5fY%gQOWOpxEWs-)ASTpTe?&9H-W7JC$ta^2L-%jsK{E%;!pP{-vn!i&#nR{BPp4ZbBCOoI3%F;S!j3={5t>E?e{s)cVs%EOTw2)enSATwMC;zbleJK< zjdYS;Vd@G?F*yfW%P4?dY4fwmTSz}z$+R+Ql1^X2Nzb_)h&hPi-(|i-2V>5%JC(bT zyo5W#J$SD&=&}NSqBC^Enl*pRmtJAs!qFW#el?Poh;AO@!kpd0w2P+yS&+Qttk++a zr%J%^%!ac%Zo3M(CN*6UuRG1NaKb7=x|}}cS)|AKjGJG_i_lbuzL7!6)FXyVcUvN+ z_X)P=+LGiEfOj)ejzZ?$;fLK3q`9>we|zZ;uSVwFp=}Nv;Fg+6RHlraO@SZbCHN9=wDj0{M%7fJ=CK?b?pXF$(P^sN_Y_ zJJ>Nd!FQiSx;1lwUtDU?(go7;A&m!pY&K5nVa(r8z0T2Wh*l&ZuB|;i}=R2rY&R_cLZLGw$%4 z5I%gOpu3AqRYOJr-?!dlio|u;cf^0iY_U&0!{k3$-S=k#{s+wd=k(B2h8rP304*!D zhl(wy2M2d~YinR&Km_H@)JG6W^A^OD9TssXFUp#RCd-Uzd-?4KtVSrGK`jl51j9i{ zVqVwOR&2SL(s@a8747_YcOwVN!lnc>lu$ye9*x~t2J}2=vs_!zHqz0OZX;)F7HhMQ z?X)%hT0_xi6IA{76JPa;E2BSB4=EHhX;4p3{4sHOC*lL}-_82(Njd(1GRwu;&e_z- z`QP&A5dMkp_02_Tdc(^TSjko`fR=zKKq3R~Fw)!eH z!qaqenVC7WB9DVuaEm!0An0gDh8{;wZyGG;_d!`jb^|_lTEYy);8eZsRKiSJ z9X_=#ohhx|<_HEY@)T?IUdZmM(T|RAkl^d7Gnq`A3AP6tzlyZI4u5IZOq8@KB5d^B zg8GE?ae*Jjz5*jJ1er=Jz=R}H!^jk1Mlzgp`5%HsqO1K9(mAe zmTJt(Rt{aG^8kFv`dtAHL(S8+A!s#<6e{Q7(>~;Bn7V8oJZ0UUA=Id*8+GPduuT?o zMQ#`H(9-a^M#B9REqOcfA+pwzSTBSJksP`>1jgFJkX-2ACA(hlKX<}I2zyzYXUPmt zx^Jq8VfSp`upVG!;5m_0u7tNov^V!RugcFc8ZVLTza8kz`;tug2jIhdC|UwrYeo}d z5omV05DyeS!QGOvbn5GlUTT>w&bU4lC4X<+pm3NS%JJRCL&3p2Urp%0#Y@Dt9e$&0 zDq?9Az7h|ea$0~(Z4Nlwjh~saC*)SAHKzjT+*BeqMSMF~NkfdO-6?g5)n*?7 z3wd$gWS*D@nCHCttCD2fzI=oeEmxoueu7G&QfS#5rH8V>>6kE^SZx=#Ir0-FJ%|5Zy;ObjWBM`0;-TE*L}cW;Lq) zy1}*$VN~5PQXw#PASgv;{3_Ik?;ceTqx*vJpuV9d5igabfIv`uLxDLSBR(5CboIDq zJtMV9ebX0?-T}{;3k;pn`zhy5PsorTHSLi46!9!~t5>$*8jHd(v7vV1gCt` z@3S^JYm8HnmN$skDEZx-GZT@KMkr4nt~0ED4(pH)fMuCv$A2ScNn6;9h+wlF0 z3AXk#$~y5%yR|6)HbOv{Be}sAtbg<_td>7ASFHa7L*@zqdCYj14eJZ{?*Zy>wNjGI zr3u>~x_}5B2#E9lHOdIv**crrI!hSZnpm4U{#VRVhjvyuMF0FWA-`k7MivuPSRkS^ zWQdXyltGKuw6_k5gX!aM75;sHIizBJ7P?>lExj`_3>mxg+N?aoBRkTp}32MGI620b!tVXxG1w8*yo zN$ZCX7p~MCA9;!8q27Fm1v9&$x1*G5hMEL}}JZOT_;+s;0zM>#JrW5c#tranXW z)|@|8hHB0+wPh%vWZuO6ZGU0XmfAMv?j+t}tV*->t47_JJlkoaVcxR%7UL;gE~Ki- z478f^dB4`3x};ip1;y$xrM&nkX6R8vo2SW$6Vb}33ANG8FlIg)Fx$^{C3x?{4*M(YtuCH-9PbS z$uGaymamL$#Q_F7b->S`ST1E$bIh1NEt^)hf!byP}fZR&ogc&nMPJMcrp zQco#3H{RoDrE$QjVkJtCJ{sk;DhSbD_XEQ4F{+w~Flo@I1IB-3tLTIM6jGsV@>QWX-K5htIkI{n@Oj8;rbG<|t}(!;Oq7{@Lz5G+M zAIVN z!eILl_j~Slz99acSmJj{>-YM&?y!sMXO5umUE|;nlA^B_nt|9ej6`!3{Bk8jEmNmF z!}iXusthtt5^6S|_}3*%4i(AV=0weAg5yg;C&ZmA;&;%mq_EZ7q~FRQ4KT3$f`|lx zY3Q5gvlhW0od(-JoztsHMbJM|ez`Nxw>K5+I>+*&|AKg=4JMW5W!)E{i#cyh9Q_gO zV>MJ=mby%&#HM>@ zXs+<53gVaLZ6(1c%k4PtJIO6I&%4pB4MA7VyA+}?&xLcjf-a|_hL*3okO;q2AS-H4!Eb&$^o5Y&%CCrv8`In}MtB~ker~-MRPMCZc zKS~vrkbtuA{Mg7lF&N>3npPn)n56cOFh14kG1_YrqFj#*&7dGhy#5=7!z7c)=_*%M z*6voQ-o0f-jF8e>r9H-yvUr6GAxP=Z%gYgjB%A&|s9_@bmEiKKY$(yC3qQuFPFF*z z<@Z&{%Ym)_G^rn0^DP!g*mU&ULwr1Dz_NrQSybC>czop^Si6H=f>YPAus1$dW801X_*9lRP**u@ttB4ZDc0VvI3q z4Xs3rJlp2{VB4o=&Rk>S9d}Se2z4TK@%UsjD8TidIF?_km}OD75R}42aZC<|?GT5X zf%XwuwP6XRRFPi}dBPo81vFgXfwh!c0Ksi+{Bg)g6M z+~ssk&|+~^64~GRsmoC)UChncJk<;v>iYW+G1R+T@6GKXlAWtFN%O^U1b;r@*ado* ze!TZCVWxD{Uz$AOxDsQm(+i?rW59jX5>QGVW;?tffoXG}%^7qixFHbOC*Eos6iaYE z#aP810y~$`Hm1}TTqRdUk6t7nU0R^m*d!#ANn1QgAfjyJ9xo@9Om`zl^9!Dy06htD zFK+F+wgBXdsCY3X)xtl|tM?lcT~BWz=Te)n%5iuyyvVEAo~IwjmPkjAa7T9JxIMv* zJD=@wj8|=XZZzgDsZQTjq4bTNPO;gJqYGS>0<}ZY*d7(DU&W$mipE|=baYa3U+^o)m0>P@69XUlj48)ujn};)vid3KFO7olg<`7V zIGthmeVscZpJURx_PJd@*Hk^}S_a@DeN)fu-D5l9QZWgFpaU6L1d*zGlH0uWSv~Lw zGk3yZhX!w86PxoXC@e+Q_cQve>f-aD!XO9LSX7C4wV}ozr-ZZx;d3MRHPl>$SKOSn z_I+L<;&CehxmAUivr@OGQd*k0Rm%Y$hmjxk-n$XkH?ccGjzOtPZE4Ae)fF?bknM^l zGP^IX^gOwAJir5F6Vu_~Ps@}80Aos&tO{d?Z2BR^vOya}J~_#5%x#bt#&VFF!>E+3Ye7TDsQ z@uzRBpwOJyRA}g?U*Tbi$LHo<^Y5mt~8jn2W2XOm}i zGG@eCGbq-RZ^*VMn$|QF5?+^dFviE(?;>7{BTqF<3N0nLJ56OV-*p|QTYl;3egfA- z+CX9~d7bPOA>eXZudUSGMC3V98L^rgK*FU=)Uk}0tr(x=gwrUFMoFD_N~tg!F@$oX zLVOZuONA8GN*(<0z#F^Bgfc$+6*Vt0fErJ!%Py;jM|HbGAb#pVRBZVT)I%v`HZST2 zSU%01(2?l1=#i;Thw;f_-SdjU^=?kia^_}3nBR&H*S$~7@szE)?po%8+g?9tWwYuQ zi-hd5b62q`#;Cm1e(S@*viP2g`?dXaV02X|0Ujb9UP$E^kh#VZgdk0V<~1izf}%gX zr&%PQAGEOc+}KQ&s%wRH;AuG8m2#uJkC?|~H_+V+C)_qqXc_32YFWy+$5C_*;7~Ii zvO}D~P>td$_46CQN5OMdt>rCJCEO%hUx5^MTe(I2xa0bW91o{%>rCbapJ#;ypc^pSw8WJY(Z~Z(1Yj$E}8;(dgs}YjFAuEEw{FS z^Sg@(cz&|KVGd}3VK)ZwRLga?K>Xb={yU3;`yc$m$kN%y(Ei^z6mpD}`sP0z3O_Uu z5Z(W*DD+qTzaB*Xy`+g&TUW+a#rn$D89`|RZ*35w)}@+>3!=j)OU|_Umb!w5gjD3d zZY`GpUe~^9jdvQjUl7BLPv~7se>)T?KLr(4IKK=C3 zHGbv2P44^A?h9l9B!`uaRXJ>hg*x7%v4uQt1MSu)VIb6}3!O+T6O24m8e~aq4gdsu zHv>P#!R+&ykxfXZVXi*`XrNlLhETRrYw*Z@3By7Wg*D=@iGmi9_+WO8A-apqvD=i} zR23Sdl8>mGr7d}=%;&P-&rop6PulV+sTadv#WJhdp1e@&rmho%;u#Z?X& zHJ1)%aZ72qhroQ%YHO8Zn38k&mHljp3kLV*BJg%#U$ z@O5~U{0(-I8s7x=YJaEA5f)w60h{8OnW*4{v`3W*We16{aK>&#LanL+yzi&#EUU6RnLc(E zcV^Q#GZUKvRBw`DuNeo0L6s@xAWvgh)VYEw&j6CJH2iB=O(9o_{ctT_aLbeeLj=CZ zYK6H)c^y-#-agl)wB6)VQ~gO6SUBMlI5k-y`{V7nTK0j}|1Z-$mq>aylyLa~!2;tI;WBmsfcdADsAA zT+--1ZC{44r;b~^On9(fKXW6L6Bm^B)6DcXd`#^V0T1vMBeSA*b8-s&qyp7;I7DHH zlW`Q5Q9P^XlKei^#6n9x4R0`fV3MvPPd)jy_|N$__|F9&+)yIxpxjWOGFpWBeGo1U zVw7TV4`KT}ud_lv>j=qme(d8p67yGs=hsYzTXF|`cdjJ3-OZ>kU?)jj-C6L`agcdl zI3M7>M{T-6KYEJNd}o@2hcpaoPOoT#K-Qt2hnoyN*b>Z9DKd*sX?2jrMrn1Tz#%h> z!AfmwPM45pY9Pz21G>umj;MdG!dSdQeZ#_Pe+L5vdtm;ugQ~vB%hTK%JIH8GTAG^6~5p1M5T6z#cRIC>VHNceI_V)Ml~jg+#hhntYz?H zAL+l{yv2OjBkTx%h_6?3y(ps4Z0YRk$wJLuhIb$mtmpc8fNQ&R66) zGsr9m>%sjoUKVq6eO*tTzhVQVz+$gS{1f!=vGZ>PPeSR;H-tZJ7*~J7AnX4}2oy6k zcD8f$_#3&?sjO>7hT_brPb|nE7oah!u##>klGKkbalj#HB_8Usq`SeR}0~s zO%ulU;5yAv&VwSuONgn%8rt{dnshrk22QN%L~_`_C+0?B~3y=9m|+OSqP0mq+K)4qGLFgWQY*f~zTonO5}& zTg9%ImglQEiKGA)_L7;ud|xocxBjv1(l|NbTdSxE4tcvaEK=L}iL>!Edm9 zNw);As~~&0*<)JnCy&-gxgkDTx)VsdBgN`6xeOej{$d8T#JO0p}t$-M@hI4+QAd8X7cZE!d^D`@j%c1LX!<+7&8bYgRO{D3QvxRbFE4K3lVT zhc(>c(`;XVT>6Wsb7%TL-gE!Sa9vi?~Y9-+sTX=v~8ZOnTxV;27Mf-rOdMVN@J+qw)|I}(V z*`+948+r! z)Fuo|j$+H63hv$rzxcxIvY?Ff5Oq{<{j(vhQW3Kdp&8!(S}Kr5VK`b{kYUV;KMfTg z^OauY`n7=oeP~y)nNp(gr~p`ZasLQta7+iuUQ?a;IQ47JChV!t)XPE7GJuhikkj|@ zs0tXE=YXx0@5>9k?P{dF;QD*i(1_^X(ROIw)KSsp#k(9;)flbc9p=519$E((97rfg z6e3(v)X~ulnE+m7B1E*{cx2$*BMPk#x7OHG?nw?7_MU8st$e)P`{9KN-=6k9N_)g& zUbLzC_Q=t%56-u&mR!6qpT$=qDNkD<8|@p-ndkl<9KWb8~Rz473Jw>-t{cz28FP?Cxb zHR(5>Rm|0G@MQ%ET^DT@Z@x}cgwb%YxxNFbx4(KRzJXAx@-81Vu36~`6QJIwb0LN_ z&&uZtQ2B%rs`@f0fkKI$0R#5)_bj5~exN7=ShYUGxa8(T-QbojFx}}JL`s(4oyp zs=j5Pn~;Wu42}eFcop-O2;`8i30M{(R-wIjI87euHd9CFzh zfTu}xwuhB>z~wh0c+=>SzlYp6-+*^lq8u(67-pSN+Ikx}Y!AY?;IVSRq>!eS3oDT5 zIhrA!LPs%{jrxiSvY!GuuJtpBK8PmznfV3szj5s^VdtkIr8fE>Tmu3B&$#w~iXQ)h zYmNVcYg(ceHbs>`mlmHT<{=pY}dUoULTl8d{6|!3Y&)|UVt(ZZHak>VN}VUIZzzVX^t16dSsz5?)rQKI>}ebRKiYL9fBKf)UjyLU_m95 zYm&W?dMhTR={j?RK*6Lo50B5nK|kc}n*|uJ$3&ddU?@8(+P)(V+@bTYO|1`nx7QBp z@>hP`Z~pX~wmJaUnB`i8M-d7mt;%<{isB7{mfmTR1V09* zU(+DDL3gYQA&cFL#MwLq_d@W#c>>4mNy4){HxjKI;=TcyhQ{QcDvRj7Dj%tb?tQ*p z;7;pPL~W2qT{tf>rQ_Frkq$4@LKq$gapvEqxu_@TkK=OI$RD8O5PM~gs;36eY^bsr zso?(yy#1|%xDfUnHvNx}#limP67paC>|amC)Fhp7MbSRBQdo>VE;u5L^MM43Gim7e z0RVvGNHGltN0aetOg*xgl5~bfhN78RE$X8WJesPGV_wT)Pk6bAA$57nfq>$m@6G@; z0$z&(TD5p&bO8s|MaJ^)v{VIy>r|HUBaHr(+6GOP#;Ei?D*9yQQy%&0ipaqLF1PR2 zbDJ!EJG7Q^Im8^Un(gIf;FBX|lEZV+c$F?RT0FRz486^jl)0K?Ac}dICBl=VqEVI9T^8JEot-?j;Qn{nEH&O$ZjjS>cnN65DVqk zKbA~-JgnR+;)t=5D%;1RNF1|DOLK3K6rynw$^(LGRh-_h5vn_y|S8MElC!LP`2b)Gj^LAFe|dE>G5JZ0%0$Y2>)%gCMC zocN>=76vK#iTH+Y-Kz$^UZdNKAOb)`$6_E$Leudt>cJQiOa~d^mZK~#hlPa|#+Gfa zhEG?M>+JIS>gqhJ+TG=S(2{5=Hvo=ILX8d>Ri=(0(K4mm%?LPmSL~H`*X*TsSM9ZO z&(3o@3@WlQZEVT{JGd^3ytfkz2_tI9?#G6pVym!z6#YUk{aB`_C_Az*yxIUoFi5d>F=ASkFs`2c|6$_!43*(Cdyq*Nxm5|EbBv^)z@e;LaNvcsX!}{b zYn6#y(e(>RbC$WX){e$#PLC8X7EwNePcm&(#*>qTAE^t>i&1lX3T78p55dV|v1x3u z!K%NY(ObmOiNVC+=94`(x-PR&zouaDfh-(6qz<7V{dwq>`Z||{H2Mkh z5N6GI%irKJ_xxt^SbY^?@-|>C;IP5m$PXav_Q$ z8VSkuFs#O2V5%=gDd#M;m|dh8V>}9m$ix;u#XhoY%8&MEY>)09u&x1s?LJGFI10ZJ z4*wtC${4|Sk0ueCc#K_2ltbhbi}CIB1)bEyC!e7)VJs^Cl3Arm?mart78K$JGp|Wm zl6?;muNb=sUi@s(g>dPYIbCbMR3(2oNK_13H8A4r{1RN6qyO&NUY!}Y*xG{`YCPju zxIoS`=HHVEpuc`5@~1BT$M{cQIG8w_{1dzQmlWg)LG&Kp0tjd!3HU$K)qm0Y8$8f5 zF)*;wGSU6{<#(r-)4Es+`}>pi;txog5}kxPG#7R27bXX5^L*^}8)Hi5)odvne*nM; z4h0TKN^R`H`|;_0s;C_p1g(f;HT?;DQHCa7;OTU}L_YV;>v3voeZKz6)s>+F4u5opo4b1J@i|>m zbyD8dwW_)ra-W0N4#LBs_3o~>Aat19-Ps&Ef2;n_s=sYsr@Oz_QMFdKk43ej$t6{N zRCVBn-9G?2nrNMA1NGyDfag6bt%+fWWS|Xd5WY!s7zO?e3Q?A^lKF=61ON_20h)el zN5VHQ+Hp~oNsM{oC7$sL6TG5&iveSC%^%qCs6uio08ADH_^)lqSO~<}f~4(=2={w` zJ_;a{7W9fE_Oa~JrZKy2KH#6B>+O*1Z{o8}pAIdZUo|d15f`1kTL$c&>9H8fYYgeH z?`An7^ofcXm=2=UJc@CjT#{xiVn$Yb4i@63%a*PEnWgNR+4uP!J@gLpW;6*N@kuN^ zL=q-6z4LNn?R^^f6pDJdJksM-RG1=Ml+oUb2lFSgQrl#j_vF*VlsTz+?g%|hVL7qG zlth1c;t+NcDyPj@N$=ztwi%{k#z~2FX1Vd%`~ki(gJnxrOBoi0UosZ(wktyt4Yzjt zdsMCAUF2uE1M`9lZS0}zUgERVAWZa1AaxQ|Ng?iNT96F(ng@{{EV2nO6qN3aSbxYo zG#~ZCR7y2G`f^FVBno#h{RQB;lCLx*e6rcxaIsSfv{y^e`rF;{XDWR0tG)9C*C7ZW zxfUww)$`P8`RPw;Pr;pI(PX+}MIKynjwu7O`_}BF^NwdERY@LNNVbVBBG2Y;M;_@b z6b6L!mSpIa2Ru`J2B&?oNo>(H^mEu(4h@n##?%>@oc`%aVzAJ}bmT#Ez?nlV^oA&e zYNNwcWAynPIP32BVA&P{@uN{G0zo>@h9`xH(A7NXof3CC0GV%KJ2Z3$7S{>pL8a0! z%-M{Ykq>~@V~ANx^g(RoJy9MhW-Zgfi{#Ys%~88)d5A2r|+l~bmesy!0fa@-$| zEFjD)ic!3MF_muCA@&_=wS%??8z8ra<<3K1Qf5lb@4g-mk~TS=5Y)rTh@ zqn8;bK%h!rO*I|?GiU=C*+3CcAXQ63ihL{d-5v`?=-Xy0?3ziRRbNR`lXIHL;iNSS z<*nwc6H`hr23gqs#pLPviQV(nr@_-ORI>@CHCSMrS#K~#PJdt+JWL!uoY%)OUvgE>Rb=La~fRy9`a0igqit9!3EI4fH zadCqi1Z3xlIgpLC=XMI4^(%G{f9?1aiURYfluh8haeX`dFnC{5@|#UJ-%nWEWgo6F z{yEkBh99EB*9gNz$Zaqs>9}@C*~rpm-S3-`grHL(TS|psdv5?^ov-9)`RH%yb~ZT8 z9+&d-r!rHh0(@`udrtF}e%&5@m^iqo`&cQeG64v7bc8-XcOvLsITJf8GnbC5;#C0o z&Iby2{h7-x;y1T&&)qU+;Ww$U8?j{YnnGpfrk&d{*c&lK{c!2vICuKTm241@3WWd87aeRZ6x(ZJ|ZXW(y zk?)<_|WRj#}&XP&an9Enyu`KB;1FTY1rY_>Rl4U%f!<0;h)60&Br~~4M^hfmV#b36W>e%>c+8yPMm zp83Vl>ZH^K8Bh1bVJA}+5BwK&r$0O+)15^P^mIN&zHrQ@V+MUAS?k(^H9lsphF4xOX z@Jn#XZn_H&T_j;+{A5=U|Ar}@2KZQLz6 zjCIp6Q4A=+;yjT|i1yb&a;3-(x5)j}-wX%{K-Uk*|i_*~t3(--Z`h zj+&cs?+nC^tgpB}jZdUUgLVzQJSqFXiXw(+V4%o=-s9hGql6BT+{(>gtTVst(NKif zss=KcqL0TG-K9@aREV2&;*ucY+TBDmmf8bHYDbR2EvQLM@lYJ0($-mw*yYlREx(P^ zXG?8VHFLp8ji;aF|(|N3E#b=P0$QoUzTZknf_zNh;KwYs5H}b8Pa7`>`pm?+y?N z!^KaY<-NQDH*>u1EU(_~?3xH4^Z9vD#cZweeB5`BxC&bJPH{~eGy(H?w{mbxEX5T` zEoa8|yiN4Uk+38$g&TFiHY0)l#I>-ZTV_D4O-=Z{7%N*NE+9jOj@<5Qr@ti>)8!xQOZRc_n%M{3z2AUq($JeaW<^>IsdU zIW15qn}az+uf3P-8W{>mzlC_k(oJ|X9H*HRX@l)bja#jY-pQZVZZKV(@4T9OfFlUcsaxqw>Nr`>v(1z5d|0f}{CNf9K1(+w`>Dbkp=UKS}zv_?|pEOCkGBR1&rs z3B6Gp&8@VrmJt@hA<(&~0l7?j(KFZ#I=gvs#JtG38$_r;69=Zh2sx2T5I|@gV7O-# zzbG#E9kilHv=4_;Zl+k0Jq|srrOnc4DXGD(?W&mpE3fH3(-rh$jH6$K;e5v{Q$76H z`2v99X4(0JiR7>vN6pA(sV=giK6x?lR_vc53 zS<&m{X{Ne$en)>cLAn3sug{(Ps_XJlttsW2l=jI~sOXtM+csfw6>wGjSy+!4b}B-X z5>S0(!h$UUJrk>yH#@zHD*^%!W<*^}yBhwW9`%N3X0g10F?NZHt_bSLrV5}>ORbHX zjwdAW0hx-9m9Ws$1$?Ha2^_}xr??__>o9W=S#lFHk|1W)nN-Oo6N&1roZOr*_4}UL zU50US!hC|3fryehY$yM9f;WhtTaPo^3hzAR>4F6C_=2?G@_FTw6YrYe`R!DgNjLdmUkVmz9qlrz3gk7n>!!};L-VzJ3w&Bd4l|*?ro;H(Y zBFD0!Fd-Dc^vsd)(KJBb!8}!E>W?R(9Lu~=U6U{$!?0JTNUp!GNx@v_B1vN#VQZu{D#0abI-VU-CW8Q0tS#LNjbg@~u&u+0C z1m+rSo#C-GhLElv6j#icP(zp5O!imX4z-XzjI17sB~w?BUU3T;{5Yzp>b9kB9lgq6%`Z}3|om&-wNpfU~_!bSL3d98Q7o1*Xg6ayIzO^C4_DW zt1Se4qWh>nsyWvp+Ci>3z+I!C4sLt2$!hi6=9fJvJ7iAIa*`?bPX@=2kEaW^eVtzW zD^h30h+I-SFlk(GjoA92f527em#PaZ$3DJOxygYiJV|YgKcM#aLJ(2i(S@$}U8W*u zmVywNJmwye-Ki4{-f?)74pbkt7NL?86c2Shupa$vW&eO!8hpPtz%HS3L64)9G{oU- z0>O23#DDRM@;QwB^ZyA@!%_KCypAs;!BYXW8hXD+>xRD2W0QaJ6O}CaCtatApLvDs zg;V1N*k>1dZ$mS*;>u(ps~y{EIN88 zX09ef;^Wy2Fb-;9XR*Hrr+ef`*3oS28a$-cHt!+bpH-PbmfDLcpAsDdjM1A{zWTa; zYe?Sp)pHeS1eoVgpmfzWyi^qC0MI-^2-doPqp#77+~L^VoY(2lRQ5XDC{p)7OuOE# zZwCb5xq2I=UQaWAfRHid`Cd(}tYbAC=bFRvVmET*qk*xN9u&y=4D+wd%Ybc?OBd#C zX3;)L@w2(63n3`L`Y@2MuckZ7IyAk#4qb?k4twz6wi8!SMmAGIr?=cUjolzx| z0<&g`v_gOHTl2Dx&IF6|@bmlnc)HpuWLnI}-36@hPe(5dl0yNYHQ3miewNowi0`Sw z_!#X~z_<{u-p$bX`=j^&V4Hi{8D~R{en#%NUNM0ppuY!fYPdH|Dv;!mi137w%@p$7 ztfq-&N9n#}+M$ofjK^Fu82P*QTYU6KiQpV5%%G<@541ffPApm10&_2Zd=Ek(8Va?I z@pj-WYXxE(TY@jVV%1X4_Mdv&wM(}I(PgA9`RJJstD$`gyA!ByOZX8L@K$xSr8LGs zG0RajZkDD;w*#@)pDp|)$GLRtn0zs!cX0+CS3o#| zSXQy!n_wx)czZG5lE}j4C`gv);>9@42OW6vCUjv9J2<2}`#Tp1TizKHT6Xx6|DoRo zh#RP*tr0_Z8v?y(*%85Zd+?fC#QvhD=iR}hM@)0b7uY`tVG6G2K17=q>a@k~Y#*Rm-45A0eiMJ& zaeM*?LI5q}T%r#oYH6Hb&$3)jZ!Dforam=^hklTy0MT}X{wtHIx&oEebX5yx#XkO} zj-MdTvw@(}NgEbA(e4ai4|VzvjZix%XW}35=>(=sitg)N!xE$jXE@6*jv{YJ({U_b z?XfH#SUk8mYjkvPr^Q9dp|(cn3PrV*3kj0 zVmHxsY*EDr+q++KLeeH7Y;T+Xcd)nB#gj;zIYVii6K4WL}Y2>wBY8F&+|S}t5KzH=TBYkPd4lG2h6`caUZP@@oW+_?Zg zk7#!$kpMM_HebXG$-$~KM%As{(P^?rjsxAg56YJJycyrvbDYeFDE51DL+XGO?T5<}i833GpnNBNM%YKhXM-RC2nYgSWs6LE-HknNR3 zE%R%HTvDc&bl;ETdBCg3HuAvSOL{3nRrHUF^BF?D57e~yQ`mOGs7cQR8XCnw?LfvA zTzZ*C9lpqsNW$NY2t~E|s!X818PMc`#iFf%lsb@|3VI4%&1AIX`n-VB^Z6EFLv%tcN zI}_6+E~XkNUXSZ-##1-Lx+NxeM0=dQh?o7p79JrMXxy2I^pTXR>C|UD;FCbT3%!JS zyH}ZLDbp)>8iddXG`dQ`H9OS6$DK)RJBJvxc%rf42wj#3BJdmGzhX-D*YoMwcYC|X zhsQ*7VcN_&>F6_rN8Uu+(f6|ycLAL<4)P}{bo;weMZ)om+*!Kn(R`cVzc|~XH{ZeE zuy;aSgEW*X5#0m}{5md41mNK^gnyVy^Dc{LNv|IvKI!z;i-=*{-a8>;IgrI$)>JK1 zMmRpZ+niY<7bR$%I5(@g@-85o$2dTm3Xr$Y7b5B5!=pzH9KG}Qo9*b~_7EwE^ao*Q zcvB^u4Lgo5i+Db<5ZzjMWf|b-HI0Zx%qKC4MI=WLqCMipNW#R#4A8?bmGONi<~f#@ z;f5l?)o$MHN4>xxfQ5ON7*YD1*qM($d>h*lE75m;D{qv9^rTBADC~Y1fbV0pUq(=Xjr# zmNJ5Oa9Y2Vu{NLEv5xk!-t+hT#MXe0+9HeoSmb4y_i;^rNmMC?RJl!f zn(;jbrc>@z1;(te;r%x+_KuFgM!zMh&eZVob-FE5saUkn;n~B%Ll_yI?{5duTaqh= zh$t--=iya;&;{0rXg;5$`F4r)zdObaf(SZyqc@Ia)cK^FcNlo%3t z2XLwJ_O@iuxztn3XgNV{$TlYnh-U`;IxcSdY>u#~_x{pEGK$9WM?Wo4bzl%8lEd_( zo?M5L0nb@)#f-T38(O-L*DIq30bnNm#}4xQ{I}lB!?D> zx<$Gkx-sz2@*k=LihLj`pdqsZ2ses$<(-D zAG{Dj0w$El;;0WkDIZJtql%CBHlD?bP{ot~>RH*UO8iGi!U&ZzBJU{bdps(L|x)r-nz-_bT(7cUlM6TKV!}-#>VS zm6Pzsjvnw#2Jkef>9YC#`_rwH=#PjjCVA}ahR*NDzB;7OiQs^zqTGI+Bt$o~@-)e? zef{Y5fUsAx1)v{2UtHp>z_8v%gmx%l{V!E^=I9QQBrbLK&{0P`64bl*<-tQE(`fJE z?!#X|9fS^tqYzIAyT`!OIk<$~aE2qF+--TRrD2D7_w(#3AuW#J>%*b3fJYTZs}2}1 z;-5<6o+bW+nFEj*AeSY3&W_zXB-nBV1A0{kYS9ySzqE}4kaySM@D^)uB}t6?yO4GE zb|3D3xg&qq2~hPgLaeA@>uyjua>2;fy4&1IuZfOLI z*nKdtUM{$y=-6`!hgt}++OqPR6ZPzms4W24OCK1Ek&}=58GcLjo<-)WhAX zSL^j_I|e*iaE|DX-+1pb?FGSdZX@=3sN|51qrW2b{IAJysWd~&h97Q!lfeIS1EM=z z%W?N{nr-tI?CtSOyZiEDyPe=ws{!~HvxyAlY$rNoN}^lp<-%ccW4z341Q6!SuBKN6T$R zuk*|3Y%!gJ*>pV0KOKdl_8+QseavAq=I;oNN1z|nJ7I+d8S%RU-oNUB{iD_c`|Q=g zTDJON|0H@@d&g$XN9S$w9$;ys} z?(QpvohZSL&70>d1^R#p41~9rGgpp_5 zCu@MW<2?^PT60}McY-+2R;2P~zfcy@i0^@N_T}+0M=@5VP!@a;kcL@!{7nX={~bjS z2J?YNL#H#2CGB43 z0m+k-g4FyhoubMcXB+3yn9j}I54LiUNA`eAttnOS)9_UQBB%EgF$9iC{ltt(e@*5o z8+q>rWgCdIJe^+hRJQ`_AN{q!##AH>@ocC$!LR)qa~-01=LpG2BsQZqsSEII0igB$ z{VxS6lO!ImeEo6v79E_>^P?QGMpaRsxc%XfNRe%v6+_KKvjjeD ztjom@!-bOdP`nG41?rlTT;X?%OQm$*luFK~Jk&TG2Gi~3klmSNb&EBAlvWxWf(ZZ4 z^Z63@8j6b*G>e6>sm91N>iDDtJ?)K0Ck&5EN`2asq*DIyF&pL<1;lfShjn;1$qU2m z7|Wl>X`zy907Y}c!C=tib;yHlkz4v~HROlo{Z|eYr}45i*uxUeiSflv>?&O@Dd}8T z=0hTxF_t{<rBRtR zJ&?;t1=Wr{IM`*Gz_4#%(3RGG3yjmN4({KkJ|9L0N5d$piQ-TAuV=14AT9Cz8{+FmI=l4;m|Jes7*m4$gBnrDa%TuxR9 z61HaJq_X7Ca ziB?5wjr^fOSHJ$zp88(ZGg=Cfx15Ah-rEKMTCX(9bb}FF5A{}2QqN%Jy4tzVM zCt^(Ds25%KoRl%TXI8yNQ^4G3NT>ZTs(_9-4||+)A$l!FAw-m;wrQM6X0BMR`C=>(ffQF&$_Pd_Br)zO!CyZaeCkL z@V)0fpTkxM!yxFL_Szs2{Xd`1iLuBH6*w^1!`E$Z5D;5});WC^5WD^862ZQ#Z6a4V z>&>%XZTno=H#P{T);MP_9{898TG%xc4HsF4uupi>Y5K$}hiDx%%jNC@##UtPK!yv< zW9kS*t~AQcvC_RQrE4uCnDqi=0&A|i)`pd;b0e2qFiW_~^J2zzc9a06I&B(sW#ARN zx^F;CZPi>CLV)Cu8!ctQrIJ>ioi;o8LPHRqq|?h#x_a}*Uj7nH;V*HK=8G~)ocqZV zWIA7QYSY2J)uyfy4?p{eN1uJf2+&7vG!wJAsqV}xnN0;>fq#Ai-21M3C>o7oTKYIDjQ2TIu?@Q|!B-dA7 zx`sHnZML6Iww=Qc-~f^e#T;oBYv#v1Po?kD93E8gU&X>yB6!=*00SpO>VauE@*ay- zpz*0HF&;X}T1-)QWGtZy@o2=tIqNhkXAYv5Nyc>`EPQ~wf4Myh0&=YsR13_Hw)c*L zyJ^&Rco^ynk`f^flSro*Z}0b=-dJYvDWk!V#|eyR5|nf?>=)L?QOM-NW84TpE%&|Sz->E zaXVBoM3&O^7RjY{68g%aJqGvUwf7Af_kra2D1<~%rStMM zh|IVb?)G=Xfh%N8X<9mRDl9S<2h3NWQ>UCk(m6yDksSJzaK#y zY)Mrs*tnBxOBi_&mdJgqB~BaVUW2-nT=BG7l>XlEC|ju2Ms|{YU;drtsz2fbnXmM} z@?(K!gFoe$`vLXkY9#sGk|wHJ>e-g}2BCqMaMl`g#%hf$cZ?|599g|@5wXv-k5{BnAQwAOTtC3g+x3F@UZh1xJu{K4VC`Y?#&&0&F?Iih(7 zSQVeser*)V&n|FOtx`>Q=geBu_TNh2llfc;W1pqb z6D3yLM_kUa=6Gb7NPTW~+o(P#xpicp?cE%&2IXhYK&XLenPVt76ZPJ{Isfj@uiiG- zpILetSXbY{$=SVagT57;X4{gvYsS5g-TTwG z=lJKlKfQW!e)`?pesuQk)vFiZ_M_*oUk41tx&bB^@gl3Dvls7Qy?WcW98T+PTZyl- z2Hm0*!|(F@PypJgeMMHgmguq!_`zy!Wem=`x<*k^kHSOxgXX~goafq*hrFt4Bg6FwL>M*Rk$rZ(1J8istx`b^Ts0HcL)Kjbf z+H=3telgMygFaZNZH%^}*yzzHPSWp6K{j5dS2|c3{9Rp-x8B{KBiV0lO1eeG5$$oA zMuKlOsz*(VpIpQx+D>S&=%+|Oa2a!-0#^#M;YAsFP~+i`8(`JBVxxtOcH}0=txfhy zpuKnR4&bi?^PPZnxWObqpW?wmH-nt=6r6Gwmfsp&c|A=>8*7#(f`CBuKxD-#qX;*ZZs z$7#9i%4+XQ>90?~R*{sY4ui;#4tIFV0qmx3(VrScO1T6_*q~0USjbTbU~|K4O1L&- z$fp{O(~HFN-MG4MF2MtfY_N4lGFvO}cNMjL_RQbU7N}55{GYBHsGzr6omiJRwwRefH>kO-_-|vkj1T@ui zuF_9||MOFTO>BvG+#MuvXHzuQ!!&nG?;#Z|Hu{jT|V+ai1T zvd$?3zjjem-?%QK+N#)jh@3*B=g=JP&|*Hn?Q7H&Q$aT!2k~x(7Fou!;fxhOzQEhK#yD~&C;fjk0T5By3kvEg())pnL zm1GT^5rTgtBQh})+-R_fF-g8C;Fxt~U3FMi_Eo5Bj3(J!*2^5?AL8Cg2)V2^_QDs0 z9M_XlPu>_^+>&6p0Ej{K7kA(c0flu5&?XiI9W|+)SGuO(CqWLxu=n)qB2F{JX!Ww* z)7NMeh%P9V=9bNSPv7Cs$DD2XvG<`4XSL~Da1f5**RwRtyknRKApKyBeh8Hx@SJ;BigVoD zf_%R`mLky2gkl)Tr(6TFVKk5?yT~h?vM-YhArVKa_yotU?FS-+WvoFB3gTy+-={F( z;Ok+dDK}`z8v~f~*<=kjZ+Ly+$APE5ef0Ej*@~_aH6Pa}(Al5W;xk^R7wqizHGPfq zln4zrr`aY038T5$d!KDtX~KEaUh9yv`xnAu@s%rG6;Zze>xJ3|VD} zQ_1mk&g&r5xut|M(-6W(SXA->ErH^nz(pr}7s^cR&|ccUa*>Kbh#OGZ*FjbaXmp^S zrE5T$%e0lzLqm`_6p&j`marj}WEu0yB_H_Nc zbk}`m2|PbY15OW~jijB$(V%#X)J7z=Vlb88lLft?6C>_T`|rx-RQ zxKf@ISF_oJmKDjzxke=Cjh5uzup3+|^=_I^WU6P;c)^@u?t0of#%BizHL??PvX6c3 z=E1T#;8(PK4VDrU*qaWzmJI;~7I~&k6_;!s+`IS2Z|CQ=n=Ny*;wP*2u*z`u{?-5a z{`CE?V>!E<;jD$bu7;q-lpU?CFuz50Mb}3v`-TXX!2_!r$GRx16NcHaf;Bj&ShK=R z6?B!~`WHj}7eoDDXQ=j$lA;|BXYAI~XcOTfNjJEO3y$ zPLWElpCZqlb;oLKwHAhz#+|$t+uf0M7qdFAT!>D9)&?yGO9`81lIcqDm?>*D5MRB1 z^@dPuFm67mq4)7t)D~+)*1iH^R{QA*Rs#uOMeU!$lG7yulH(i-R^_1_rD5K=hgcEImOl||6ytU zc0TOHL9xD z?ml}|&p79lev*WWM*fDDc#P_i5Y3y3zpY&=;Z^5TqnM9Ln=d_#bZ?{5mfoz&73G@a zYo~9)Pi3Taj+$2xYfs^HDQi(Bfo)D%W=C?n1rNF#js1w4>rhXH>f}8Kiurm)K&fHQ zI?d9>$SB%;V3>cr^+mLF!Qe~X5)!;1?)9R}^a`F1pGPAPc;zt2UD1~~*`tCjvI^on z)ja2zpjCix-zn=2ZSeq2OxT$-ko|EmAoOSj>Q*}g|IF3>1FB?tmfl(k$>dIL)-uBy z<{uD;WR$51?w-snGdgF?jSpww?%{ z>21q$Ykqgt`JE`F4_q$Wt>@`q-7J2yZWil?VssUA@InwXE53v6ganFN{qh`G$3A6g zvLcr(?PB_w!D(6LWXvAA?8Ym3dSu@4oTXFuBt+ZwCJ&M6aAu*OrY45iKj*FU&+0VK z!7Ygn7obB%@95;*mH)*aFVe9f00sKb;OLs`es zk9z@yV+^klG3m;5dfl5#&o@Spi-YG*rX<{@Bj08i}uaqbc?ujo)Weqw9W3--jdwq&X)ON!kim z58ww`8Wy#%^tW}$`9q7+8priBcTo#59iZh_O#5fozZXnrd7q3HMTy8-?-rB!R^JQ1 zxZ7Lc3YNZaYjk@HjWrCTc0v#0gRA&bQdi>QgL5PM=>5`Per&~XN|Ks9*j7{+PO_VR zln#F7+D%G5T6lgx|?9(IqBr0QM<|DD|j1ul}07%qB;aVD)<;6`O!|N0VJ2Hep zi|7emXjXCEbfsG3FGA}?;-d+hX*Ld5WjO_lp)~%ebf2~L_9d5=C=fYcP2^4mNAm{J zdS4)S`wj-yT+HcECLdvP6h!7FvGn{=BRFf9`O0(lIokO(D!}Vt?ZsA!_*(1C2ZQ~R zy62wgO(zySZfoW97MQuVw!(bYQG2?(+O)p7R+;O1acd9i?PacO20vct<|Zn6Z!WhE zFgCXJpIe%3xw-Nw8szqo{;;+6@Bg-JUc|Rvr9?DMuc?))0>LWOW-_>>qmKAU6%vUh z%`2&EG?JcId>Z-pEth}d_-0x$+c7&vkIzz5hc$MB*POovcKxMk$ ztB`*uMJ#A9Q+$wKIB;B)Rc#{g6>PTM&7 z-ajKN-@7+2-}~*E`5w6W-bx<4Z|r;(Gv60(e)~uvJFl_8y_K4T9^OEU2u?8@8E|S% z4l|NfACf&dxZinJ>2fiwo$I^Z7wzYG|DNagAGh^y+bQ1vXFSFG_ddn@zx^rR$0^=l zdG-$0ImHKZifmg9k?|4-lth_2}+~5G*;9%t$ zK3s{@VPp;|GKRdjT;>PGjfB&dvk-s{{?Pv=()kgqTu~mha()c zaD=-`e|5d>{wMcv{gZo$lY6-GydAA`a*yQX-ab<2$vwR5$vs-*KivwJLO_x6!G&+gG( z&+hRWXZN`M>>jUkc0XHl;5#2)m13<0Hw_ks~Bft{a`L;I$KPw ze6T)Z>Dl%z$IVJOt@>8a1LY#K&a{&`kS(KIAy~du8 z+xoq=G#6`0K(3Xz?QwD3Ptmon-d-J^C z;`+q(Il3_8$$lkr=&|+igC(LvI+v2bT}N9Lkoo;=Y^`U3LyMMwGS@rm0HUq|muGl_U!QfZ>w3*~-2=dDDSk?lL-geOnTHlR+$vby z$`p(S6shZOLMS5!JmhwE(N2N3rA>rC(J!8{pPwUapV7Y)jTElNp~HB2O-dTSa8aJ# z?!7#t(dG476}i3!_}^&Jy4i*bo~y&+BR*)GUt9knxpKBv-Z{VgV0U*HZP^VxpbYCl z6Cu0->vWHBD8*==nS(ViAsKZ@!bgSjdx83#yy0%JV4ltt78`q0x$;uLy*{uqV#8W}gaEqA zMwJpv4Esxod_GA)9^F_37^}_vE-WL1=<6G+3(Y(CENqokPZ4rqyp{yUyC`Lxn>GL~ zG|Z%eVvu4IP$0sr4<4GpmdOXvH(}1TjA|84I5S1#d^O7tMuom%1OdmFoVZ<9T)~*L z@n^_mK~l;VQXv+zs<`Ppgc%K^5W8iZ{hZFVC#Srga<0@kq4(#L9Bk$y{zyYk<1~|z zJ9gVPs!7VrbgWOV+;+5(;Ywnc+TWs{Ojvx$oe4K%uxR-z0!LmEsdMdK`Kkh5+rn|1@R4} zg+kbbyf;atRFAKf70nmLJTFa#mS(r88U_9$9T5YwlCO$eX*)nylGO3e7br|xXzP(D z(43zIl`#xXRj^8uA5c>JmdZH~v2Ps-Ls6?4^rf~L+2DQH2+owWth6#1>DBs`36Gso z)frQl%vxco+Mv11a`7pm!&al%^6f{DHY15885P{YSc2y)w*`Fmwb=OWL19a`AVU%y zu270FgWVUPi6>fCbl_3+l8>8i_;3w8}L>(NBPc)aa zRzGKsE}1Csp*$4)tz2AOq@$D>qMb)#=~q@i+!{Pe1ADjgQtsqw&t+xxq*#zv!YR#Z zV1uJ8V?0bV)FNRU;}|WIB!nnSKhS>0#f-awPvW2BVr-=l#^7HC-%{8$lq6X?EKVD8 z=fzb#a}^qSTYc)2Hi?iqtfG}Bz{_2e6pyvQwN=Hba+N;zwp=~#uy!@*CG5#fw=(#e z(`+DUcpWH~vTn!#;{3ZZlqvSNB(0CAi{v?JE|SiK?_nx=>R?OfANr!;xH!X#IZ`KG zER$AMVlhth+RD4g(jj(JRN%I{O5X6`4b(+)v6MX0tf!P}$+peX0{Ul=T`Ne!l~xgt zp3q>vc70EXuAU^Kwf#)4v^qB%MwlDej}5D}wc&~yphk}r+1Ia7D{v~G%Mf$l6J9dT zppKUx()pb2VpmBK&P)>ZA~15u5PC{HFwb!0Na6u%f?WJMP|sC9#YQ2|dW5T!+RwVEVl+e9~@o!os+gc%>&(IPA{yWC8y1wUstk0&u8Bs<>2tzskZhB zsu75KsXKto6RpSM3Sb2DSjnQg%AtfT)gvVHP|6tjP7N|kU?DN48g5p=R)vD2)0gjG zeRI~RCj=x#o30A+Cr3V8^_mfN4rNT#F{rTKR6T*$%H_tUX|qY6&h8HPkuC~J-DKMk zr|ViRfMJe|LDw4rze9|YL44N==yyD%_VJ!^wW!O)Wma;AV;p#0$DP-fElb%0VPi55 zc|;r4={x^#5uGPFU4Db&?n_t9oW0#DuS8O%(exJ-Wq3ZjVZ}G|g_d1r*b^Qh9Y5{e z+}!k-JJBup#7w>^>8BS@d%x!|yQn~Kh_3#R%PH9PBZvClEkd8~9-T@-IH~L;rVWrq zECo|V0-WcC{-KoO4uMNrmK#zFXz>c4$?igBB*D$k7%Hif5Xarpt-D!q$xV;s=v>4j zuH{T8sILdnC+*I1N5D1Qv(`E*CH_Ol6?$=dW%oz$(vuJ;v}0&$Bd)=P6Rbe^U1+oOQx1&lM0=HhHL48f=lA^!ma_2JF zcI^do!%q|-2)}qIM*~qh?;X*kZ>`YkWqLF3hcnJ|SN8jvFq&wuZ~yu__^A)mlXAeT6bB%sPGr z{*xJ0>h={&PdmqnoZ~{)VY+uTO=7Nq9ccr0zP}Lj$nyjyB+ntD#xD3#<&n+FxT`I> zZ`18xa{b8LB5mw)6d9xGYSs^w1JZkq4(g4#uP%8Lk);OCNo%~~Dx0L%-3z;NyLP9r zPyZbE`cV&IQj4<3vSyD4s`B2dqT%}ig4R3~p@Yb8$J%}`D?g{UAW+n#5DBO)T=iBD zTIDKBs>Q0xR}3Wd$$i~Th9gC%N&@@kMG;?Wc}*gQ{9>>!ci~a*$XWQEP3vUt`kSvq z*#gH(`d$jmQ&E4JdjXC+b1o*~=MtHx#_IL@n~OLdxD96-;Ma6=pi{7uH?^L!u3Oz^ z{h%(7^a|u?L9x7A1B_0g(=l{}YlX-5E_GgO67l`Uvb^w z01;-f3JQC&p-T9GQ+=hsDXz=Xbt2u{iZ*`FqV-1K)wS03_DyAXm0~fkw#ah~r6$dL z>(^tOVV`DL6e$fKqcb?BN530sk?c%q+DFK~=m%!#*w5ojI+ofLdH>+i@sGZf9|j;U zXq{~2l81e_-Uu{Yr7z;@`T}x;ZnvVQ0S-USb~&zGYaWmg*I^b3JHNQt=096-R)!^# z+(-_82ZBH7J${QE0_mH6ZI5`hq(p7td1qk!zD!(2lmd?4SsFGbFGC-Li^3@C4QqSY ze(n_F`mY;m&~RF)!;0i_9r<9Jh?swTTpP^_WV_xY^)})<5Lef3j&`tn+#Ib)G6BtX zlqW*FrUN6T#{t`Bxz$$$`1x$xZL6{FkV~zg_+bmj>d_4l*&l)l-(^b*nj5iMp-`L{?qXSAl*_o%I^SGTE1qpi4iMg)yCs>NR^O=haxjA^{~-Z|_=qS(npF9&E)vP7LN!g^wRPeP zgL#0n=dg#f3f+S{gZHqKRSNsXY$YO)o)olx3(XbI#iwoVQ)x3in=h;nh{cj}scKO( z7E*oLidxbM9OiV*bwQ8mS3pl+uY{hj;sE^E>or^>S>eHBT@Xkt+A;{FMYW2@A{{?M zq*3(h<2;^m5QoYn+%TH1OSt_Pjw1t>uY5C17er)oF+i{@3M~YKj!oAGTucA_{SLjq zx3}~AG8t`io1ASKOzOM)O{4$$F038wTjoQ*W6$`T-A}^;?dx?uU8C(OUpBWiJ>9V1 zH$>y^=tJd0Sk`JfZ9N)W_!rXjg3!)VB2CdS2GaRRqt{g0vWn1V(u6N9md+I#qRI?| ze&c}1T5zQsdx-OqSdA8mvFb~cO)ej;R68$FAb1+(i;6yATL<>JlP_W+|GR_?5PnNS zmihig$ifTLz$NLm^-XChB|&P^8>7*%X~|i!K|0Dg94NI<{Jle3U zsu8=UDZAZ97J%1!`keJ+=#vwA+MUQ-KoUNI>J$yu)hU7xhpQ`=E5ME-SegM|tO*%} zW8poeD?lofaSJMvbGJke60@2x#BtfgC%Rv`*fXjyDdQ^?qeQz?Rli-0lymBiphPB=@C;`Utc7b}m={)@j$HWLc?)!~W+iXX}xMUOW)*yNjq$vb(?&=FO z@~f5MCUs#k?~a5aKv$^(i{WbRg(%x);w+HD(YZ?QS^lf8a=2oZtyjBW<$U!jk(9n7 zmqDYW8 zs#an;-4;zv8k)t~WlrMYWJ*j7p^cC`vr6`VB<6n7>`GXGI`i)ctX4i<6Es`>3F?Gxu-I(Or$8dbh$Ab}oV^+9W`TG1H7)p=WItCUuXi zq3KLB##uW1D=w)uEKQt-?6{zg&`HyHc++Lww-B{vQg#ycbxkJen&;Y0(iY}&-8Dng z^7ak{@>Wv`ztKQF#?Eu^>wfQ~M>y~W2z75qnFgR*;lnbxFku-bym@dBxwy(Qao zaZ=G7vqioro!?LwtkD$QkwD`7IZa0D9`t=ou1ckxsOl;tSOzCk1Lm@I58;ah`uHAHo( zn}G()&=(e^tC2$dxXLMP^c^Q?`oxJnlC}WUt_tD>@GUgHhI`(wQ+APy9|n;a+$%eW zAXFf_MtZcao4iQlzRAZ{TWur~Xn@@fjOYRG<6|A0FRVp%ucZxVaYG+$iOKa;;_f-zj2-)61$o9rFSt6s&MS5?@H&(YfoN&-S7Ln*M zE(Rn(uzS6IRQV>z{g3=>UQuS>xQkO;=^^(gywy$Kb+Fxz)Kfaff%7jEYHslvE(fLi z6CR7EP$m|^6rSv|8B?zCa_eq)h{G6jkwf}g*sU+=&v}+eq>=A84oiS?c`2tSJwBPp z0MBN?*!6xSLHjbDSx|Y95=M+4J}%CiaIPOtn&*&t&7Ow$R=A#Bt+Jj4 z35(3c5${tPBoz6gk(1TrVqFa5r`3kppWF_^kl$lVkEQC$(Qv1)Ys-FWY!wZtAF0NkN%`mB5CAWj*x z^CYM9Jgw%gp^!^Plm~?z+7f|g27G%cYbUlsK<}+x)YD6=5B%$bsOEKS9D^MKG}erv z^g4U|5GwdlbcVV>ES&~C-~4IbP>BTqFt~?$7tV2v@P=C6c5k=ARre~9zhS{)!0jf~ zJCvGQE(WO*#wneaenN1FM;tpzsWzUD`zmJM;wgLkE<^LG_*nUuBX!M|faH7NTPIv1 zN)K0DJ@%+&O_?+?A6JEWJ$G`f--m(kEwt>S8W>FPjQuD{5ICKz9A^AicquOqh zYN*C5tFH=(Gvp&L_-}^SDl+#iQ>tFSf<5jHhoY{B$`j{aIe%B5gF?9^2j;*DGwUBoo<5K@=k!T%$ z{9|T0pE?5hokELEl3F@i4k=jSnFzvmjpz7@r&OId6@@YRWM)PQ9l-oS+f{q1Y4)^A z=duyRh6#gGy^q#B3u|GGSkx78=FhP7;W}Wb+3T^w9T-hh)3%Ry*(QR`UiJq!^H}u| zY+Kl>fc)hi_n#il&ejhsXC=cPFI=P4tnO^ z3XU`xr>wZQ^VFXdrYoK+@CoFaHt#8&-tV%nUu0wDXjVjlMgYbSiY) zE=;WxHyYF!g!3<^^IYnUB`H5r7N@SW>2@WV>C9hAGEm5;1;r2<2cOL5T+mRVA=A>3 zYYBA8wTn->)M*EM3$1h_p0Dz@Yy_Q8GJ$*LMg^YzHH>D-dkpImykJ)NmzhW$P z!$tl3kzOwBR}ySoG83VsywYQvR#v5`W0%QQW}#NYSMI8pKqw1aN=6OT8{yDK*yzQ5 z>`14mtU0$<7aX%pnL8PE?8e{|aI|h+r$neB4Z^^O`aKOFxtXPs-;#~fI<~pX`d0-i z;LcPGraq=5M+++HOD0c=O-P3$!r&a2Y3No;lsmCZn(G2Q+?kkX^$}9D&?^pSD(gCa z(!kxH57g8M7uC&$noMZI)sd2F6SGqdG12EfSn;J>eRF2KSh1q#^udaz#@O~(kfQLC zL?^to-kJkFK*7G0tSQVtEZP;OCP|DEWDNrD&>qtW^Q1Kz-?VI^^K!@o9@)*_j3>rFG?~H$K0Iq9+=YAypxHgNR_`zL) z&-8Kq;8cN@*2@(DxVo_ULoWfG)<7r#N*lkk{2ZOw?P68{Pt8evxI8T(`A7fNyW#r9 zsQs(&FC9^S3B)SDcIMD@R>g{di;nXz+5;$K`Mv_l3 z{v?_lzA)r~P6X;c*ekM6ukOyPt+TlWm;aesmsDKlMlgW*@j4-vaNpc2>&XB`M@J?# zF+`1+KMJ=IOjH}>Hc|ESa#`B)h`Rq?Q9Wt96&1i^0_R&u#Z#G8?-NlbEI|Crq$)4Y z2^#@^2(_}TUyKt)ksK<935gT1s=@0x5S<^*z`>Xg`FT*SD_Jro7uLw6r(s6Bwxu#` zyron*yTXAmd8PmEVOw*LPDP->sFWi9Y2chNHv;}-RUc?ZEAW<>EHB5EuR|J_c+#&5 zAP>equQ}TQhs@RY?eCi&S}49mPFc8!;_K+)$pt-~G=mp}Up^E%G4Z7L;iKa$I00+x zIKHT*!y*;Bl_~&PSkRoX3+kx>v}0J>Elu?&V&}HuiUV)Q4OIjSKdCz4Tn?68F0{1F zG{RzWGiGrkf~0(KxPTTP==ZFowj=*|awALNCpbjSJSOb40%g1KDTK-$qJ%>rlNp^<| z-y;WYmjc-SKIsHMMB$6kp3qZ~z<7tg@zUZw*g;;HxY3KO3P~i}Xw^iFw|lY)aX&^+ zr44Eolp#xmMbSw$7C@Dblp3K$b{z=WiWq!dd?oUhW${E47l<>ri$2)m1?s=(M?=Ui z;EH|PzzZ}GV7)s|UH;};4vZMFf=D^A{_9lfL(GAe^&2U8%{Tx$fdhQC6h>U*DC6_v zsT*NR+yW8(4%_1(adhukh`4BZJt#m5O)(9as6G~sp6fXi7CbZYgaRq4~9JhIG) zH3488Cd)d1t>j9XNc&$Cx88h!m8`i_fmR|px&IN;PP%Nn@!LFZMl25F&v*`k2Tu|% zrz(c$$=tab-U4@Cxdm?B>BYHg01X+QWIe4J?##xh$t+VODFJ`qILb?OoX6DfkqD5b z5Xl;_XeSgMoiI&Xsj~;Kd^I+uV_MJu<1fV48OX}oP)x4dU?ld>#wg8Ji`jsUDObZu zp=QZ&B080Am9+xnOrMb~b))ctLd1Z;x8OmU7tOJcf8-}Rtxj(TNBiPG{M_(hJ4vSx zT*4-Ibld0VUV(}0We7oIp|{?*`I}9$;a{DYdo#HnA0auPlM7pBMK-4X-3?Gpj`tJY z9bJ0y0rwOa?RH3Mh!l($IGbzB{p^J0l>;^l9sFWtUQqbd7U8(7LrL z9DqKgqY+?8 zc#@u7q;w8;zf3~dP~i%EKq*TiVzr!30}@$fJLZnOgUpQwuW>|x=nHa#$40{2>qg6l zfThCHEo<-!4m<?blzoJ@tJMTjSahVWE}dsaFB{41 zaA#DvfEW47gJWmkm4XX<(Z`;so9>D0)tw4(X8jBByF461K!rf2(RQRTk$tj;pAmk6 z|6tQ>PJE73ceT};PCsWdzKluo>l0$n*(-FM*~E{eZQKvO%6~;rh_@_7iAIM7%I|Dz zYW@O1$)nH4&y;iBf(MeLigJ?4lMASwEli8!uj8ZTv*v~?VNiax0^WwsV}mDEdU=&p z=F(+@?%lzSf;{H11mNy=fwlmbVQAwRYkjblvCJ8-2FiB`iW zXSkW=qF1^uQNKUHH1A&FzxZ(>ObB3knlCurvJ-(dHjf5~Q7nTHflLRSg9-XT3fArh zF7(pcnO?-t!mEFfj@b4;!6FH_JX~A<-0m1}h|3kw3UiGJS>oUhNRDn<(8wp)ERNIW zm~sl~4(s^XMf25V0EO;~&B`Nn;=_#!ysf&&nNJ*s9B(#-yVWPO-UKS?m+?_wmI(JJ zREn{OR579wDarn%A##*h_^X)``(_2KeO?IaTGGew?7`5B=hnK%lu3M)S$7hX!d?+% zq+%L~i#dC}puevZyf`QL@4fo$(ZgeBQs2>UBIR%U8GQ4{PX3{z)$%=h#w{&7WS;Q6 z5*)6S;X0VMCIQ3{2{}rg=NOJ>)!~5g0JZpVdNNL;=pD;~YA^Rd< z<+U#*sB~ug>xs;`qb@h{pp=E=_t)W9wl^YY77FaNYeVU{&w6H3X z;V0%$T#4fL$we0@w3frLDS2RmnD97pNCbO=axJUITNwf2j^MabSR~^2?sp6f(y@Os}f%FjJAF;(U6axWe#$Om% z*<{CGlxN$+Jg&>iwXG7;uES;jvZvgLXFq-n8-(c2a|+E(uzG7UUc=joyJEdGjd{ZX z@gGkGoFTrPaEB}JD0JT&+cb_Je$<TcU+@OFZvA)1OMJx;O+)P4#qHk?2!mwWb@$7S2l4jP zY*EdaP-YYyh0}teUu=T+DH!dB*s8Hit3xy%3KD)Tw$}PK~9UqGvM| zBMcX;Xc6gx`8D&^5HfHZMil@*xxGyvCHjF+)$Gq}Cn(%CQo8b4t|ej1?50`k`a-Nx z@Dv$u1*uUkN=QW~v%!<06xDM5g1Mu=Q+F<5QN=#}Fza6i<GTQr`F zK8qg0$@Z<9(NeewEGfznl_49VC_486P)chyj>Cx?Gryi=X`ZXMA&J-P#*xgJAXU6Q zG@MJ!6{@MB9Pe3QK)ws*`b;;{0|CB4mlxp0p8o-Zn7w=Wc~nwH{cT@X6c(0PgNcef zXQ8v18p0?7-Ag!af^aV&Zaf%jp!`sfJ7W17IiT<{c#q9Y^Rt-ZM5#xA(|vn%=MDjC zNs2?HGMYao!X2F&N0<_fl-2o(zFjc&eqtHd=&EqAaiF6GZd1P@oM0FQ7$?)vrV&F9 zlC1pmYG4^kFmh~Pl^UB5bOSs-R^dBpUU;wmWV`fhDxf)h|DgtGxmgNhx0O!3aFN`> zQUB&{D=!j`hXzCsHTF0 z!>@D1?Mu)US0+yTMok8z&NJIvwm7+7aKGbbC40}uK=t|tu6ne8w5QUJqQvLZRsBdo zPP~Mxb?9}h18`&Pkj@uAH(06HHe(qp#2sqR$O_Z+v9(wJf`2V7MjsAFZ;($E3J52# zcRh{V?43b-kE&qVDJ`VR>|w>oq(B#aQ;Zh~?0Q<6k&uEJ!<1@QU_!;qC>jV*J?o?` z#ZA4rth?3q!(-|*O^p0~85X5Y2>z5;?^oF+(wHPS_oYrOZ9DLX(C@mg!2oI%d~8Ml zGQt(Jc4uW~065EO+md5J4MSukj~`XigaijlCXnU=kWvk*7HF#f6j4Xdq!#PjV#XqU zq$=C(3nsoAV6rlAgrc^pFm(w79t`}bUmsZd3umzj%q&OsOpY-WrHmF-KYf?!mdv^! z0w0emYS~I(4(*gub`rzr94PRE1h7A&Vy@-jA4=;|LMl=${C{qE}P^Ne=S z;%|e30$xr{>}ncHw(0DVicT{MaBu$ zH)DgdtSU-a(iJeCT$8HZ%C}x)VMhH|G5)lahHe~{b0w1>B`YqTi!IV)B}IUKZ%ijv z!;Il+GI6Wk+I+lmO^sIgHtjV>os?7xlzu|uj;!0G#~t~HRP^iJEqgLGUFvT6+G`dv zIEMPS@ScaV)f+zN)FA*AdjWACs1kQj(=?iC&hiJNzH64~a6m&pQ+gp$1YPKf?A9VC z4Rmq)dCG}-DCBwjjp$M6FxI07*HJpqt*#{b+b8Re-7FxP)ITu0-waRkCI3B*Gtk}c z-&iNX02)buKC1;Q)PHg&?5x8xC~o~F9e1{!DJ6^I!AAeN=8@*IDqU~UzPL4VDd9Dp z1;|$F6R)*xgLktAd@`p>*QN5*j`od@xo+}g%GBi>_uN|1k=!#>Q{0MH044hck~MDH z!8xo+RHT34bhs+mML}nqy;(Gyp!P(tIEwKDW}3uQ=xWke$ZK-{W@r8Va}oWNF9J3) z5?*2_h?NTRf)qAXME#2KY%OqQt)3+Du3p(FWGjhymsjW(N>#KzG?=<(To&J3hR7+k zD`;xp8rsrB=8KWmsyIs?iNHP}j%5{$UC$0SlS*JRh$JkKnK^Ram222`Y<7Pn(Sb6g zvkJMAk-AUPJloiR0MiyYWvTW#%qD&j!_M0R31tbgQsg~IU2iePO~4ehqlZ;2rXyY$ z0ZVw*4$Yv!2j!`RG2QcT3zr&Q89GWY6=K8^G;Cu+%cWe;2-|XDMxGMLzKn+}xacO^ zV@bNr_EDV-%aQ!dz;u83g(+rkNMF<8(0u-5G(`F};TYRtB~1NZ1E`{Hx!~x?9)<@8 zf=Uw@PQJNzpkN5*jvIwdYGOM2vfpyI9<2SJ)GU@ZlGkoa``5jo<{< zy|CtxLNT^lN(KtLO#Iz=+t}5;&ASsPwly@N zH?eazG%`0aviippGN!jNa{FJP5aWM+Lf_ z6bZf)LFN2pNmPE&_<#dFdEU0SjShP>R@o~B(TXJK60(LZAe0v{rQW77a|fEkgrnph zQ0Po(kaM6%4$HI9ne?8$7d&gd7x00cu0?9x$F}1pH7hF?e&XZ~m@IWSO2j zK>ppjD+ADU&l$G>#41`87*C~SI8#`&mTyCv38~Y;Z7!>(Qf@%=k(J(?=>wAj2;pa?~!*&~F3dJ#*x~ zuw7xKJbXvoC_IRR;$e~w44)zvVA&6ZBM^J6EB~TKEM@0sMP`l zJ7N+mWx#{qxQD1&CZWM4ZERY~Y&G+p&XJ#TLp-*F623*cI@dr-tGIu_Q=Et|^jKjD zL4_@DM`Bi#oJw`lz#0rj`@&lhx*Q5Z$rT8yOGnsG0@rH-95u>T-~AKoAh zcxvhx6O313HFe})z2Bx?KAE)tx0JjCRfl_!s^GvHcHEHIt@QC`vmC09FmX~W8u2LUN42R0`J>MZi|-;(y?n4 za`tUi{VpC^Shu|KsvZdjwMajU~rPL;G3M>UnmUoKQ=Y*!How3=t=q60p1o z^mxoFUw;2JQTkGmteI`Kp$|Y}^VSy8SAGH)K}&ijy`L*gNY7=CU}1Qj*LBA?WdXuj zi5Q+MtK+o9Fn{P{2QRoY!`U0}n9VGkhhb(RZ1&5>Yvk1)1+co$+&oQEB*}&jSrjGy zLrNjHo{iwk6z>$ihY9JH$oX+rDco)LaiMoizaK@+8 zH4cO!Y8rQ2L_H3(`k( zk;xLgyvB!GXq(5#d5`*tN``)b&f^SeHKaC%UDjs8NL#(Iy~XbZ5fd2^&Qe z!jO!nLD2WAh*k{2idy}=Hcn|p9gu@m4IcYk1C?9*08`G^bfu zk}+D)Ja=3VL)b|tL#a3bHAuw{M(VnI0Sk6ocp2FbAOpiN@njR&f9Dm6M)TnH?!wU4 z-F+RZU7>>iQ7sTo2nW7w1NZXeA-2}gJ!*Oftj44-q)(KpU-dA5=f#xqHIu{K{^>2K z_&0eD$7g0VF;Xw&)b0H*OAj|TteicpIfSiq0e9!*gZU=UwxRRDnR$EEa4iD(-^-&X zHwWp+F4DC6wT@6OYULcP^boT_Mw(93o;+l`TW0Y(L{4%t0Jxj<=Vu~KMKZS`Jhpyp zas7A&-0{up6KN)SGeG%jt%J`R;MZM57Ys-7i5f4{Iy+AB@=w< z)G{^+e64TI7Tyl1mMd=_H|y4zRqJ6K;}$$QGP6RfYHcUxPB`DO52xp=(RtfJrIupv zY(t^RYTukd_U=j=FX26yuqj8F0M|_HnM~Py1CpgrwA4&QPk^PmD*p zim24Qz&cq}^!h&=P2UUI2ZbYySqWru1S^07z;jtG-d&-c%t7c!{iI{eo)0YEX8NYo zC5|jsG=W4=Iu-=3AUC{{a2hq@b%6_{pqD(Vt%UGsRpLjvb2x5)*w`o9VOBuLf&TJWC2=)^xMJZ|mU)qN#Pg1keg&t0h-zKk> z(XDO8v9w}mCk*Pr{(f3G1#@;3kgNboMRsEPc>uO&bmvu~XJQwhsDl%!$`aeR#_i#c zvw7yz>&Kr`RXMtU*}uJiExrxjUEF*bG8OUV)`sxG)rOps4|X0pw%K!I>SXO^N6$&pECj0}%r90bEg_j{O3G4hIJ@tdGjt16jD zcVa;eZDL%3NPZ6;Sk!`uT;d&uA-8sx(*Die=$DIy$ysa$WXhMI(Scayg9gCi+8Ey? zW!cCF85BU9LkK{U$W@X0;4zUNc?73c=S;cK7u#Jv6f9G$dkwvg7`c)}={m5%BQlrC zHeDzlKK&39`YCCu;I99bllp6B8;hVp@0~HFdznvMGB)?&FGAQ68%9(K`n2Kn0iGvg z@<3Rn=PQ0Ow>uQI0zR5P+V?6SF?7MRd zv<<2UG^k})4)ScQwK)y6Cwi&6OW&zVSNetqb6zO$$CwrQ)<4~)RdDZwj%VHzfPVF~ z?KN=bqpuq7ElS;awVd1p%eG;qX_ET_j#?Fhn~HY=t`7)=e2tXb@TqE4+sptw=Pdy8 zTSKtPm{Dhux*)@Q`>L6>VJqtXxZ7Irv#Yg4)f0`ibfIUjv7-92R;1gi;1%#W9n(U| z{}Qx3TJ)0HL{im0lXFS~HZYH0H(?Y9e)3s)#55eKBYnw;$zMVmVfiR#ChOQ-3$v_E z#OtG6@M5YcZ&Gv!>U7FKp9ymh(&K|a(ei98x=6CvpQK9Cc9a8m5j_2%{F%BE?U-yo zDa^8iDa@S;=B=dOaAB@Y87(QLuHd532tbOz9)PbB8@&K*y`v~;W)aHXoxKD^9&i&du& zgiRl-8TAipZ$|={K_+Ekiu0m|gh?oc&RH%)#sJP{BGc-emgF=?k&6DO9-wHE+Db~l zo(Fxju1%vyeB-zqZb4UVUo*sgY>~pO-h}aotwFsayJYX;KscQfUtg()1`wlzidQzU z3wwkWxS2CJk=uzsbN;qy<6b}0B|nEs87JZcW@H4qw@}Y2!_SYG?Z`56W$6gPc(;J{ z^w<@?P@s&TneL1)b&q4Z%k@1MX-NEqq*dWM{^c=7+`#=bmLn%0F z7bD8e!O$cbO1O%quSFQw0l91p&1tr5ap!i(hLGB(wRg?>QHO@=a+03(nU+dV+q2W) zI?j>onH3qqi9%`(Mb17J1(rmt_|4L!vMWIyRMX%5_%uET{DMmis({5``Wkl8g!m*uXIyvZ-6VT z_z1I&NBfaI!#qOT>~(h+2>~6IKfIPNk=4&jq0+R^PiZ|Arz9?VS&y^^!GG_{QvY~X zNexch9*~~XHlmf4N*8?4KCo7Ai?@d0zifGmz1EnZK6uO$m5w8_Y2=WVpF7z4xdU+8 zk0&l`>KtIyp0C@rnlRbL;^Eys{(}F%EthZAki{SY0Dx#O007DVr{%IWF=YHNzSY9U zXj;eGag(j(XD9s!+{T5irL=`c;Z~+aNh3vRH*+LsZN23cTUZc@9i{(axaHyUmJ>h^ zKrzoeep}=EZ)OO|Okm*S0}cYn&hPcX!RKwy@6CL;_6PCLc;9X<-Zs;0ebjph$WVm2 zK26tHI1UyTI}JktEbEQe1?E#keeH;MmlJNJFx+DT7+wKEO94mTNUu4XgmumF(wsB>Er+tWho)S~DQ<@25X!n;WMRKC6%YKp5zsL*&S! zA8wnhIfw+$nPSt~=+kH;YnXEDt4w^3xydI$Oc-VBCH?trx_R^%Qd7?)-Y>u z7MN%=@(m6=77#(&mTg6P$&5STlLlw$*?q!IhS|0{`aE+}r9;a3By`(Ul;T=*ejWf5 zej_;$f?|?ahQzr zdPqS8qlUU5@YsJzH9LK}*i->E9?^meZWSm2hSr#)wq<8IrbU6U7^frUuEGsn>G(aj z9S^7R0yXOiEQsFEtF3Bv{MXpSF{cj92Ll-XxnQ4Vw=#4Ndg1Fs)qU)>Q?YK@-)eKm z7cSPG$lqJ20Uj~pQ2CpqU!^X-uNGLJ{~}#+(Wq0u`Va{46CbjV!V27dvi{EIuF`2C zp`(rmz`^Xw0omDPC*+c>m^c#Ww*>lX-}orU|H5y5hJ(hmvhDn4y7PH{&Em%XwODvb zjjJNXcl&J}E*;$*<%{ygaE+`~{;W8GJ^Yzm9^GueKM9?j+zhRh6MZ%0!g}r89v8Va z^l%SH1C(=2vOrEvjg+&Exb9jPj{iM8CJnSNlEM&OS}ew0-zP1cgm%OG-Ddui7thXT zLhwr{;7Q(bk6_!HcN)MvSzjL;c)%Z(!{>FqmpRF5xUz$2{P$V;>ptd|qH+aaI(dO9E|qECW?_5Zb3nF|LzU2yY77A-~Ma2y{EH%sVG~Tjr%R-@3-seh!*>R zZ_PX3Z zWayuCSNIL7Wecf!)Pk5>MTon!!nq^dDDS;IKn*Us4ElZ&N{7g4qnLXwU%D+~LkVi? zla4FSdP{tfKWNt&rR??q*>HIZ`(oUn5b$@008c{o*+uafLP`at@{8>bqevu~EP?KV z|BRT9r1*iXU&*N*_^|<5a2QfhV}Hy{uw|L;dW`}^6~?Xyw~wz4ZJs&``^B42ttX-_ zF`O~zh1yU8@4RpbdKdZKc?0nyAQE@(g}2m6#LHJnU@+T=$%3nb=k|Cz9EQq@zd1#4 zhx}dX9;1rVxe@ge!!Y3E8VJ4**C2rg@fDT`0O2gKL_xeIqZvgIU1r*9sxSg*K+cjj z`oc=rvX+qB7XFNY*G>AhiF``f@X5ho1vYw!EkG4GGd`FNv{CYB`OTBWv#pI3c;kIG zWZLi?ImC#=QSQOIfuE$Xl5E%}Z4%m*F$jN3QDAGK3W3Z5!6C4!Y)b*D;)kwfo~2{9 zG#-E-FmB&f%G% z6RG_(A4zAW!cD!D#64w|h0%t7#E1yfcU_Cz@VBU`Uj61u_-SlAx8E*=B}~y}FRzyT zTwwv%Jb*M~9D-GXR)u6rn(gc|M_rFmJl`~0X`a9+AAWX*QLrWpeSEK2J}*+T zb1PkLCnrgf2)>MEjSH`dX!}F9qdD=}_g;`8_$zE85#>I_1~xM&lRe?C2>Xo1{cM6i z=kNUw@)K|fsr_O`yVg#PQh+PjUv;p44VQzW?5uE zo++X#CPhU<@tO{4o%XyaM8zaEPFRXmPrb%xU*@vzWdU=qeKW;wwMvMJpjR+ud)$|Z zipcpfj)7ch3dO1f-5gqdzc07Qjb=T}36fsGU+mq&zfrj2*yb9xzdwd9p1>ltTDhQz z_i;3iYlul9?%f&KSLfe2*=JE&bPP;3P34A4iAO7kQX`o~wM&FaGggjnhnPw3|@p7 z{>eq~c;%Snww_`&eK~-jb?p#g#M~ZKWw)5N`0va=sHgLJj3}er?7<1dGB7b6Num4{ z9YAK`B$R~Qc@^sEk2By3>LDTPn08KqGZfPe?zsLz=K=_1jGgu|@JwyqgfNw|;bDtZ zsk!Knk?0glcYGe(Hx!;X(itXi`v=RvlSR8iOMAFn*}4AbLZdt}7}CeG71hb*S>Oze znIJA6)$G|(Tq8VWnGDilt;1iqR8el7SDYlS+L?g+Ju$?QF@uRpf(ncad|qQL7DvLs z>p8cjk0OLAEaw;jID3sF#!NXmX7C??o(^tz>ky%WYR&^)K7vjN0D$GfAu$Wbue&FSmY(8 z`|GiHyCgw*Ux*~d%93S9* za|MH;5hfn4+=}+%RT)48B*YfA?eHcqsU+xqs*rC*)6LIb%QC~kXApD&ApI5BH9Vt> zUQfBsFDX2+5Td4}Ke+PvJp)?+XrKTtJUqyp?-LjZ_n8Ku;rO9y@-fI@j>C80lTZ)W_Hs;hwFW!}t~< z7(V-J(S}QH`+5on&t1!umCSE0f)6#$CgV%?G+T;Cs);Jn=7r*idUb;%0;+(qi&-*SXow2Vj zHFb?heTECV>P+dn(wv>RL7~6Ig;;l`bzg7JN#3T^UHOC1aJ%u;V8uh*sRUE*N?^R( zY$EO<>0H|8eaqk0V>N$W`;2o==OocK&W{@w2T75|@ZrI2-_6`MC(5(HoIzjFix*a- zxACCHQ}|x+ap^zyQB3Q*oS6Qf1BiM(&1W^9%=dz}PGNnldCD<`j^<2 z5!qRDJm2=uFUr*gfAz^*n;_v?!vR~xVDpUOH!Pd`YKZ{it++mROIV~CaNojF*+A$y zj})P#J$*EzI-m?3)>swu0(*UpvvMSb=tl9@SLc#?3%V!aa0-KAnvw)>yA4PxXdX2p zC`g9Laee%f5fuG=GfClS`(foecv)&hoBUD<;hb)!X+x$p@bk3xO2I!eW;JLY86ssk zsUO4K1wiiJ@CzE19zz%HjXL2bfPeTN0eTEkk<# zNOlixL4AI@ilI`d)k{|}uT+qeyDLL7{YVb?Z^1Nux|&glE@R^4u*QtfS>>!iR5<}H zr6pcyhjY5D%P~lPwelJ&De7afd3!PzE!v zC6%==EY*>|uM#kEGo^K3iO#WS9Bu?l-cN5n(qQ)(8Ah4KQVua&DKXnVqeNGNEo0(t zY=IG%OG`UA`}esiO{XVp9&p2ns--+8yoSS*A}DK?ocNA;<`nhkxe0Ns*5iDS5hQ9n zuBxa4do8>Qa_ahn{J{x3tk#Qsj}|0qI>xG~a{ElWd^4Iq&P!B>7d6!ii_B?UnjHXd^y;rv#kU^^No&6CJBFI|G+neb4<@uWdWW1(KClOJ0~E3)=|zK|0?HA) zKG&R!7v!Hxj|tpGhyjHOFqMfl2DYmKD6v1l8@45>Fjavy4!2>e8u*Uw9dNy_Q{%Li z*c0NSD&p7NT!~45{|OfGx#(i!aK_uPAW>agnRo}0Qht?SO%$V#wX{N*sHjPY3H_wu zDT+yP4j-)gV3VhWJv2Jd#hN(r!uc8IGsbBXLq$D=I?%%hH5JF3K#qLFZ>6XhEB(EO zJGBIus0rW2Tck3L#o<8IQ+Kz`oobp2AFZ-@r}A;a>NeX@qo*b#JCrfN4=PvTqAro5 zc5y*R{P#W%Sg?|UUF2_CVo;6a|4HdJ(%U*wled!UwkoMO5j4IcWd6}`3QjaNE@_Y%>hNI2> z`WTijj(id|sYe|MGTt*ySGX1q(keONf|xJOaj0^bpxfY4asDl~U}T8B&p7+GQ))l2ROX;D<$x8E#5M0aFs59uFjn$I3qS@?sfN3R_k7iN{QT(uRc- zK^j|C)``bLzq?A?CKS%$1S6uC%$39{OM~9)i>QlJpiD`My}g}c?1U~)OYq3jQF`f- zfiN>An3}jy^bqtssc(6!xBSlp)B4sk-frE&v49n{aKWiDXxcy-kW1 z0{4otIv}&|@R%)r83J`>VhC+e0lb`c;~+nIEW);O(Y^Ke zgsJeab+1!md)*?`o=*B%PY}HGkPE>>tcV?JBMVup5@E1>zUO5&@`GH~}Qn?98h*TauX{~^S{PgSTu^L(-#?FhkH5%QPDwOM!0RM<0HH_R| zfQe?f3B}-qPf4Hydd%G6o%{N657;8Y;Dl3H`}}yIshSz9T9xv_0-z0qokd8!ks9>@ z@}N^fVEVbTn5AN=swAsJBC}QvO?DL`rS-5Nl-AyFr&o%W2Qc0c&oe2yR>v_Q^nvjY&t(Y@qCZ_=ob*%T)H^P@Ln6QTJs(+71v@G z>n1-liq~SjX9dlj$Pd*GR?egMRWjW%R)3aOUB+O;!#WCt78MnRBgWuI_i|+_*E`_I zeysSfKDcuaMOWJpJGw*l$8h6xMM!ZGU>YUhU;Hyv0u8+a7h#lh_|}kN?=)$V{RhHw zPlCw@)M+@lGEB=}$vai}2c9CY!zpEiYTtH#<18}0bdx0TVT{k6O~IMM;ls&%OxW;d zk(F=Ye$=L*Q2;UU-<1`|)YvlLPr5_Z*iIjT#&N%j#C&4>RUz<%{lKkB%m~#Puofus z&*}LT^8%-@7e?=rP<;l%h6%>B&f__WWQ@k>L(qHzK>3J*ZzrXqX~C0hByw>;_P|m2 zw!}VZN@(my&~zsl!j<6exH}<$jMK7``(p*`%VV{OJcr}5@%M;2h-EPkz$^Dlf%DeF z@Ok{}Nja-y?tpb%f zhQj~JvF@P4H+G?u4IhISn5<%E47E2)m`M5pVY&40-k;m&#K4$e2&|Kw0%NJ=T%q{a z>TM1MqR>~%xNhBFCv&V8bN@;4mJhu*r@2;7bz#ZWn(ZlM4l_xHHNTZZ&gnSOp3G{v z)!`(tpv|<)C&O=rnl}U|uRH(fXH0yhx38N=6Lx<= zS57lfM9Ms6K>T z^`yO&-cz&$reVT#hEyEWhGbal*Ma1sI-9aUmx%%x!n4M``L4B>#a%uHRALsuGtm@s3V2&6cLM#!(d2`vZ|8tJf4D}g@e8V z)Eiw+WLm59iJ`04o}*_T6jKYgm)o}wH0#Nx>YJLj ze!ys@Rl^|_4P-wUI!hYPD)Kb8ZZBExT);{~9pkg4i2fYbBsqc#m43%e_A_mf1NZ{1wtO7VLPbV2Ur9}1QxxUgOe!0Hq&8{AE_ z^31|(DUSy0)ZYF|V$6#h{c8Z*R`qH66k*&iF3OJ|i+8IQ`^vLiWw__j% z@#Zbmt{$@^@la1Ah|2ebViW;O-m=kZlWzY35AtCZ`Cp3-YIUEVmKLw;KGr5egjr`o(%w{9DZqq>;DBwGcv*+`>XLFISdXOGU z8&zi5o$-md-&@>?I#$Hp*L&&nlpyDwnq3GjL|>xRStFdAX-~x(>^}M7d%k4!8D@{& zwe8uo8fLdg;0saMdM!ykN|L-UJ=M(&z?x2Os8P2d*feuz&u$X@EritlJ|%Fl3&*0s z799i!RHI%ejk9a_tWDEBA#eE@%+-T_w$LeBqQl#W*7io`|zOh#E0pYr=o@` zUb^E$K2`(GjyV2Q|ES}8D@Rs5qpHV~k$-c$SB9)g!PqL^1}3}&#xuvz55Oh1Hkfa7 zFYu3Ji>f1_w&h-6O!^`NwrH$ms`?(`N;dq6sx7g^YC=BM=4MHFVnPae=#o+tWSZS| z)K@guAx7hBD(W!hd3dYkTnycjLUmkq?0S4Kf4zY0=huM*f)E7P{sCG?QfxN{1VC=>pHf%?7j49CVX)6ubpc zaUDaHYL2#{>}xhg=d3IOp$;1BsF@@Y96Abs8Js&W00%s zW|K{fU>=Q()7GM8AB?0^5B^`XK|yV zW7oK|b$N#VIbVr&X}{V68xGEB&JWdtUhZ0TArQvlqa^2ISyDB`^Vej&jC(R6|L0i+ z5hxGeNrnBMpX>%%saJiMJv06vzTPRe7w3)ku5H`4ZQJ_Rwr$()Zo6ySw%c9Xwr#z? z|9P*@%}FMiOy+K8k|*=5&&nD@0Ma;jnKOMiwNih*BvWioCa(Xlv89yw*Tp}!9qC9L zglQQxv9$^ai2JtnE`@pwmO0Ay+( zG!;kta$y{kZM68=MOw29X=@_xcbN~MH@N_yGXfwgbgf9@4Ycro*J&`f2ra=Q;^kn9 zF{2KAYF15yDN%$5^gm-66R+A$XJ1|GE;qhfTsW-9qPGs+P|1B&L+w4ffo=vizw3&y zl`u^y1LQ{+yv+_oVSJndACx^T<^&H%y=o1E;tFN z+9BuxsnU2;qutW$h%MPHmLCgy)%-Hnqu=*wJMqpse=ZiGzp2&4tq>ytF8+DM;I^=N43ag+IN z?x7HH?mqCaI=ie@B*-Sgd}D&g|z#>^jaKJ`a`YKl3wFaD(H ze(+BSv(6vb#r9zRAK7>AX-><*u=|la5=v*w_CCm~uI?Y__y-)q55LEYNjQYAJi+ge z`@6fg8|7D*zS${Z3j3^stJgSyXd`F3ao@!JS(8+P1z*a%ar2wI)lz5?58rseH8<8X`jpk#SdjQY^StrtOaX9n z-RX%i2O!V1pf%$CR^J5{hewBoVb95wdGW4 zOpGAY%1}<26-O41W=7FH?17qbiQRLqMs1l)`Fyf?eLSe<(e8z6MlDmY(QmoOk^}n# zNj=rd?qrFn>;x$-PHmL9xbS}6Ef!&__aB*UVZ&G#ljzZ&eBZ|BCM^|1a8!O#8WRyXIzCpIvf^LBS3ex(AF#K5lYv{a6( zAnbvnLz)#G7$+&arG7ID%Z9yfsFHpd*$Mhd<59UZFgEkp*dP~N$w(2wW1hQbNSu0= zQN|_$r9sQbOH>r)L<94jaE-k?BGZ-GyRW2jsQ~QVPKEYjVS7IXy}_`f)tpaqh&rNE z8N90lZ{JVEmcqf01FxL5z9AW0dJLDx$>#$*NyjTlSF|WTa;+Ul+wp)Cvd>?Slc$F* zHi|G*E8`9@0^}9|TAbwbu(<1j7`t0D&Qc`7XI0uQx*124KAhTJHhL>uGus|@HnpV` z)m?p<5Fe4XaE^4gHUl)?t$wB9nAzaPzr&!++HVUywAMum+O(l!%Ow?|DG}`$qd4F7Am5n+99s zf63RYFES184ma(y>GBe!{VLBzGaDpXOwiwBDv*K&I*vnqLTQ%0Hkhamt3hnnthx9P zH(!$J^^tchs)$sXlGyo+%H~){q_V%EKL*)ZjpyoR%0yjTD2NLg15N4*ULIt_G-c!=?DuM&xuun!a^@UsxXKh^U<_gB&_+6b&qir$37fA=fMuZ}+6#llE^tzS7NTNUO04zP@hE*_+!#g@n9r)p5XPIX0{2 z2j%5+kaK^6$>M}*3*57kuN(p0PSRLHTD3vc3fb8b3nV3B)}DjEC|0h`{HPSQMP|IL zP{r-ye$T|zx$2)yfA&cGMz!0a=61((9P4VQyL5Au1J;j;r!78()ZSi3G82GI_qkmP z$$~XRT$`>yn8pL|p@#tLEc!5`F3VlXr{ED2SD%GosKtlZ9vNSD*&a%^eJfo{-7zE@ zFxBv@OU^gB>n*j%Yo0@gU>JqE#rb&y`=CxHmG#W$i&hCcg+m!#b%-F9#)%8v?9&A; z!&iYn6VyUk=3dhbSy`#RB?ZyOknbuzCnd+lf{e7+OOZP`^SomvddVGQjyWF#NyzGS zLAU0rcgbXAvqw0mU?aFG`Io7Rch+gad%qa60wU$E(bv7pq#yk^S9R=)*`{hbnJCu` z`_39F6>3+v3I;qO6>6D@R|+;P`xR=HRPN=fatW2}58vD8DXJARe#QY2A4knq+66>w zIT8YrRlNdxH=A8aKRnewh0KMGy{U~cWp5GHIUDZt5_X+8q`Km=YU|01s~7>REo+_? zBY9O5(`0_NGK49THp?OCvFFDJI-?A&-Q1qmDAj)8OEZ1nnIix#x&!0fvZEW7W&9`X zpsdrS7 zxRkllrz5YQ^gCuPS{Nss9W#?#6D9R`#^Ys<*}%@ZlyNF<8|Vq?9?Wf` zI^o0`f}MJb_17NEHT7MZ4NiOiCa;#@*cAXjSF3Px^ERVq>7ER~z}^GE^C*pV9BW%x z*6Ajs8eezI$oJ=4Zc?9`?R%;h`3+Df05WDuX@z~-> zK6~Z2_yu)1c}eQ2N+)zOcQ58<)qJq=HR08soFMa<@z3v^w;r`^6m2A@r4;-r1WFt( zf)Q%!GNUfKir)f*sS{BzP*Ml_dFUHGJTm0{B|p43`2F7f0b$SmzT@$7z9aLxzaOD! zv0pg&k-D5h z!#f)tQ`|u_wrD#L%|jc*rpQp~$~{ZbZJG4-c5@x1K`1*zVU?SEO7|WlkE1_(iSY*P za9jZ5tItqZb!EImrbsC0--sBHNAXKl<(u_In%#Irc=dM(%?-f5Zv9`@_b)-W>?Kdm zlqS1P7LS+elKe_FPI_w75oz{R3=1P;?Q2);k>AF+fFi&^_95uMgvwt=Bk+jhAw9=- z1C6h)pyESy)ymZGBc1fLiC1y=iAo-uT0#O#bo^7V2jEfVM;;puy+*5qI8_b$MjXd< zHnYL5?mW4-_SY0~?rHN?X>GX_D-BM(Nv2SU#4$?fGvLO?QVsNy6zLAF(h+vK(dNI^ zZ)$ADhQ_6y5{LX>fmTPF{_7j!lHX6QCpA(HV zjNChA-KbWi-pRQc8FEjWGpfoQ>taiF*4BaU=~ihl)=~?{$tCDZ+0K9OoUyAA$;6-1 zrY3#=HTfwIx2{}kJQ%l$7}n9B5LoJVIrmC`WEcb!MIjo)aY?x2gpX~*oz$d8 zdey`iShKJ!JK^pQwr!YV{duIR0U}@Zqi3q2)i2~Z>ifB^l+v&9pSgIVk^f;)?L+X_ zNB^}*#xQeYqDJ)B|7l_T2+}iWI*yq5^=DoFv+FNQd3hCQqzDib$O&n1BLGZoKRR;f1(IM*uZVb|NZAMJ3)|~)N(H$pKRTEA*TJ- zhGOF36VV~?c**cctIRgN)>&cvJa~E1bujjxc>7rO8LRVE9nxczEaT^uW}2K}SJbS3 zmX@6oKr8o81Rdn&)QszMh|I0Vg~hDtiWOBvP5C7#Civ9?5+-r+F?;p4@AFP2c5N^@ zRJwPeL76&;?1Np0y-MZC)@gj%zjn&ZYN+@h+2UofAspLaa#iXi z`L0^?zvN02Vw+k2G}`#YKcC&L(!E*E#;i!+c@r_IHkGTg8kbR}3WkBW#@e$3VEL_9 zti=<}c1yJBwp3zt*hCGq@;c#2k`g(b#POX7H61sd>@Nr7B2#*(k`k}dPESv*k)+YZ z5Rt?wAMP~aY%7w(2}|1C$`98c!IQ{mS|k%_<6$<7zO&nRaSi>38_ofKhT7KVbm;%Q zdrVQ|H=@vFT5FwE(z#`0LfoGwG!c^lSuWteZN(KDbYA6`(mpACI`OnSll*JnH%^VS z%VifU&qcMO6J}YDFjp9Pk2L!C&V-)KMSxz!pEPxHhd+9ag?|;^>#F}W(b!Ds)2*?k zVC{FSg@BX1pGIiT<_Y+}O#ik|r-=_mU6MwuX#4yeyd5^^Q|_iK{%bsN&XWD^BWY>& z`jL64wl@qZ)jY9}{@A!M%zJ43pbe8Ahf_wTBQv^>Y0J5Me4AOHU3C6XD-2K}Z9Bn}r1T{ag?Ob2oAqp3=n zEkIgJ=!a4@#_5`GH|BYgpHf=8Ut){rrxL>=^q)a8d45AkOvq2YIK&*BzLY&dpyoc0 zNi;eTqUtY_)6}6Lu&3qLHZ}JMlk%!}AolC$Muw$eowwNE2X-jgyGGUzK- zO$}X3S1GB79_GjWs*0fh!_oXVJ zjQgU)D{s?hd)-k+Z54@!LDRI&iN%~L40NH~%iq*bnZRMAe?Z}r4$_;?z$@#h4i=hw z83+6tJ5{}&yKYrO3y7oVgd3-ps2mW)Scvqq4ly;N!2ba9AN0dYJ|X&{nLiW44`tdM;r|Pr}T!d6-_xg#5Pe zQ~6q0FmGd?pw-4Bp>D+%?UR8juA0~<1Sr#V?q`pOQ+6PmtwqxMsrHWRjh!+w6l=F0_0YMGC8G6-$XW{2T$yVp=l$deJY##cT z^~bjVR9!cYNs(+DdFnFf&KC+_$E8V6Lh;EQ%zbUPpS9h`&R`96o1*1kOIB5%#icW; zulhZEY#WY-i6tYI$`1KmORJ{cC{6%R!&6fL=6PUkkEHK^ymUI={cn8Z3qBv+1ULMt z#V{!$PDGMHNVN64>|^w&tf>3I;_FYAZ)McOKj($!qmuSdB8Ea#f3c{7M3iIV71R?3 zk2qD1xaqc8AAt>YE1!g{mnE$$eaO_Rv)vR1U=~TF3aMfm1|~laRy5~ui-sE)gk8K( zHz&{47?$Vo^|)|{u_SG7Eah$+CHt)wis&yKdFpdJ`p<1Tur?DMxbaDQT>P{K*#( zrr%{HJ~Ym#-iN9<1$%u5s5PoiEE8yTltn?47`vyg!FWMK(#BYs2C#b0)-!Zgb7zaE zmbWitT-GDFio|Te%WNmw07Su_9H&_Nohl>96fveGE{2Vr7zH>wNoQ9XP5jFlNxaIE zb{GSU&N#NE;$0l=FOkwWlaOWDW|}#&BcYFWka7hyo9|Vghu4L~r#-u|*|4~I)3sOH zP1Xs;$7tE{PQ$7tW)_Fkz~ta296Z}PmA&qJGdRdJ0cx=RRU1303=Z!QM+7oA<{f|a zSnlO)tQ#+`wcnG{@FK%t|!9QlO|^t`mG8#iv))SL9CYZ^c-aOLRM+)9ieliP z8Kw5WVl*%_nyi>vl!g7>)2gu|8*tT1S)6r`mnAyo(|73JK~D;kkLZ4j_22*u7Ud3v zOu|HoO*rdtOsnT8^#N`QbFDP@&?c$UEVY920*)w(FpILPAtPD-jEjEpGzHdPI!JFJ zS0F9A8vQmm!@oNgMF$ZUCES3Z%(z+y`3|vAn+`JO8FU&AbWrAvTSJ=MP&qKzW1w^aFJnudK$iNtJ%j~2`vaSI;(ca@o_O(|WU%U;;h5*y zqBuWY7Tthu66An0R1xK}4)(C3at0^EsfDl7(g|>qF~y324^(#~&XMgjazo#q*C|Bv0$hr(MyV!bGU!3C>3BW)#_ zFfHt_FtE9Hr%=XYKUNlP0bqn{@XATd#|rfQ-E&&S7}S zqI$?;a27%1E{MTH6_1}VvsYg}-UAm(bI0ILl4IxY({F^4dkd)sztQI@!3jo6+_$Nq zvTFm6I>Jzrc!d)yp}9U2C&{#Cp=a?Lw)ro*+A70Kou{&k_#i4#t}@-Df{%37z*pTY_keHJK$oET=|5x1 zS6XB_Rwv9jkz5XdxY~;fWy&_%R=qotZ%=NKQMwg_5l;ZkVaEhfttO()){e`rBqtC zq+Yv{W@#WLijRjFv2j^1QCr8^LZAdwjz%HhTMCof;<3|xh{VMYh)v*+L z6;5RZ?RX(&sN1J)SnboZS#O|U*=w>vG2u0y) z@E0dUhkE;ay4!g$(Xp~J66pnpjRkFZY!%wC8{bwj4JjGZq`KBLnBRqxjyRm z9zQi62?P%Y9k}MT5f#YX&9#m5(WE!IBm`g6QEJsqvHYT2hq@(SYJ8DK$CTuOxslKh zxLUNcti?oQIMbS*qPXvAJos!oUkbjqPL(#^n>j~DiLyi^=ETqSU#Go9%^t2^%C!nR zV}WYU_2OdmIRS4O-c9DB%qszBS@pFJYa|RgdIHzR_}HUvIsz;ibVL-{wCoZLS(!@b zXZCx{&rTXbd_JT&L=w)oq)kageI_N00!4%mV}4@%t3TbcM;FiRi3MpwI?px1&bJho z?P=-z@P=K4>i;=AlQF&XJt%LbF<;ZSHScUl7Y_2;w%F5ibFx)pbIjH)y>Mh0{5T8# z?eV1N%2;J?aI{v}wD@Ez?k;U3tG0a^?wNvkO(CkS`CdHp_5%zW&7=~v>CFo(x3 z(Q4{0!|6AwijtB2qf%94>%UDTM_WyV0}v)9rCwJ_cQFSI(aZ=N5I zmGPJH^_T&gX4mSk0gP2wnq0tHh%`T-x)fYdbYJvUdw;CZuCTZ8FrZ;EZZU0D{-IX> zOpa1Ph9ty;{}CS5REOB~E(jt=Ozy_vJk>R+aejAj5vXMfDnPf`jg!$i{b90*{e5X3VAhs_#dzl`@(OY>@EvI$x*|D$J z#@O#XSsv=UNux>uC2C3vXmNkODPE_)nsrUZqh|&x&8=}~1f!k#f|Nm4gs?3~*-w3L zq1s~V{2{ue-OL^MFNmB-jA6#i7)?hX6{N_Ew1C}@vcF#X3@0;WdONNUk{JuttELrI zs3=I)czDp#S??rbZKw%4j{1*^Rb>>^nfD`)z(zgX)Qe`xu4wqhXk-+5fwNT>Kk!F8%0BI~>zMBIfT4YMANj~A|9gX8euee~Z>-a1PEJMx5kg-M&vU{i z88-3Cjfwap!meAYK5EvcFFE}?F_z*AfRr_0Zunk>$;)_G`zB4y0}Xt8KDsygd98T+ zYrM+>KWNpFRKP& z2mkA<>}n=X`Np&mq}{dd%$?5pGFUz>>#5fTEYyZcl`vP8MYeXNkBF_0Xf(_Xe3iyT= zi`~W{H>@^yM;0gkUQqsY9VxqDxa`k4cKs8sNtqH@szI^P9v}LICW*K3S1?%A+28h+ zjEzKdq$YNfCBp}C{kC%#dBu^Cs~j9Dl{~;>(re0oj8($}s0)fFvG>=lIEH|3FO3mp zZn#3~a1g{QEfL+`h2S;&#IPRE@dTUlFp328p}9JH0C9HzcIF=EkRVqS=riN=O78Hy zL$AC4wY%Dt^3YqdP)Sa%ABFh8nhE5#pIEg%!=u0{!r?^U z6;i-^!qWnopC=kZ8T&))_3*sUnShwLgL7Ju(FvhDZ;yJQfL~^Q`s`$}=-1BifK*-h zfH@cYMb5wo_n~e?RO7OIt1jQkYdKI+iB}1^hHF_bW~%CvwC^*_$=Ep(s)S;QHFI5L z>^LKz@)HdNYcHN?-AR0CgSO^cmHO&0aCUR|MQ^pMHctmBmc~@Gblu62@AX&_WK0?> zJyeiXTQDrO3TbZ2wOy3%nT@?w^4Z}nnvX*w6$LK4jMZjc(0{gYEFw{7FoQKAK4o`g zuF(i@9;7?L6uRAWJcU1U9gxl_=M;j$5z6J!-N`*PH&1kXN0?WZqUhM%`3EASxmV=c zh;&7(K+s2FB=_`r2~^()yldm|w>V|Oy5V3`vGuf<E-;9NPu4UKM!u9{ZkSY zV+O*xclcaaIv3=6GP}Ck-Bio!5$mOYi@;s52^{_=H4P9ZM+J5%lSm>xk#5P1YNF&s zMmeE4Ch0_ANPqy_^6`-|9L$D?wY1&g#wO&^D6=u~1w9>?E99*o@G(UrPz~G&ERW75 zt?kta1VoQp%I(MP&$|tk_li#sKKV;8ZT0h(B$a5;rcXb18pJI?ifcz*z^|^kct-s= z4wuu!?|E`H&c@f{C%Gx6 zFq1Sv{Iw_1qN=EC9#yIx_ep2D@!dmdRi~V`(@QuOnZBy6uOj^yc)7ZO2zZ-2{)P`b zvl&e-o`=KzG8(ouA8yiE$-Nt{xMo{C`=vqVQ-Blu3$`fs3;CSV4S1`;geRE zgJdvg)8T$l*99LPAFa6v#YrBFtTAqRAr88VN{HCXOOdt69l*yG0!qd-&R*HF$}`aAXk5rA#)R7YZLz)oFsnAaD42rzf~4k50BA zHQ`;N&(gX#aKLRAN5~+83$r>6&7RFENZm2>k_WSGreY_{S)2R;URk3#1O4duC}k~d zdHT<-Af{o57P@aXaeOgDI~6))-pB;+(U)n83}=3|Y#W-t-jic4U^A z)yw46<#vaN1uDJ@wBhhoU-5U@Zz&_KmOJ{iDZHBw8+x8_^;q1zF`FzW3#-+U%e(=j zfdV7eU!h*ZRQit`hWNg>jdgbBQ)(jbQ#ZOm0 z5Tec?jdXFVzxef4&RHTeN?1<4Y(h#1%+D&Ry>Ljb=I~IE*%A!VFe**r>0+8K*94Vb z)ayR<;IQg;WyfM9)Dmsvfyl=gA+byL6U-?v$gjV>n z9-vElsbU_Lx5**Qv1}uiG z@{%|XY6f(daWcms>iV8|geMe|rka!}5la+v#;X+no1JVlDODquC@sco6~nIK%Mnl3 zYvC7G>L$s;scQOZg8vlBX)}|8#Cf$fK1nw>#$q=-z+Gv3;gn9T&YU@=&;U_TNIha? zTrnQsce`N_ZFHm8fhX>zCfSrzAQ4o|-aLz^2FFp1S$urpmxI4?-NXXZ<-$ea4BKl- zLM2S9VVLU{FC#^l`=`?uFcqgzbjjfsP|H2oK0y1^{ZpSVJyxIht4{y)HY0%_Y~u|C z|Gf}U+a@|TnYOU%EgdWvHK}u<@fvSjF9feiE<;o?LG#9!mncE3P?by3E0Drd(cxTm zkJB67)7F%2o>_Kwj1zLU%t>T!*T~mv))>dy(acERcp`Q)zIbLj-Z*G?v*p*rmaAdq zURY?RJ85hYNRhAB&DpD=%l2-#Lic|gE}){*A%$;dV<(asc;4S}(2bs>?>bcu$6{C7 zM%giq(xj)h6l)R_CPkO^{u3$^#o>d*{pn@vz1KKS0SI(nS zY+;BwZOp};SY47Kt=P?KV!;!?&c<9GUy;p*(VN665qVsonlU*XJJ9g078pvU?`p%| zh{xKlZPL)DO8~VM0MRGaKd5r_ads)#Ay625$dDk|I~}d4!~gq^O)wh+z(y7_Rc9VW5V^hdqimB6B05yX`Cusd&(bo{iV@`u5#U*aBaUsRvD=;d%ttoWShHg5VZ zrrH0p(3U?+ps*SCn)C7+QKg)wu^ZHEiAsMt79?D1lDl{$??$diTr9Xy5<2i(8%I}0 zi%LF6Sx7w+?Dc#6*$kPD>2~zJV6ox;^d+0Q;Fr4iPlp`=x2oIudV3IWq(pt$0tw{1 zxZuRZal}Qep&;!I{KIy@a7zGllA6$P#Hw*md=o`DKDSg2YI%>5en^1NVx(x$xiwJ` z|BiKpESRGg#mG@ZsQ>f&>LBn%J44H(v-6JrMIhLL^5t*d!%Djg*k`5nx3w_e_JXOe zL0Y?Xtf6xhY}u)xUrX~ulwpYQjb5JZCj&KT>|{Oxlo-if&ER)b)T^U;2m(9MY2=GI z=hW${qqfHTL2fGwjcs%qx1zK0HFgmNl5%4A4xsQN6b@vsdD^nE508cn@9J#^Ac1y# zGwa*T?FI5fi`VjQXT60NABI!6BUGzP1?wc&hPBf}tS5E^CK*ng6(3cJX%BB!ZxBe- zRN&X!l)$)cGqDxKCC2~@Rc{ALEi_+o#r~fr**@hYzH`F7!tfoU1eHt6RopAJY5y+~5Y5@OF{QKA_X zX1O+I`cz?Zx{;pR_;ekh^}Q3>Dg0$BUhk9)W?)3{r}iWdo@|J4==5d7L|Oppcfc#n zePVhB3qc;Y4H|}oSU%_kx9wxr;>O+H8^(kfv#0_;5PZID^WJ{)$~=8o-v+9kSiSG` zfEph=je{*T$ty<`jENW3S`CIUD2exb=YET)M#$eaKJsFkgEh)+rX*ZnoRtvozQ_9Z zHCn3jA1J#Fo^2NAlfn38!a|6Ei1ul)5+@Yr%L@zPg5boPQekJ0Q=>tIWc=g1gmd$` z57Jg^GRUpVXW1fUrnVwJvbq^}LF32>l#sl;#NDpH<7QRr%1XL>zw;-H8OVRO1TdTr z8WN#R0IL7=Ai9MK%WKqouhol3QO5)Aa`0s4J9H$a=?_U{$5p^`pCF|A(Kx45wu-{z(xI|a3+O)MNdL z@~6*qK_zOv(W$RrBsc zEj?87?eU_wpMz##D?q1o?t!l6=xsUiFM0p2VQaXI?fCb$`X>^dqQ3V{1Jl&5V}jlE z3}qlmcd4mS+c9bR$9GaP@*e|QMJQO1-l5S0$X4KBvjO4?VC08YCQ?c&4{x3rNtvYa zwq)W~KC2x~3(Rw@@p?ZEWnR>mkK`@&n zvSpiKn9!hirgy5s?*lfCV3^_xo@h9<@&p7pq);T&-VBsPgrs7_wRK4aP%7p>MMM?C z!Cn&sK*DFjx7!?0gICGo$TdFuOkQRF;OD{lku%E3;%NNM2@JMWp=>-zjBa~5q|n38 zomx=>EKZ~1Dl(Agg%vTI0=8Xmy@*PfS#nO;DL}86Ky6aw7K}d626as8S+0Yn~^vCsJ@WQ;5Uiu zo}tWO{QAixff6(D*?>YZKLoZnYO+xiog;c+v+cQ_*IT(%V8=NI*|wQ%?FdkN!{xQ~ zL=Ek9eHn3B_~)sHFxjpLiH#O9luY;71gJ=&H>?jR4$3)2c#tKp4KHfNRdhg+8kS}g zwJsRl$IX$_;GwEpp`FVLmfwhCxh|`!GpD}i7w=j}tuxuk`67KLn6s9u$ieWTSr#F{ z-Yem0{c&cBp$<|UFhe>ADa}Z3w;GP8CNb6$GsazdSkt2)VUXQ=lk*F3+OSUPkv7Fe zW9oG9FMSDz{u{9&q4Vv>{YQqw4JH^^Xin9uD98gBY}O<7)^GtwmGe9Osz-kZG)4~- zc-?f=Nh_Cvgvr@1O+%v;DYNS7S0)_vkur`I=07^^*ADEedSf>XW@T$fzz#4gjCRLf zcg9|S90_-E@poyDR{wX0+v5cEPDnZWO< z;y`dKc$-%9rdFDP>0X(cN{|11rfbb}6m+KCtn;xt9@FQ=HC-q(4%`1dfy>&R5gnVQ z4SBxcFrf_*(`!yW+$5r2BgtN9+$7J9DI5F+Vx%sm416nO6j35LAw4}#qmOl{jL>sQ z(NR6t4_7_PY5um8Gd>9s&}v@(mg}WjQtzq+MphIEEhp1454SVDm0DZkgTu*85&H+B zS9lzv!WvjkW3KiR$~1Oy+8=DUGHifs=!lTbOf$OWmtlEeagq=km)hl|#DH1mPND&) zX1>7k7LYKTOJ*Oa1sw~Vc81%$-4pDx>GVKKbT!!HMFRv>;pj!rW*SCJHgfqke^1Bj z)io%tr*VRU?feA3ckx2p^}It%%zAfD@(Xje<0fBP>v{a}5tz5=LWR_ghM3Z=MjJ`X z9^~(}K0lauQ^vpet>{SNL{9IDPWuy%I(SFvos(ta!&*D>&e}_dDn75TGwR*wum5ni z!y(FmZh9T$*ieY=y=9fnc!%4AX)FRWQlowiF*T*xOfOzi2N@^~2Jujl{;CG-AMWA^ zzU~y~2B|T2ol@NDyn!gVuMjTTy^9bhO+`rZ%mTh#e)u~6U57O2pisQv9& zQtdh6%ZTuV>Yo2X9PQkxm)h39dmgK*HcW6SJ;8rPj$#)VDQ?F=<` z5zDcLciG`sUGx4PQ2REzHlQQI%45@_9LX9Jo;~!$eEqUOgy45DGUzu11|s~zkR1F$ zW}N=G{ZT4Q9Z%kE0@ZeeV8CF@4t0rJ65)z$yXcp28M$>^NSn0J4!qa0Rj&^;i(EuRlx;G8!@UY1!us)+{$D>vk*2oziZZ1-tKY2NOXIGOZnnv6 zI)HBSOPgY#E~ar!47uklHywkt^)^(VciRbI?wC+bPoW_GFm34-n5{7pvirvijcIkT z-vLhIpd~EX01J<(BP@6qD>f?)L(b1Q@w(ZKRB0EDE>8ZGgDgAuY~_d{J1I-p7NhVi zVv6by=STM+#X|9G463Eg3NvNsuQjh3Tz$VvQ2$}kIj7WL5zHA zOgyr#9cVpvjq8k`xjj2uI(OcIwL*gFok-d9hK@SkJW{mGN<_t>|6;6AI?G{+olyni zN8;O3HSaN}N|H`c`qH5#9!L&&fhR(TL=uVh^>uynrT_Y)K)$?N>DoCNX2T$d(Aaq-Hz(sc1C#iRL7|9*Hov4(Q7-_0 zf<=LcjwfRnLmq(PBhV|;*(^ex=EiXmz1EXoh(+l5MyK-7$d;%w$X z3)}eE<2CiBAzMPd!$ApMQrVT=Tg++tInG`9FDy+q@BOOTwlXFwh^uM;{}9N_B{)zs zp#x6q+HF;5U^Aj^tF)_j7Oc@46CfM?Z!08XP*C__m@&n?0V&#S7fB88ojzQfL zgw94}LOl01)ihh?Gkb%t%%K}GrQ9YrdTGneiqP(*d)`oEf9rTH8XFxwgoxrgfT(GM zy2@9`C+ngs+BG7tJElX(eCO41u0~!8wLfXolk4_4F_tL7oFTyosn9Z3@sWPx2C1xS z+dO547g~dR!tDC|>KXsDwM+M+)Z4C!6T#Ci)>6~^e)p1)Ef^x3J^kvp486s-XH zRID0EX+DcC-Z@%BI&NS&%>}ulj>*V^>ttF+6zU2=7cx1in;me7)p86`xBXAS^tDuH z__doEQ=j>rrcI(!dCRN*!>W%oGe}%UoOAP5L2Udszl224yIwg6Vqnb(Q|}a~1D<;b z@`Nj}!Vvar>O0#%YU>SbAR^C{9DCjUyi1a;FakUBf22&BMQlrcZ#(bkI+orz>SYA% zi;0ZKr@!n6CNt_HYf3|^lq+1NVAJ|tE%b7jT zy%P?VzA{({aGeFuTzyYHzVsqrF*oBOd0L;h(UAsWofEMna z163%MI;pD4ZWO`ymwcHKv%>0fqd_MGq@Q8rRw>garwqU`B0C1hq zi#n~uLZJwdu3bL7;Gv2X)Y=2ztUti30V1`fUM?TcpGI(kx zp#BSW6cdv-Qb(CU_}Hg7vRgN@YjKA;GQ>&poA94-IlTLe67Wm+^YKg+@gh$Fs_aY^ zcZUn1&5`wj?|GpnJrare|zxe;z| zng9`?rap%GU0SJ9#jjXtjkFe1={M$n{Nj4s;o%tnMwp{>b4%I~D@6AJ2)pE}x5A7% z4(dP{QZob9hja6d3kQ|4N$3Qh$(0hV)CCn*RoNJIxUM@ira>FnKn}>}iGufUG>8o6 z??TDeyVInz_dFZ4NMuFE?k;_N7(q322}XkN zvYPGZq(r`3qcSscdrG?V6LfobI;;i7x=0`7rt{^XBCu`PTa2}9Ug{eVe#Aul{H+pR zDL0H!p!KN#kFjrx5iMx9Y}>YN+qP}n)@j?eZQD9++qSz;o74Zz%p`XnW+vGWmD)+| zq#kO2>#K!v?Wh}*2#mo+Lf&NZeub_mVNZ#t%eiE+3JEb7Rm>px#1#M7LTcOvVT}!d zP=(Za{HSIv9egUI$ofsh;^pbgG>Km@E5H>W%cS4S{q?Gh{ZTnvFG{IaXm6IYli0K& z=w-eXDrB~JVWUA>n2aY>Be?Q0J3viQ7lg3rK)UEaD~#r}+l+Wrjr(R3SKL9)ckHXioTj^Xf{d`ZtnoGmKDpzT*BwO zlXxsv?>Zb#?fSxE@B2MCQa=~De;zm$FhJYor}7o^PDOpd=8u7%d})2$rfl&cWit1U|aYKYKeDk|jke z3Rb%U8^V%7<)cIw%n?}5qAkI_N?Xg7lXOkh#+D^AHO)1uvxMR?np#PkdZ~-|AQKQ2 znwfBS=zAr@`b<8hH)5B4PmXRNqht2~=h`cgl*&l}& zQDT|*3+@9Ar_?Ux#R82Ge>-FRYI)a=x1i|}7>u|UutH4d^%$fHv5Y2$tdPJh0Gc2Y z8-8dxbA>hhWH3e_jGY`?4?#2(hO=^i&G<)jkH*dTMFA(~ee_LyxM9k6Dj$$P!aVK; zvTLjNATU2_Uwh4J%{5U{`USyTLB6@)Bmx0x9)ms&d3)`E>@Pvx zGmi#at9+TSwd#U#B$5dQbf3U#HZ6Ki#(gKm@BXA^^dis&*-h(a1JPYdFUA z+e)U<)H;nBWw9@zoD^38rqSZMzFsOeebmNpP zy@$>yh`&^8o-U};fSvynqeXNDVpmn#0w8#TSP0=I3!ZLiK~4P6-aEl;c`aJ7;1_m? z*qj=vxLZit``{ysb}C|HRE57l62YK&M~wMLZ7&l1HAyzoI8WS$b_KalBv9k-&7T9NMbXY@`?RY=DJ=@zwjY!5X0+=r5 zcjs7T+2%b341!8pE}vYH-w{uL+;&o?Wu4_+pZUu;pUyw`p%A$p)j6n={~#qcS#WrM zFDKwJO&oPyGzWEH=2b=zd}TcGp)T^sinz)5U{`2x3V1-n_VvXd;5<)-=6LLP!3FX0 zEDmx$8YR`HLR@dz%r8wbYMtSOij!?Ixfy*qxVmp@ccn0XJh@d#vRV=Jd5i}6>n-*K z7=kLl$PQ1MgDzI;iy+4E$L170{^^oA3lKz4^{`R^#(C%#r>DAVaz=X!iQRB*vtCn) zO6+O+o4?EGk^wpi)ngmJxAQSk0Cu}=zE?jy88)L3y7^GCNY-BEJQfkF{b^uOh0x3g zGHDHf{^x5-y*0^6^)8dH-^1P;X@iQd)|o#VL2)v&WYPT^vCWhVmAe^}rsQBXv1EYQ z1|(!Xt{%H;!0D$bWY#fWLeJ}p0;cu<&L@~X9 z^Z1a{Jpu!~maQ-hQiwV^L9MaP z?WP51u(@~^8GhncJAwd1r{4U-uyVNS6CfIzL7g>6X`_>KHr&{~SkY1;sa1$n3t z7tv*gY31$vQM7~bfN6ky@k;_Xr}m&8Nr3u>RgbfC$qZa=I1(||#{fDf;5fnF#eC3t zdH}PBwM1OZ*;Lrop8;qgU0mp^Ubb+?o@Tq*JyX4t)x$??8P2Xe*J8G%B6G#J>;nD) z#F|EGO_}+irPOk+{K%2mw<4!P&gN~PPz+!}CVizj#eY>dK)!aF=dvi;;7hiC24mlH zM@DoXDGhqYt82)wPhzDVi}yhFL7#Rt^A1DrdHdTSFj|~{WE}^|pJ!|w&zHF<x4c{(B?#vI6XLe@Q{M%hGx9nDJGd+Hnb`Caw*s`t&L}?XY*jsBdxW{sx zUDcKLPDXs8dsAXR+~a7?DshXJLVe%Fh(%@IXyM>*=?o!44(NhGk7TMD0Xwl74%?$t*2hIpJA zt~J)D@ZXF5{ZS6GIot@}PYZ!iXhClN*@&sIeo3fqo*v~gOXU2MiVqCZ@b&nXu!7GC zHTb=_>V}M#AA=yJ;qT(J#fq)4>%IW>t5VbmP+-C`0AKhmQ&I`m_5Xx79)FpP$T`jY z+zHc6-73);@=wnGZKUZGjz`iUSTZlFQ|5l^q%R^u8So~KO(Y=YjdPk~n$9fU8R;-$< z<|WSOOz^PH2Tj2bdw*2+!??zIb2196nq`2QVC7$!lagFE|&jSbz;0o%ABS$eQDXD zDJ|Izv^J)SWzg=^f*6>dR(NP{^y@I8Yr;JGobtVs)94~9LLNsk0w-_r>!U!RLt{Q+ z1jW20LybgQXj+0(ZCKhaM>Q?Lhmsqd-gl8($ge;AdU`|el_Z( zS0ztuzo0qFMG^!w&|#GVfzNVmmF&nG>tQ&Ur+_d{RzjF>hl~7g&%gbbV;_i--}rEW ze1DJelz?-yUdZh^=1*5jRq0@NA^X`!`Ll~q%aDh63X&EwYwWv}X4pZGHA?osT1g*+a zdXDAw%N{iu{goW2SFYNWZ;Rc|YEwS*+DB)0g(-x>%2qmA+1AH)P{*c&bNB3KX+KahkC4eR#@rM5{6b@>Iaa6n1#!p zxJR`$^1Qc#1#ym`48}SF=9Znlydt1zw)3K3v-s%zuRx~^^X+t@b&HMNR}k5+H&_i3 zPHX4?)_cF`e}J@$tbnVzuO96`+jMV{o%U!OZRHBD72-{jR=4`}6eHM$i;&d56v}sb zMkk@r)~lOjV@yIYAP(8HC&>vbcQ({!R!&jaogld@F-x~Mh1qnk#>9~Wz1X|K{n^}cm_LTa$z~<=Ir)4inhtUv!^3aDuups0jBis~i3mt8SQ)UqUCmaX_d3}z88WXOdsPFo+ zqHcaEiEi19dAh^-k$pqW%9&u?KR6*}3Z9WT#GYPyBP1|d5`|z58UHXgg9VA-mk;QY zZGu1EkW$(A2GQ-owOtG?d=Cvb{sal|mwPD+Gt||c4hO`}8<+{p6I`wVFse`oC!t(( zxb?~eg$@E$0=w#nM{-O`E>e#^)N2U(vQXv_^=UtTinOp8x!PqAy3?qFcEj>6kX`oHCAaZv!%mo-mXLae`1JpXUjM>j{W#DmSyrLt+G+k3?bzrqe zZiy>Gxnvde%4d4?&fR!71kg7Mn8_mavz#4bS(Rz7Y%!USY6(FZK_#Mza#~B-Z+I2S zLVQzcMrqfb9L0K3Qsb1SRyA>;!iMuv{Bd(DXu^ct#%DfBW6oYe;TYvfnkWbdRkV%9 zmQ|Ffza^e6_f!?Ke5P_Y%Os!9=81G4l~4%A@P=>18VJ=YJw!#vgM?6*ga8WCUOCO9 zs4h$c-pAiVut8^Ad#RpEv-98_S*7-NN&@;)B-re0P}H#H%>4t(ND3aH(QrRUP`SM6 zmORtoe#S$~LeN-M8WINu2cf<6dTm9&?xDvsevx*>1Z*Q89CN)9_9zfcd{A->eC+kK zt(7Ik?Dw}f9$Jpu97c!~)U14XpKtwtKY~Y7j1<3Z$%tQac}ylDzuXZ z`^W$@FiF)JVmjMsvnQkp*eWe?Ds!Uo6qE1BfPvySBS2fD+Pv_;dKk3LNYgh=h`;e+ zaWJm{+=lfO>V(1_0j3pprSxm2WP^BY%O?uW98&~Dv9@#w5tp^tOm3Ws&?xnJpRfeU zH_Noh+8XR*XFSmc!;W$By-3COg@1+rAu$MCfgwm8d-1!YRUg8xT@86Y{@(1T z=i>5_85pnbV1pgVNF}n0H~cB_X&pZxP`*tNaP~k0POqu7r2wvK!PvY zOw&$xt2{E#B9Tnh0y;ldIdkg>p_0Av5F4umDYW0NzA8)^5ilA%9QRXW|4-vLdfQ} zy-KZ~~qbw?xdLC?$yHGZO-(aLnUSr^n^O2rmJJm`UF}fT){&&+Qc9a|HJjB@ zJx@lmd-Ry4Yc^>4uv;!jbBJL?2328Zg`$U({fb)l&^fRu`b3hqGCnC|Wyg2DM+TBK zQyyZEZYO2332nS)_C??6C$1u=2+_P2Dr_XSA~XO*&1B{z>puUAXIq#C?vugMpjs~g z+fmO2V`TDA3@e5NhE!G%dRlC(4-sPedWqE^6qvzs z2~5(FNR1DZCFdX3s}9(!0EFwW{)WFTg`XD;Lt-=ObUrJ%^72#< z1>HSqIy@jUz<@viz!ifqSIS`!%B4{2fuD*XD;|RQd%m*9AOwj6LA(@j#~=jQfT&Hh z{rnfgO59_*Ss*%}QBOZQ9{}br#D#!IbpDDw{UxQSo}S5W|23qnSFSWZ%vKS>Y+RJ| z!E0QUON0O7p&CpL#RIT!sLq_P9^H@|t)t;~Fzrxv0$r--N_FWzmnKbH%0gQcTU5rs zkj7Q(#2&pUZ>j?|K~EVU*k>=?A-%ewt0yn#XRjVK?;bI0h^Ey`jsHFWp4(#=+N1Ze zei>|1hwL#%@ZiziZEpzs%oSl+mqg&5V>6>iZr!j7sU@7=BWJXJNfO#47kK6BG^@ux zq(|=i%tf{?o$C~%-xIrPSa*o=%mvrDdVg}|+KuLoTf`c?e#w#A6KlM7$uXuk`f}yU zeB~>J5PGuwpX4T1HRMx1OSeX zVSdH^Spdox@}=+Ei0SSa*hkKjCCg&OyL=pE)2MHd-iR%M$;>=kA?N@ryCT2n53*`iNr(_tvUR?er)m~4i9oC`ie{$W+xPb9ZSQgV zc7$6-Yow{yr0c{7I)eKr&;cy3jRl|U2_U4gcnr_9zTSiH2O`2p?g2QN9ma;u;=*`p z`yc25u0OPhA81vQ&X9>`t>)PO%}>n2WSpSOEIno))mt%p7V!J!_F=os5*&_O+xv zClF8@D><>qDZB=|*VbYvtTFlV2Als8+w%hkS%fr!QJ$tSumBB~tz9uA@Vh()<3^_4 zpl<^r7UYNMe>xtW7T$856W<=%)o8!izFy5Gxm8&h^idUmtK^%vUyRVpHj}K?Tn-_H zItu9XTSzQq53WYvspus7EUcW=$a$sB>}Jx-<~$RigBtiwn9|v(MQ)cx^gIV?q0H+7 zA^e%Lan-4%J%>023p~Kfy4=b*I&8@fBw2mnmkEd~eyO1`J%9>T4y2cf^F`pN;r@ac zM{VN)NU-!|tw|Rfb#AHE|AC;RGg(en+l#(_rNtLV=6mymn*t>>wX6+hW%*T-Qd4_D zlyYbY2dv|oU~;Ca2ZJE;=lmZrYPuatFxsNJ2eQ|c7zgPi1}>?)Y|{CM?}sa9WFi;^ z3)cL#O38U=HM|O2Z-kk0+wzS}k0OK;RP5)w5LN8=**^hN33g_fxEjS4k#a#V?^2@T z!{z3H_=$KLr*aF+q}QYki}5hF}__do09a=!Cz)F_?yK}IdZ|Eg8NIee6VNO>QAjJgp)K!>g#Ab`2j zV4V<=r@Ve2t&NxXm)x*Jdp6;EuA#|DX$yGoI4Nw%)fpY`4N(=L4YSg^6#{&S_pU|c zB2^{Ht70(CPVYi>?AfV|(G|~fF%XT&iO0TE2p$!Q8Yl9by)kH~ERJ6oxPLhCc?hO6 zDzuXj0=Bf;xH5J%vW(D$Oh7=7Y}(!^e@cprLXpCYg2aw+RtnCI-xSjMw8(x=cvY^o zA`~;-cUPvmur}ikZWcr_zYP*>P>>em9L@m}y_j)AlgfxTu4AqD)>h)MLuS+Xp zvv;XhXm#)!H_LKkYKxhceLF8w;z`motie(D1yhcL=|Nkuo)A*LpjnGWd+}^FS>77! zXcYO2jEdCJY^77csY4Eg?CCpICLdJ(G&qVh$BbfJ4BU(I2Uo>KOqA)+k7)RU~DDuPnUWWP@ zh+Y>&7b#JD!06v?v@4z~2Qv%2jWS4QWMgY<2v0!zzK6}%=ucMGEwTOfQ6k}gkdx8A zq2TcRu?|Mlitbj)``#^_u?20%Mp}|5+7nBGGjM5O0QS?M(6t#cJ zpz4uln*s=|{OXXTu<-?}CiG-E^C^$)HF@k@R%h2 z`dX4i)AukS?H^nk2krJ6C07^y?L9&TpigMvENNl^i)a$(tM{|D1C!fy* zf`mi^N={!GQ z;xXS0ikO1falS`7=<5}Mf#;fI!9NhY@zx_r26Gk6=D;ADV$=~tu-Eunsm15BXBEpfHAPg!75TLuTO zxrypC_Aqti?-;8~`}g%5&&7(9r$Rrh_rp@B9P!O2))!Ae*g?CKTlo= ztvrw1pk&mmWpN)MsC%K1hLX&s2xfEE-jhp2tDEAr%7>`8f;&kEg5Xf z$^0}K0)n}!yR{qhPxNL)uy*6MN2d_kk8y^LX!!jSnvK()(kcQ1?oyjM4*RjN+i!m( zdF%Qb?zc1CcC@vd_;2Womb0Pl2tXNkLU%e8Jk=bF7)(zBA%5o+kp<$)7KD&x#SLi# zNMtcmJQ&NpIj=nOX;_WO5=+M&T*li@XL5lg(-?T*E3Weqd!2Yh-*C=Rihm$K*#Gnk z6c)(ar{Gp&?UV8D8GWmen=zMMIb$bYeK#Hn<^)`aEM2T&XXc@8Py|v7nULLoOB8-d-oPE_S>w9zjc)3J&TsB z@BrLF^)Dvi_&C`__Z5v`5Ra`tVsy>R+T=ErN5XOYkk-*^|Ch_Nsg@}vA_NUUZF;?? z=S3X`&y6gwN#DVBU8IeY+natewgLj0n-7Xb1OvO z3C_#H6p3!^DUv(k+-!sYxyc|TBUUHa83Bd{lkwhvB)Fr(I5V@-JW{+_jY=89L)#(l z`7@fxfSnRqoWRr{B-2CIP~`Lsi(sPP9yvRDv8!jd#~w9!`mx3z-BhIqH%x4LsV(st z)+m;*9Q>%!_E1AUil%uQ%ykpXe|dT-n>2i!kB>WpE~JK84^Ur*H)v62hmKf3kt>Rj zt=m)#i&ktwFSMIr5lnhg-x_>{4%jBu5?JgTuF&j8gJieODyWOkzEWS>G)H#KA`}qM zr&!r!iNmNAzD7xSm0l7I^m;}C1YPiY+`HDMDR_Z(^F=lXw_?oXlMqEfy7!oZQ+ZWa zTBBAH)XqKG5Jx;%@V6qz&uX0L_)d9i!fxWmU}vw_@iHEbMvcz6e};~7J|8D^sL+P$ z35Wlhq>FYpU}8|96&dz#Pwwqz!8|Kq;%WqGwAJI-=fg@>y7b2Y-oSSc2s8lTn4omU zZ!-eD-aw1`1k&tNRA+~c?;1AmHIF6PdjgG#D`Arc7d5AOk!Ax1O0Z?@N-m|{%JF|M zb#}N|<#9i&7m-M9o4rU>rW)v3u?ZkhxxtQtJk>f>4T9!&dqoN#j^}-*${`7YWavmS zy#*i_t=WJ@1oytP$dIK0GId0gAg{{!VUi?GaxitkB#oQ;%h27DW$3(*4Kw_`I5}%_ zQr%ZOkEhg1w_arypCnQwv&3C8PepSmuM7!ZZs&%{a74Opn`n^l znxiw^Bbg2YjTEgBMKmrN_JkA#pcAIjjEXoNNsMevgD66@M=UAwJ0ITEj(ik=1u`^5 zEHU(Gflo%?X|J?NBr)_5<1GmsCMq!m1d{}IQ6S#rQ!E%ALIMlDBaOvDBZPIP(Au$v z&{H}K-(rrvRV0iMue`MGnJT=tkr}2xS0pS`H}4$^5hMbK%xQpRK445ZG8cX*D!0w< zIAcMajeHu7KvFTklL0I~gJAbFPK+M`%Mo~_bSO7VgxSLmPpV4OMbXRslOfCIh18ET zcM}U{xqUsGV-eBzDYpIrO!5*(eMr2!ayT)NL>Ni~fsaVYF<4D{5Du|W&1CMv#uC;R z_pV^nT=St!^in3`+s;plL^$iToDJ}cr|=enIeUX{S6R205T72sbe28lcKF%eZZ zgy&2_8b22b2@J+&7560s4xdhsps?h%A4}9N{3QerbQmVaHGJ5Ctga6-M zm0_eP`?Mec0EXxQ04V=283-O0F19wbHij<$Wvy&!XI!JDYrn~X_J@A%r~ljttZR*{ z!IZqgJQFB_whfHQl`*DaQ(Vl*rZBNQQAz1#m0oh5$oNc($^3&MUGIFy*_D5WFsb*$ zltCa5lb&J{7D7?HyIgj}JLl zi7>gvfWqhvZysjfrVdA01a!lRrf8H)ffB;2^zRIZIE}LXyiHWE&+9+9h#m?Fs$%bG zhg@=&LDg7|{B)iLnb3j^N4-CqMdy!J&uGWlyz?4-)NV-h#-K6bLZzC?$qmnf9Fi(- z$>B|_bzng+b^1NZs_C~3qY0lLB8`D)-Xs!^p*Jrb!E(jB$W=<{$J*52IP2+Gr)L|L*+>?h-S9helx!xy}^!~4`#ZQKDUu0~#d*xs0 zNp0)XtY;-d$*$up${WU1#&t%sQ|ES1dWNR+O7v(P*PIv7f$7nt#l>{32Dgq zRVyd6WJ1`D4k#QyO4$C=+c3q5(P|&9vq7@k2i6o_p#jtFHs3B{2)Z(&W8rbwZA=IM zT_I+Ak}a%_yM|VU3Z~q_&?r}G;9>gNh5F(GcSt>F2#WY;e4r_yscA+Na7(~AsoYWd z)8*InDfe{&TCbGxdN*c+GNd%o!UUw_$^ja|6Az`RR>FP?DX=N-*fho8g7}TWcH=AE zer*9Dkqq##DcU#*>U}383%&eS(DFu!Z=N5JZ{yg z5t*eV-wu&u;T*_(84fCFB~zvr992!n;=l87scbLygT)iaL(P^pv1 zsg&DGiL!FY=ifSUu|AS`DF3!2jDg40r4BV3Ge&T@F-IGUHJ^^K{t!GAi9N2OOlFSCZ+xsGqm4ZJ z`<~yWhffr1VtNw;9gNp_$kCo!5dQF2n!7UiAN@m%pB48s#gMJsqM_tX8CT04T@ua- zxdCS8qv&9YCRSV%a5;lQ}AB zk_1Q4dG8@9)cVvM`V!{nwH1j>G#||+3o~_wV^18*l}HI9?H1VuBF! zZ!;{$^~!z896E#ONwcdB(c9IFQ>t?jDdW3IdAEdO#uw~IJXUPEX_BNjI94c)gM6FE z=k=e1&Ky2zqW3DW4*TvmhG_33x7?f5>o3z!J3)rXrk<(luk#A92LJ5;KB=!{_*(4q zUw}vUlJMI|@I6bR-!|&_66t)IeMTB{)5`&KX>EG8IW_B_ZpdeULgZo-P0u!oBaxrY6Ezkuyg}YsO`?= z4fD@2b9XqKs9J}HSo@s}tNqNv6*`k^;+AkZ-o7Gbv3$Xw2kZ_4I<8u-Fa@;yDboT8 zG6Wa?^ME)2TKr|r-B<+YtMw6m1(f*Jg1fE=&R_FK%nfk-dn5L$JScBvhq%k%#m^R- z_hPTCMZJjduimCErmMr^hPygiJODZi>7YM1eFw77K=nA`%Iy$!^Vi;JOS;_ znkPJ0xa}eDZ9JY|3oAU=*mafqG$C*APy6>}(%S``(_-DTcrc5`C(jm0;9mNiNTu&T z>$_pNe>fGpe29c#{E}Pv*og)@Tms0@_q9$(YB^nu=wyxP}{l_LH?;9?cNui!<;Nj{2VCG6(#2H#u_FHF3q zi|7L&;}^gcAOkftGuW9b9f(5Dz4>csVYDSu+?Ro#g$rEy#%gE8d)$({@a4-TX|Kos zimEA45THRGjJCrsnHqp7HCOj|oq@aHS;-j4Qv7%|LBCBsBj{e!L>J$1!{3=QTG%IoluhAldWm z)g#j%N=sNtn^$R3Ry=M{{SLcS(Q8~(ylhd68%wq;qtq^_zS^J?*B4@6M5+B!b`D`B zuXifksKc&%Dq$sU8;p6F^|vMr-~WDl#CPB1K(#%r>~sx^KfM1RAx&f%To+QH007Pi z001=q&jQ8S!PMB&(B?m3P5-G;)UE9|*-*Z^0p8$kLg8r9HWP9BHfjYf+I9U|ATL04 z`4*69n~Ef2iVxcReA7^#sv=xH+f(w4FkHrJr ze_N{3vYsHODl(qTmL3vaTN5EyCS$Gug%E8AutWUIiI721rAWotBaTX@3~W`g*Kwd| z&k*&DPQ~x{Yf;W5ff^(ZUQC|fGQv=xAhMnS40S^H>FpL;JU4NRR-(MI1lfHAdu^X% zAqmZRh&N4$5lm++ibYzs$GVSTaDs=T)l;>q%HBbaWts^G(#S?YAc8zFnUqP@ill&+ zTyhVj8(*3B68tFkvq{Fd5TY&Q-0H=B?ztat zztA6UG6A){LWu6yX}izbb5NG$WwT;CDu}yboYY}MbP*5KR88;(Xey0j#gMYf7DZ7J zPh?dP{yQBl5v&O$1RbrEsmqjB;@FlQN<<{eG|e@|%Yr_loXXri6d8I3gynyF*{Eai zV`7k}iP87P#pC(s5pCUrJNv~v@OXFh?Ad)58i*Jl$4YRIL=<%RvE@yDu%Da(0EHvi zksWBUJeJ{^3S^Ovw`Tx{66+t18OLpC1a-Qjg5YqX0mB`3^50w+r2^juC9@V01B5G? z0s+7L#Y<>w1V>F-EP+~(j`b*TS&r(=9m}X=s{xBErCRP08;x+~O2Zd_P7QN~>#Dzw zEfKuWz=GdnXi)KiXcYvk3z}Ifq-MHl$wczA_^_K62ud@7DKUsPS~?_VvTL$Kv6P8I zr&db8o~(e2{;{K&u>}cP52=KybB<~|6l<4|^I$d^^zPUXz&p`BygTJwZw_(noGtH? zR(|kLx~cVrU*v~BV;^+naTH{U6qUXL{U#eIdsZDXjux%saYTjIP$=lB6}ma`6LS^W zuPvyVD28(R8EK@}Vt5E}!fWHb`i2Z`*dm!VT3eY+YZp#8hBeF&jcawSnnBE6tp1!a zF#HH|#U1=6JWHCrb*zvO>J`#<7qgWy2(7-L&l-;asa|b79A?(@MO0jtBJeLHZ3U^@ zBH+3DVp;cMpVi#om#Kb~Yru62-zgG+(@27C4g=o$AUJOiT~UBO&MqCV(R@95Mg3VG zyY*U1qg)q8uF;%p>&6B!cI>DcEg%@0m$_)Xl7}&LaYO>zJfUQoxVB1#nkc~L2A3AM z_`*S(SX;C>nYXLjLq6k#pS&%ySObDR%vJ;B+XFHKl*(Z2x&cAaqtVUq7q@k_{MUTn zCPB@nJBym;+tpU8<~1|Iqoc#E?3eAy0DBcRx|8kYp=chmheQcAxyggMn_)Kb@3e=x zQ(i06omTZ~uqUs0jCS*eI>Cn+tqx&owxn+!co-hr+g>Z-xGgCx1fO={OWl6yK^zqq zV22K)2L4JqyFm69rWQc%56_hYD~UKJ&$84Rw4@<9<9x7piyNL6o9o>fd%h6%MH`@$ z>VWD64~JBX&kc>lZyypV^aE6lI>9YCVtU+RKExlpi5%N$!JionC&r2G4DwC>{* z-NIVpW@J&VxUtso@Z5T;Z!UVS=Y9VjG$M*hdQ`#!0D!Us08szG&ty+qBm4h#Bh4{z?fH` z6i9>~x!;80OFo_2&(4h9HcM%UQRB@&CV!G)dXuokjc-do6DZ*&P!uGJp(c^8Lr8vq zzI@%@j<2uN+xL3@o1P7?w1Ge<}Fi(W-Xw|eNx;x0-k0*&o)RU=VV{q%6W|NQj% z=HWwk@^<_=Kaf^3J-<76|JM3>l9}WN*WLX#Li00!dOe?JueEIxD!d?l^Zf$$Obbfr zXat4%plD+`)nDdMk#k3VjhSeFvu)Rz!pgGGnDWp(m`x!_pwR1Q+&e|r$w1UgtSJV- zr!MX^Im%Fv(8P(rF~9ebzVQV@A6G&sA!Bv;%Lw~95ml+tQc({smlm^`(Sd`@A1or8M%4S7;Br>q)8 zBa=}E@w8&$G#-^0o;nrd{&hnzj{k)%a7%~2yuaI)n3N1A=jNN2a3fH2ZOo)34y7AH( zVi_WBx!-#IQ$->-FLCw<3nq=Yxz}h>;?d-=wF3O9FZKgHte{uxW!5JJCVE5@Pq88-!<*p+ zvgsQK_E$B?(Gkaw4(Qj59E&VAG^EsF(W39g@e@F1*Mg5b;yFAHb~XX*CEpa5&L$vU zNnN73H3?hgkL_C*5wm|LL21@9|L3~E=PVzGa=2Tt<5}VRh;AZb@O=<=Lbks#4l~X~ znW2anl=#sE_^k@ubyM+5VgN;~p-NDoK|aD^E;czvCOE)4i$W%ZD&Fd27PRAVGulpW zITiFr#aVm?>@Ua6vx`C$7Ve06W8d&NZ{ju866dX@EiFENMM`8QPe-N)L*BL;2cHsU zi)9G!QXbe+pKN>4cY+or(vJ8E4T1A^f@g7KVevR`-{?*%-BiK?P~4Lu?~){M^I8R`Mc6zx&OE+jXT<}H(6$i!Dp*Y_V6%7{oa`6gy5OQoc^IfV zU`EAcb}2Y?FTK51h==kCQ||ddpuNVT6>k3ow+8rR&%RvMCBO=LTBQtps^d_;8X*{| z4j3!1MlSAm^LvU<``ZvOwa#BN@Tyuvg-e8>M7p3%-0F^0{u<#L?S?GbUt#zO8_sR) z`$B~6X$C273Jm-R0!?2)}10kvLR;Akhp=OLPOBO}<2Y0Qx}`f2q# zm)~30h=W*zMLYa$!;-~hVTkF9l6w}I6l_>9DngZ(;D;Er$367aVUF!Fs**{A8r%acXL)p4Hua4a`HQPTX*Ee6 zFa$mENUN`mCp>Tv=#+A`_u&wcszS|~finfk)Ah!T)x5=Y)S=2U;%kU*7mbc9e-RazOL z>O5C1Q;#!ry0nRRpY0>uc;~5q7tTQN9|;C@sh%Anw?2WiWr?XkV^>71AOAqucC`ej z$<@$gL~6dRPx(L|rHelrZGpTDuNbuJtTnywy`xHmWiI&ac+MOXvDFS#R%d?)x6_MwPMGg877d|pZ7aYI zBLHB58FN~gPy1;_13U&G^qzJ-T+JT@(wM%4g2N-_y$}R@tJEE$_1*+%sL3O6b4(yd zTaah5c5`_%tDlFfH8r11v>jpJ-)-<^2i#YQ6LxCMr7%ud~sCafcp3Zq( zDgpI+(x2D^o=|3*W3gIq2L&b`59SHxR_`!3>D=V5E7qv&_k*Q5!bdj2s8GNNx1Sj@ zt^@{xr5}c|vK9IQgIygy3PMqraY-&SxY!X~fe|Aa$6N?ca7|kq z*T=*P2G_k=7nMgbqGl zCR`pq;a!|aa; z*`MRpd>6t{>80%%XHnsD0HUMGROYfI%V%e0*pp{%8H5+~?sQqusd&W?IfJGq_F=?u zc|NWMY(h8P545+ZiL z_iA@Si!_c%%c@Z+3mF7h=nmbW5%N|%cZ&@9w+{|uFzZMlWW#KqJcrOkH@z`mynp^} z%Qj^UH)XV%ylp{aX4s@tf6UkPZO4E%@F!n_mRW;Ce(U{$m(1!DDZJ4{;`*XGZtZxf zOeAJ4@=$#sX6-yygEy92A=q|GVN$R06mUJHw}iDZXO&o@3ThXRZeVimr!^Fjpeclu z23$-@IPIorShXJF&NE-p==>4rvq!pQgl@HWgD(~Nt$DGUd*sh?7dVNd^p9l7M z8I~!gkR*GBLa=zjR1b4E-qOS&s-WLfUEqZ~C_L}ea=D@}s!HyLtP7_D6KD!QHHZVY zOYcG45#YghdEWeywLWjkr><5glEUNs5fGMB;Ws*Di#CBFzongTzuOaD6A8HklNjg= z<(E1w)t6d$+dVlqcxdcbQ7!xsod3_WQ$JjV2x6Uce+*Zz;@7$27`S>3{4-VWD&%!j z<(LL(!1NYrvjKP8?E$qVFH2UJ&Nubsw4y<0uazF!&{N-!VHJ(V7R%-F;2XjQ&+-Ao z6^xGld9az1NF470e^v}{&1RcE6}9!}0&-O-c85HRC{fzWIUe(Lk{jqKPN$%CowLG9 zprb~=4!lF8^u6UGrEwZ*nB=mRWrR z$9DBfFgN0!sxsf3wJ|j`6>W5{xLuf8Tk|WB&=?6LK}l*pC;NUr0RspkC6>t8-SB0* zk*AJ{70p{bLc@NZ^TWaSeThLh`fiRjsx|3E=GE==BK{A;&MCN;Fxv95ZQHhOp4hf+ z+c>dp+qRvYnE%*3(Ftzu+`2P0Q#CXF(*3ggscYB%daeCioK01!45O2aqD~vCG*%-U ze>U3pknYsVtbxBBSg0>L5=iPg|DeLsI-qu1j#maM$t+r0r&nFtXic&N zjk9jll+cYb29hwSIK8d4JH*Qw+yVvkMxs*dN7h(j%>VwaQT=D};y$tNWc(*2_Vw`I zZWXN)IG~o+skf#eLZ$-coe=;r#*EyWG7kz>$I$T>W%Vt?ctgWJkHai82D0$&_YV6M zO^fSNXF+e~1&l`g7VORJ0~CHAK3sg*!K(b3ho=BV!zUmFWgZ`oe8L2H^Gc47pWc!L zb9ffflS;syTpG#G{$8Splk*7ZN#KML-{;;JL=HHLuy6vk6^q9c{5W_$h~o14_&9Gq zMIv%DD<7q=PK2jo0Xq?W|0MXu%%wy~`xhc=U3RtY39AUt zPN+C~zw6fl{suG19o$`FhJN4a+6P_WYtlNpDR+NjdyLHLQ9775r$=YcjH&0_>Z|(7 z6HZ0s&)0Zl*Kpnhp zJXZ@^)G>qGip@!!>zP5ZE=)d{Rf&r|@DfxBRiIp8a*BdWnyv&g)maJ~TS>gfdVkiv z!nD)Cf&W`IsF)fcF6GS7j5Rx00n*y=OEvY#xp(1hhbMK7Io1Ua9=*SAX_iKiXhzO4 zVlHqHB_OpFEM2n4cHl9SKKmbhuHYTm&uR;YxUmq`U@JXa0F!>i$mrR1PVz!86Gczhgj zF<@}hU4*U{-~ZuLKg@8HT9-Yl2%mqFd(9V=+w=Ei(<9LS@&nQ=j>8hAyZ2w#puKBj-WLrKU5em)#X6vvVo7ap73^i5RKA(vEsj@ zf3u2E5b)9&@J*8NQmL(`AapP*r(9ec>lq{x_!ZXE2&kDR)0m_jLWv10!$w*t1D-&4 zjL@G>FU7VHx+Zw5U{iUnXg~jnfb{nZ{3$@4lR2+Ae1cAhMh2+Ys?I~*Vw@{nU zZ_xP>Ujg=4vb*<5GI37jUi3S2cATRR6HA2z#7ir(UZaj4{;-+;&u|y zv@8vR0&3%!X0s4{wuIvCNas*sXV3?$Mkxsa(pBelv;rPMcfc_9QMWg5enmpl8Wpe# z7`VK31tm4CB`%qL+V|kBe~O`u?R&3zG}XqF>x9h^ngP?98Hj`0@RB-`s9n846<|+^ z{kjYK6j@ud3P3x&ZL1}}PaY@e+=|AjE0r6|5J6UQZ<-^hZ63e8n&k26n#&W{>sma3 zz}5!9S$|N@`XI6C!G}dRlmL;4a+j9pr)QaQ$}iTzl|=;3@I)%!Aj0WQB&+W1qml%A z9`OtrAjO>%-TjvY{zC9N;!D$7&UQu=3f4xhFYUP*{vk*A~lacx7m?! zMGF}yqWhRwyTnd(qx2RMaX7inc22$?PU&QmR`bd}l7;)=oarUZ8LiD3AktQ%z$1ew zJQEa<>Cjot{_=b_klr%I%jF@fX-n}64a&=H$jVKq3Q0W7CvFWiA?>|a=ka+i5H0(& z_<7(uQ7&!v9sr24KQH$XwZ3m8ZznAVK47ck^%w|-`7K9yN0;ZwNLBU({!@i`jEl7< zA#vRbmdV-j>Yf(m6Q-AwSpsykN0)34UDOy+KcFt2VjlyS96dnB9+9E>@RcLa8#r-h zllqUkkn_|bNDbr#W(4Yu37Iu_H_pnhzo*NawfCr<%l$ck2OGYTofAmO+R6nKQfR#r z^4a@+`YqG5!A|g2cwBFHrXxS-CYP@UGaGIgS!V+ocY}TQs4GFfXAJK?i@z*BmZC3M z#LR2|u3(gIAPoGtQ(68b>CoKDDH_xa^D_{fl3@hylk!q2B%2`JENt1BB_=L1 z9n)6GA?R23r_DzV5d-jy*i<4{f7mPdPREjRITO-%kE$3VTPy7Rg5hjgrlh?|s*=a# zeK#Y(eww5GM!G|h8O}6nH>dy8@$c_nFRxfmW~n`Geoqz`fR9_ka?I`1-I7`P8}zk| zcJT!Z;NpCTcc?%(yGvs6|ZIOaT7jvS6iHTMt%$S@~Eer!ah6tzqTlYT(t5VB~~or3_rLI?j~eCO-@-u?Z$CFuAW_`Z8kpQtP$t z=ct}A2twDL41T7JNkof!Jy8Pv9G5m7iJswCk|GAjo{&~~Q#edSfwIwIEqD~u=2Q9U zZCmwx2=#dky9LlKV$L|+dW7uu?tslvh++3$ybilv;Uy?j2TZ2jG%zIau0)&;kNtPH6C6Bw+MX9?t=jYiVnCIZp|I3 zU73cu9KZL1abXM#MNIezQ-cAi=Aq%7l5`&?M@g%_)OokmmZWwswUP(z&Djj(Ppkkv z0p36RS14cLmoPg;T2#VOO!WwhJ>?ShMl&3W_zXLyfNq50>*+j{jVyS#zIO#Ay{k<4 z);gFrxWy1g@0K%`wMI&KeL#CQuD&}EXW(C`L9E2#rJr+<<>l;p+>nX>8~t}2pH4LJ zu)xeeAPi^y(HPryKIcd;*mTfyq^9+V*nDoe-OR{eDbeeLarHlGAL{Kn^Pg#ijcDXw^AQGQ9Fq^ed3xS=2HN9>&wmG&P$>g4+t5<>tfNTsQ zqjBwc)1)hrys`4#fl^kwPo3Vcc5g53$OE*8xQw3T=ZO|}tuTDdRa5^m zQ{XQq41t}amxDrdbD67Cr0{8!q1DD>#>j{+M8=b>t6T=U*w7MYAQh02xvy4Q4${j$ zV5@Cho>uI0qX((?vJgltmP4B(h2tNiu(7<2)J4VNA?;0=o<=saEE@zqK^($ zRi{j3-=@Zx&rYoI|CK z!1!ZLUeI@^M?~JN79!SK7vBw89Yi9Bu|!6F8sP)EN^_%(Un*dsYOAxwl<81a5Kse1 z7iWqz>CO*4rnaNpo_;!t@BmP{m4T(9;i+qaZ;8UqLOJNTiweq5!ux-J(vW>p^$YUY zOon0OU>%2kXk=tzCwy5kHPA5C5vbqM@~1HyYtc1zsJjso4zUz{JvqP40wsF&LFe0H zj6|jKfri#<;GBj)Vd8=*DRD0VVXl)!I>P#I4Uf_fnT!Go52U;p%LRpk;fn?V#eFra zT?v+8ry11sBhei3QiXr-ln;rtYs_(wAQ92cLVYZuxMrAJWI_4vTAIxO9pVeZKQM20 zp-_e6I2e*c3?tJrI-AJ(p0nbnJ7L@W2+#FyDe!J9e%t(jWRsH-3+_u=5l>TP1HXIW z^#&vcOi?;mExVy+X_##DiBKE27@w#rX_l&)OOs&^VN;p`MJPR?(TIf#cujLrI@a8B zVZ7}1kgyO@I%|RQ9#f#-nkZK_x)@&h+<#-M+$Q9OOKUSg z>a{UgYskw_*>gi#yO&)xF+I|4Hl>Gq>x*jDShkjtV1noqMV67xFZES$kX(~W4zXLX zu})hh_U7=Shq4~JYH0+@>_pE*gBT+vRanlIF5Ta34GLNvf5~Mi<$A(+wAQj}M0;ZEBFNM3ew+7FI)<0oPC4Xb^ zwif6N0B9!fA~8IsPM<;SU3Y|3IlE07W_8#yOGGcnn2T5yiC>&cmncwQf{il$dOFgH zdEak%S6w{-x@j~HYC#veM;=IxhUFb{Y?fL`8c8nN3Mzd6* z#yxZlbNVU;u~2Sdz^Jp~?4h1H7YKNJI=bjYk-ErBT9rMFJrjqa9*aiq+g+%`ZWe2B z*O{QKC&PxByjW!sXKw`EI=rh4OmW>o*wO?CI9j5vW|xIxp$bL(tE0~&PVc>}BirFC9xVZzGWv(bBJQdl83B?gI1w>38>o)NDYO+gfXkC*IzJYm|I4LG@4K{!DIDc@TanLn3 zp8XhTz_C18d~;Zs)zl1>C1r_K(J%jJSn`C7l8cY`Yl}l zfZSlL#n~2#m7L={45hiI+!Nq2H*VK3i5q+~YMBd-%j2>w>Uf%{|Ca*w6XjoKo?cEr zLd;kEDP{lepp=1p%Xk-tY!>^lk=&GC z6Jkb(2FxHvuC$WwT#iH=$A`~hCLOy~eKgPQuE(zb3^pSr&g-zmaO|0X`eVam@MmHl^$OyLW0ApE_PPZ%|udKaSXo%Axc9Bus-+sM%Y;%M zlw<=g(YynGdbyu&==$TOL&gvu92>m(X3g$B$`f@gSjQ~8=_g0345v+UdZNj82gUak z`cDWB%3jm0OzkS%mSW*X6qIx4%JNW!xB@8LuJd@E`UqPK_u$gDF}0K;pYK9rx3~Ho z`~;%#jH!8n&fP&T{mGPP^UJjLmZ9@2-VueI_!Z=HQFHbP`Lq0IdDU*+Wie*CS{Yw` z2>hS3m$s7P2fQYvH{P=Z2U#D3jghYwE#t;p`k6st{OgY2G#h`3+CyU9f&1Xng%iuk~UJ{zD>f}PE`4;u8P1cNsCI!uv%Ro`@!>Day1f)tMaV^3~&)40CrIV&WF?t}M0My=56w^PTXW?WoG zZ=W^?2590eN&q<986juZTKn9BD3cXnqu7N6Y|A?$A=wl2`eKNryF$9uJ(=J|MH31q zU4sUS0gF&h!QrHKaT*y3{5s8@+9rzZC*3cxJ?3`obWRy6uD#R4hK4u3MEOc1hC2+? zZTJGYcgS2H?|{KaNDNH_mpaI=qUa-_c?ZmnQG~8ps7Mi23?Ox|&K~le_xx3Qp4D<^QIbxN>*cr_oYbqCjzK%z*XJ_)J$c>%rDDuWkRKcl znP$iw?P|y0CbZWMVL>wVy*Ns$I42l~ESp-~P|Lfg z*_X?*cYnT{b9qbanyZjDIqVOkzgG+(nQvaGnE=iU3zmUH=tMf^$Y zCb#70e=fXWcAphK>Cby^+cMLNd-eJl;<`KCaovY=p;|w{2Tt$s0nI}krd3yBrd1w{ zSXU9KSXJ~_)iXBRLij<9j`3FfnsHWAW+P4*_L^*y;*z^3roFhzEwCNryvOpUv#hq; z8p!u+&eqUW$Y}%>F!EZVJDl?@)rRgsW37~moKuuma~sM{mKHv=Z6)^7W8Jm<-@l3m zL%lsZpC3{nYj=6v`W-g+`YP`sZEa&Wd|GfuZR2SbiucifEv)t{Y{Yi8p2*ouWO3fq zHXfHMO9iWGVZEo0b#Tp02V|XHWSh_HVwHVBEXA z>m-}b{LEoAb%=I>Js)E9u!H8j;K04cWJh{?7uYjLBKLG1^G@`{9uOtBw2jYlKdC{q zEcuu{>8e#rfKar^<#^^G14rJO>GmfUFo-T>Ps<}MdSJCZOQm1Xyj8=C#s%1mBynVL zH$eL=mga5cw4XBr!TDj0Xd7|ckH*Zw=yu2V+L+@a%+qoD%-abX{)dp6X zhW%RTmp@IUDSybBi^BR#)Q~DxT{?^%jpuQT_!&Jx*ckBr7V`bi;eS`RsDfG*L5P5W z2!ert82^8UMrL|fXCr$TD_1KA`~R| zJ!g9?N&d#h&Hp(-OpMGPf%jM_Irs6}iwFcJod8(>)lR5hOA7Dh7S9p}u(^=B3pnj(}^(3;O_X8CX#f`jG zua*0BjdL!@HX?{n=S6kUtttG(AllnM+Y?-yz5V$bR1o}Z3BXOS77NKY?d+&=J|o7Y z3H#CjPGZ9hOHts5VwmfA3$p)a(b+q`pkWwg%Yhd9Hhnn=fkYhLBj`n2UWEb z;meQdmr9*ISvm1aiu^I2M6zm4d}vGf4COLq2sTa?!BF6oGbUM8GNi_iJj9;>cK%_O z$E5Q;8O$@r8>}&T-K&}`2_^4*`VpB25GH%0rCBc|PTLmxh=! z(iBJCydzpXXcOD;h4m3c3*HSE7lcxeZfpeHnSKujad|#GEd~gF-b;eLzE|(;2p-f6 zg0%D7d`6}_B|sWM+qB3W)5xk(Irfx-m|KEw5ysrT&W-{A8jYek>0rk}dAKCgbBMz9 z@$;k9jzCQ8ETjsW{DP=BuMB{7P!NiR!FXZsv-6q`9r|X|j&7G=YKSfqx;TWl#P;b{ zI5kIud>qRHg>XyvsdE~u?!3ETeH>=8W`UL#_p7CTr zb|60JwAhtGDR=Ji08@C~`RWdXd$4jM*Xn(lz8R8?SI&CI-7oNt zq7928Bg4(2lMg}fyH}?@tPGrQqCma`mo)R3<^*CHjC&+9D7cGTqAS0%J=N+`LXR{V z;E&!Z=M@4Cn6gDy^Hl#cGx#h+L>sb&Nbcc~d-jLfL^=^h2?F{A_8E8Nmia$jGtLH> zxAPcZlfL;hszw#+O*D`vnwq^rIC1IUiwe78-ucxkWX81mxMz!!+!uk$wLSlMf;~!> zp$3%3e2ksG(hMG15dkh)47VwdxL)0JX2Q?W;==Vo(E}m-BD>z% z>fkfzGFpo2&+>Km$t85d;$(tgWJScn($x((00w{~l75xIixB@lKFiio0EtKH{q!2$u?}8%W#6 zR)^)J=wo*o-eviYs|xv40JR12+n;LJI|=}ORfBEA`My5@e<9}Q7WpnDP*OrXs1a=6FH<7k z1-xF_1;bh9VNdjrRvnd7K84Ktr%EU7WLQ8vxFuK+F;(;yKFT}#QPN#2upMF7)Gctq zAHia|zDtmkzr>Pi^=YqU4Z<)}aR6Q|d z6l9#%rLTVQubw&HL`t<#7OOK%#*nHnf)325f~EECirFTvQuPb9 zQbZmKl~zQ9TDIvT3MBKTb31^{Gd1)e!4eex6Np5n0!;$qK{|c=I_ck_O<52mqDx8wsw;8q>r;|9a>jk34Y9#&dxS{K#V z88;2Yw(_&Y8cJsoKWgLH&}=zbUK{eKV0wncQkbf4R;oiNspq<6FXL_82{=wB$sK@Z z$gQ$c-Y6K8H}+k5@cb(6n6XCwg(a+o=Qgv+p}|leF*eRwf`heC13y5R|LBB~M#W}D zgS`z(>P9Oii>9fCGD3srb|R}V4SXV8@KtVv`~?nXifj$_ED8SXOdmdmZ$aw)#@JoZ)T_Wz$ZovqlHYdQ zGOAv98A1Pdjo}ueahhD8{iq{zIk~)bDJ`INM@JA=ib)t)|IWp`N ztA?cGgqTqlQ3&Pvpsj0CKh^4zqoG&O9RT~A3%YS46k-Ta?l;NZ8-5n+O1W)7z0AMO zx*0U9tR!fpOS4`IF>W$(0~D?c6T|m=%Hs1p6Hd7@eGb5sViVsQAuPRkGXO$%UhfIC zBSp3rMbK?W9b+s|*_0_)pu}1t%?dzKQCW1~;Gu2^PGxZWLt#VtaC**cCvvWLX9cT4 zdgi*d__u|tBR^VAhNJT_%9@CqbQV1EcultSZCjiW0|MO;zrhW_zA2Uop#LE<7MUql zAnE@~;}!~uN*Ss*OL5~v*$Mo&ZN(-SO2G?1g}^(@DEyIJIs|0gq$*|F2$KZne`s@s zMMnR{y^!OLmYf6;Ex&J2s?qxhioY+21VK3PeIX75YV9T@YQ4CPzrr&YWXM`nB%&Q{ z&Ht8+D1*wNA*YlEcrBLAacJ`A02Hr#LMjJ3LDvh?k-px#1;U~iaRSTsm6*Yb2zj($ z6e3ETCJBkUP~XPOmPW}O6F>+U7B}TXiG^sA{6LVQ3ABI$C{ z)WFUjnWhDA3mOzp`;Ge3C5Mo8s>nB1P-i%6j71DwWq?}}@Q8*#3WDy;(yaIeL79&4 zm)THAzz7kXTEm(0@5{M78u8b39k7}zY>zA0^*)5H z;tW4dvWNlEnsUkbWC=a)67kB65ytXVb%X>fSHK|^+!;R! zW&etj2K6U)n#vrw|y^F{lC%~4vEm>oTX_|qO)4CdnY5H!^?4FnM4h9UaIeXIVUm7OIaqME@f3woMP@ju71i$I zljfy03L5dM6Q~1|)a^Rz6CDnM&&89)(W0wN$0-B73tTDstVOfnyfwy6UpR#xAM5L) ztLAfHdj1GOIKJQ2K_Gk4tM}#=9C|^ktZtadAlaa5eMrtw`WcTC0R%EqAo2*?0|ADB8jGnBJw!oWBsMi-6_N?5ECl358xGJ+q4BwMKpKF zbADU~nSWu$R!BZXX~P@8GcM6^ws!nhz{>s7s`+1j1}wN(MEcq6{iO$HKS$U2xQ;9K z>BABqq2@wTa~Ryo5hCJ02**-X;11Hw9Dq9ccrJY8dF!6rCPwx7?0uMh0`UWP#q0 zA!piV=pU&=HzRB$k*l2v)K?>#6gJjfIYxcqHW(~Qr?j|U*H#S47O37Lh!kj7n8dAm z;Dk)^R|SUY@|?yN3AkdcbjsEDXzM~-q$J^=1m@C1(jg!v(b%}>b8Mt45U!l%-Bxpj z+;iU2gGPBc2z1hdKO$#%B((w=cNxsq_EVG#Ec~vScx5%DA^9GD?s_<157EI&Opc@7 zSTnR+(BZWd5J_>j*B!GR0YW1(>7_OCW?$FL>0NRdaB!Sdis5AR=*fzBt0@HB)^n2y ztSJw&+IY!K$nKC9M<_cCVqvbIS4)_W^>?>{mn zPPX1UM;u<#7Yk_lq}W>Z2EhtzlK!-uFP7&*uXj5eh|Ejjs+21o{~@uTtqydJ(I+q6pDGSQp9G)Zann`P5Ov_VGYst3R7hyX};2KOJy-_ znWC)?WHFAau{mQCt(opLF`Vf1f0YE*Z}5xSl+>1P z%}+4XM>kp=YYhvjYWag;Vlzp8QRjmvgEbJ@c#7d>;L5V4oHQVxeZyhD`a986NG1h(lSe6LIfT{B7jD4-?*DekJYkmLZ+l7znb#>XwMqilUV=Zlpn>HA3Kz%K@KO(Q z;2lYvrmgEHu~qGGI|D7|s?+-8&%|PQ1KI7q4>1tzWLS$mu9=+YsAplJi%Gihq7|@a zTh^MSg*&jIorRw*+LLd!8|3Dj3VG@2qh%4^(1yGTp?5i7aAA?lgfFWi3PSqa9)`LBJ+x8*wuJbF+^)aYD=*&mXiZPocn>HUB|o+^Q_amz6nakz?JN zMJ#Bz`g_l5?OByXJF58B1d6)p)#=P^ifkRU(I792&GtFSiKe!c6&i70)OANEMIVV^ zq^o=yaTEaUb)}T5P6?y8Ur9A|LuUg&>oh{E7Yq zo8sdN3L8cSK=<{7Mm^iM>U$97&yU7*dY%i>#GpQVCTL5sV@7{bLwXu5as*+zG!_KF z!q4nuDXjEq3g7$jRg_In!@M;Pk@|SgZ1!sIW|APw<4e3R+(fARUPS}qX(G;BGI`<; zVbWoryVSTG;CWkZ(r0nxGf}W-y|JhtnUy&vq#X1la3-Z|o0MYPt!+PBh2l@k5NA!L zTV=e6mWvNPEXEo04e$tO9aW34S7d4D8}6KV85+rN>+dWFym7S~w3}sN_&()ifZ`5B zVolS%gtS6fd|-w~?VscHYBx%fpV_H+wpCmTDUS}D5m4Djn7RlNhZWbIaDN5Hl_)d# z96kx~0hZ{PrZilT&q* z47lhO-&tME#HE-_x~Yw2QpTCW5KE+l8oIkZ>zN33{pBcr=brxKVEIh}fSZSQV5YI* zJIYfu+ujYYbJ?iv&Sv+!u89nZeDkOhd>zSsuib_HWO!(cuW-oPJx*FfJRDbjYM%w* z2B@R=MaS?k2r5<6Chr}=y_i?laj5P!P*;(E=r}NS_cn^V>0u0^MB|qa6&~{(HMKIu zom)jlI~`OUSf)6zRBBss4!-yH8v`$V`cz%Yul*4f$lvU<`x#CfeyBzyljp@>MOwYy zgy(kZ`|lLP$hAxr{+HM&{Tt>MjLMn_hHIas(6Macb~^ESGBJKL#gD@DZ2zb{{!m9R znPjSvM=eEoD(~;{>707*LR>SWLY%Cczh?9r`@mI$>@)*uzDlmv%jkS^t!6>Lm+lH7 z@_n@&|DHKe24kg^?>_O<86Qx6ONqUz=-Uf{acIQKTA5!)Vvnm+`a&^=Wn3>P`WL8( z$rF_CuVWm|nhMUMqtQHw_A0Kt@XTDP?3aDDI^nxAfpn8To9eegrYT(hiyaGJxOGMT z4(?B=9W9Tgbs4DOE81>bCJSSK2FdCo`yKvR0SKebA3yB^1SdG1Kutk)kD*>VguEVP z#+5`A&HnD}L*`)&W6Kk1>=OD!ds%H`G0qr z=K49BaeKm=-Auwu(C@~ej5IXoxBDRM9^ly#du@(Ru-}^ZKtdiRy7wytM1$Uo`@q2* z2ACT%Mf$x%GKsp|ieBiG6Bzo|SK=|0C_E#BqT=Yt^lV^P`OKA+2@h-%os}k(N8<0SaD|RE-+;SW(@ud)4_Af$0=$;eLKF&t0Jszh;^q z-85ZP57&DctgB_Mz;NNzNgC1em2fL->UeM$-~E1a{X4qKjyk$Bk)9UYQU?R zi$73V^6qhc*H7L|h?ULIeX<~9z}Dr0&%=ELw#^nt;~xppVw;h)fQZ4jTJig|%a_|` zWPI60uHvqTJ-ogk?!;>HJfZSaaJ}b}n7DI$9y$yLD&!#X=<4_Nm^u#qkXAZjZVOkF zd?$Kp3)m@@rBVddR%wkCy3)=UNQENIzgkCr2rYG>;QmPZmdLUZ+B)%C7%ZJf0Qn`& zWBhn91&AY-2XcOPkQXv=c$01DBJ;T*#nzNxWW!*e-XED4hhx1@j$WJn8&h4V2y7EmU~9=VY5RK3E4`Z zFfr>hDW@}gBI_}v=(!l9njjpbW|D(eHs+W3W8#EFfgx1N zzJHmQW3KONm~9oN5Rbb(d1g9w=PkbX8|UiiLd)rS%`3LsCXqisE{5Vv*Av-?zbRLP zY3NcimLMJc-pVt8KU+S3=}g9E+9%Sy8Y1{}guD687*b!Crro^Zt)m$Z4||)KIT;(w zCK4Mv%T~f6KX!F;_g65Iu8aj`Pv7NFD4^*puNhx7Msdt6p5Zbo@+Jxok}hKAZn@|( zq0t@cJ^mB2h`T1HgFTIny^$O5naRb&NvpjH%FO-M4HMhC`r>(o^R)ajJB+B+RG9s!xsx1QV?y~>)v66_Aas_ydQwQcuAfy~&IFw8rhYb63hkR? zTPSXdqutzT#;Q;Ol;n`N-M`b@*|{N}Zu35?E-~ z$YFD(@8N$2yv5$Bm7GqmUDH56z8`T2G{U_nCsm&xP&`2GiDA zW})`(m&sfAD(}mFEm^S!{c6X|Maeec?CN!-|4>4I{rTA5*rim(uY94aNPIXwnHqmh z=(L2&UZ`LnoVO89kgi$BWkZNSjHZ~kE;5m$D^$I|loptSL|utYrOO@^J*N}bdQ9VU zZE9xQ|A1@w=H4eq3eMW3F!JWM-!(uFHo?B4NlV`1_m;`PwH#2}S^6M6;-6orv($QP zD;u3JUZXD|i@J|tea2OSo<+8aGz$`x9hGkj^h)6HsEf6lQ04-zgA(C>8iTcch(1i( zY!7_d)e;aq_*O%~nuk7rgQ35g-K1AH!Wj`W{Tz}oet2YN zJ5%7^yMWC^-SvuqD+3W7?Koc(0oONkGR&{(+w5)Q(k)@vUWyhTb0wVWp?V!z{Cvt# zozMFz-MbA+UBt<*67Bs%jms>HvcSDhM)etsCt7Ge1xBrGG6!3 zHK($Byo>*J)S|>dJVX*a&k85ar0qG+MF3%pXZ*!QK2H;iQu_lz+#_|pTSi3uCeFII zN0a1v((Fcgf>)=KnbHg+ROX{JxxpybAp{XPp5ykssP#&AO{K~0q7`{hLi)nN5(x5C zDz4-`(#g2T2?Shc**X+cA4%R> zfYutMe}jW_dskvHPk~60lhCc?`IosP0hQCj5HdjGQ@$(`^@#7Bu17Vk$ z$+*pN2O)p%?ScB^aid+KpM7A19P(?Q(;CaYd&fPGku}KP1f*yns95x!QF@Q4>SU5W zeH9q}Sa~B^&2r}}fc{ZAteCQ{S?Kk-i(t=QE{AETqj$J2_pAA=GI5753 zaQ>dn8?h&RFT$}=p3(pf;OyHY@0++ET`GZ&3swY#W2&e-irTP17J3^%U-Tk z8~m-;jhj@(k~BtJvjrDjhU5?A7+^Lq@$Nn-Q4S0hBd!v76UjDia@nXM+|6UrW+$#^ zu9RNHAfDC1Zq$9>g&&u!56>h}TVjO-ml5;m)@kZu{f0mvLk4mYMn)gE{^+tE1{wft z3M!GVjDor^ov;l-8;Y1xT-B9SA!=Q#rEyLv5Rs2imSM!^$LA-h5^|Zt*lrWn;bDE? zZ7FB~xue6jAHr)`>*RK_6UqNGAK^7dXv~Z1yu{G_t+3e&xB9!mQR-JskGtbu=Mc9- z5-*g;|1~HF&8cLyoM8%F-O5PlMP<3c1{=}NFmRTdBql0) z=q!6gE|^GmmZ&G@^R{8`?y)aHyQJ7m$*FIA+firTdT}3A&0u8;;x{Q8xIsj>*d^-( zx_`Uv*qZ49yDyFHfBFWXuHb!Z|1sy%4jBrV8e`^7ko{dELe2LDX3=BImoJNRZF5A5 z+sqNa)G_u9%Elg6gU#E#0Ht0w%UjZ~zw*>SRNpBYKn|dQna?%aDzYRb@2mfGe+PqW zdqf&R(|!yaB9-U9l^ag|Ywppc*{+MZY!WREY_s6TN*3Jh3h6kG^a-ZP**Bc%_Bgnedvf;2Y>MD(G>inxv{bR3DY}}^HP2%6w?TKn zY3o0O|F#nV0XbP{3j8<-{^y1D^JL;+$7p2gU~I-{=ICZ@Vrgb#!)R~f$@t$@Q2(Q< zXG~!u8SICs1Oo&__5Y~)C8{aZ7;B+O|H zh{Ydw;XIHe2Q#0MyXp10eVcom`|aZ%@O`>=3dFGA7`%*S6A^xC+(8_kf@M$B5$1&5 zjy{1EV<<9{jJ%EfxPwr_Oiortnvv+FAdGnfyI!L?JDH)e5b}FuI2cO+!y<--1({EA zAwt2_7iUluobp}^EPwh{1R^;x6{#t%C$!mWnBknx!lH97*Lju7(L}tQ)Q^JQ|2H^yWdZckk?7ZyDgD$lTpMQIP~HZi_gdtNpsp0_a1vKInSl0o0kAN({`$3 zU856aJ>#5x46;mX>>qG-HkX-pXpRM>Hf@@V7?pE7?xDXZ_VK@DXFTj|(!<-7mRUZl zQTn3s$G$^+cQ4Ni@o;qu3`?)@(ibv0=mqo`%sP4Jo5UH0EO2W&26R>U);Nd#2cMp0 zak#4$$}v2KR&Ua3_oIjkGa4wAAb#H(^BOo_kBhV>P<-&8c#|+&WQliBh(U!Rq0UU9 zgO^a3ccB@P6iYM`_?XQxbVCqwhFRqD&P0F9c#zq z-ees<=7cUoLI^jssFEe98Vx7jtquw!WiYCB+^N0}jT4iRyK+iJhpuyxayn-X@AO=! zMfOqnZdF>%p61=gB@~-wq=XLZ!bL~Onn(U=p#7mqNwyqghZ+6^`r6y>?bhK>v2K{z zE84+dX*^SJJ#-#BnBd}g{#{k7Ma%G*e%N8B*<9b{<#-KbU~$2-SE@^j1ADgpLnD?_ z=&C8VIAgS(40yV6uWw%%3SJ2 z1RNU0fWbtjy#03k^~JJ=ISs=-ha%c$aP$J2_)=6sVr}6U3U8LEcYho7@p6<&7;jYc zo;JiYF;S#RL1A0%iKx#sdgV_s(~96Vk9#kf##iJ30AsWb{mmhl#GzUA%Re@Mp*>mB zhCAZEK{ekP8_jVn{{c6V9SL+)&v@yNAl?#_@RsdS*!P)t+?No%sL1|;8eIxK;-vp*7A_rBc3k$K3zuANDp;V~U1=V0O0L98} zvLdRf)6M?_7iU{sbcYB61a$h--2QLws{d?<|EsY{7@4>_ID7q9e`{5dSJ)Cl^2_F8 zc1jW{EG;cPCKWndTIq#!YDBA42174^iqAGnrXy=J!-GlxqOe3vj9wvJAXIbf>4*Xo zK3WQ~Fdu)sKbgI`6%-5reg)eKjzUMR#!#j@P8iIJa*JW(=9KF($xzV!^Emmf2+_-kGxjz>xdR;r^HTngoxpYwKOqQtq8>Cu$AvqWS28jY0nrPsF_9bCh z5yDO*#0~R=@mz`G?%@Qnt1I_@*k}0<%HA=$(yrYSj*}hRso1uYip`3RifyNY9an7I zwr$&X#byPacbxBZ_tWE?xBDAo-}j$A){k{B%xlf-T5}Q|-D2$`bN0WA?klNji<3Um z9^QZpHhh-S&&t{QHC{c55L?mcUA%SfL^D5w-BK}C2yBr=(P6~|4jL%@4mC6#n6Qu0_-IT(3<+`)e3PaNz_SFhOm)ldI*BFQ;-HxlGU%Z z0xjZ#)U#qg}XDQb?u$8@#*C@6@q-iD$OGqOUQzW*f2GR|T# zI)l_BsjP&ogSYAIv$D+UC)pyi!E*T~cS|so7|eERI$vQIGN0(IOY|#nVishTkg4j5 z%sNJAE++XC?4O`H&hEH)1`YzE`=w$3e*sNNL))L${|TCzYF0ni#nJh#;C|wx1c0+$ zvQo>{MhXRkfW{vk#_cU2e*@&^TF{P1RH`KDNFg?S76|6E206dx67pt#l*nII>7>gi z?3LnFF1bBzIbE)LEx)}iS9gO_?WB{5*Kz@6G*J8HnCU2M1B_71TgZbIP+Kww2sY$) z^uV5iN)rZ(HPF_-k=@`dsV1oMsoZe)8;oCjUoy+8$u^hbu{V#oY+0&LLUDF4MyEG* zbt|pLrK{m2B%!cjD<@(N$%r%~6jxnAWgRY9T=dlrBgyp14YYs5nYJM~{mZ*)bHMIC z?pU$I(SIjP2(LGM0Y}j;u^?j`$@*J`F2t@WUGCX#(u%{*ks zzT>c!;>icK`uy2{nFD;>1-pm^Wv|OL_GhTCf8J%A&GZ2hUGB1^LbT>?0dZtS@HqB7 zQxpKfZZ|wUJQ%^c%)P)6ZXMUPMh?IpkfXZrke{Ewnr8U2J>90K`?)(bb{i+4Pemu) zs(Nne{+p7l`h-V_D)K57_wia~uq&AHTDBjwOXWtVU;R04xBqTBYFC+YP+}2l1Ac2~ z8KvdS?P9~o1iSJsXW^00Xg%?BU$&_m{EZQF(;S!BdJf0U((HGDgmcl_>O-}4zpCZ; z58d^eQjMW$%^IlU?{36LAa%gyfxN75e%`EY=$j+4%?0Tw*kOz`P7d!HV#s??#VjG+{rf2*1e;)88d zK`w?%A0yloAt2gbfM7$MiyvBVI3q|~4He3L(zwLXuziK7)%k$9*_Z$%WRHC7Z)cM? z@Ef9DOYKFjYYD{{%O3LjIT`ffPDm)3z#KMyAWJlSAZsu@>Y2zDJYwPrq&(||mu_BV zHPqy!OC+N>ag#v#3kDy;`)INddo>J7=+>K?6yZE6;--m=rZ^&-&z0Nb< ze{LB6@3Fa^vFZO7o7;ay^jbsy$YozK`Qg{|<&^PXM)dz`C1z{v=wbh_%3yH|Yv=#m zY;2-xVf(%#iyj-vvT<;Hh=A>_u9p$PV4i$cOsS&9x7+JL{F>}Ty3QYv=@H*BT^XJ_ z@7Ri_^dqMr9wH_QmV|Aju(*sg!5$cmC7$U1%eR%hN8z6PBF|naS4pf?9oM~JQrN~G z*CZweUmtn;1GW;s<|k%m7;#eD5y>)+gXNm6o}^xD66J^2G}Fblig4x&F|E{^pMS3i zXV%qeA9MyH3fEq^8-700e}1d~IFYblQhj&&(%v?L`|pAKpS}J+_E_B?XzJL$91yMm zT1iE8n=^?@C{zv6a`Z}c@Yody6bP}33)82V3bJ+wH&RQhi{|betj??7SbEMGvpWl^ zP4lTssq%l5d3>fvVM~-)CnqkuJf=Oep8lSHJX}q8gJ2J2!aN$)VR*$HHP54Xhsr`| z%2IQo3E>sJWY@!*K0B!maYH)kWT@K<1i)#;I4BK~6t|)aQ3@#AYxWMa2!!R}c|vew zvrNEvGL`yKYbeL4EAHT9cI(F0(&ba-ljV*wCy||xW6Mj;%TW%qsZ|~P24hWP*P5Fm z`!U~ETXDR~44^mJd`O|)y=ePeogBUvWNoTty|*5%-E^28W6!hH^C7PDCo>sYo`)iS zCbrg^LzVh4#Y=t~Lkew@D_AdMSvTSnDZ#MYzyo!U(ImSD;Yob8`Abr?c{0yl=fQjP zfik>ez&hIzecx4t@A^HJ_LW_?9^Yo_k>;>&|8;^4cDUjEZNMcEK#^y@7~wJ8_$D02 zOYvQ7bIPi|ONKX42lnx`70D6pxd(8vyOlC0!$&2YKrTrpo?=tQy=HP~GkoZu&8Q)8 zH`XSkeXwH0l6geTh6g#u9#oe?hPpXPNEYWThfl)LRe>k4@70u~J8Y08u~lRyJL9S=hpx|MQhU&i!e`Ww;~cej8YJz0$dr|m)JMWIuf%f5fq&TX1kcPWe;cs z_K6p9dOW9`0hyEDHntS3QzhLVNm{bRQrNcE4QI@>U3bnCO-pyCdieMVS=TPCpXUN; zp3yI77i5MFS$EY}{cEx?^%r>cJnS;CSFMf7o-;cu57dQ`F0q}`ftR-K4Br|Z3<<`d(P1$bUB7#&8Rh*Ie@wIs@|DsP@yg2 zKjg#?fy8m_uPw-?1*&Xt{h#;z-%G;nDfGmg8VX@wpf_Uc?iEr`KhfI%f*WcJ>f2$Q z*^o*2ifD6uQ!QU%L%jq@tP|!MlX+uhl1@g?wtj#9L(}Ff$0sD?EW?4aNfX06qV+@J znYj(Cr6Jr#)w(;Ps`xZ3Nc9}KEWa;16AU9-Vw;F}72*X=|Bmw2^uChD)!|Gb=bo}` z#V0!euedtd!WuEo#F%muO_A!Fo=cKYP^5qxsLLfQ<&k_TVUOPr#3kMU2!HE`-x@ag zJ;yl*ZGcT074K{sx$h;rBT-rW)OB zk$Xgp7vyz_r~8)661h(o6~`dE0;7362X2j|cBNFkfUJ_0lL7nDv69wJFrn~Fe0|&OEuB~H59>(HGLWEaX0R*y%E2Hr%bY;2T z{FXy@=bN00jY2{|b=V{taqL zi7JYV+u1tH8QPjzTiBZY@7R^7EN3_Wb^1EPmerXrDxfDU4Dyxa0$t>HAPSXlKr6wa+{W+8`(+g@Uib(pSk{lFq_eE}N!>krSXFn%PS!{t(hQwQyxhDv zqavH8TfP-YBN-)XrN*-9+jr87J-YrZEvb2k>pjcfgEqWM>E4ZHQBsd~Y&T;a4ar<; z)q|3-2z~*Cd}NKX5>qpu=D<_J_Q0y)aC}rV1dCIXklQuHBRnB%HW}l47b1T%mJRz9*{U| zY0$Litzwij`vGwbXDPVTdbP8(mCYReAe;QV_t|z(azEH~@Gj;Ogf;@xbkE}s0o$x zlNJ0*_76Hki^KSU@iqnX;zs9L_S+MmG}co~5f4MQtVUUNR@u#OGq>XMPW0M+L*a-+ z!?!2>{G0yxjmgip@Z%YU-`swq{BVkB5{SUD;FRs(q&BqM7w*es94G<>>>|<@%Y?e1 z`Pw;HOEx2gm%!w#k6FHePI3&angwqv^`}y<671zfj98xMon)4vTB2{Aj@Ld~H084v zJvbd&XoVJGCSyEVm@+W3{ooX4rtfuJ~sudtS>r60eT-%yIBsHVJ4 z{+W+EDLV{H6G$R^?k>Q?w_4 zt{B^Aia~FlI5Sg!ymOf(YiGt2+Lf4?bdwjJd|d~ue19#?GdyekX);<+$(z+*uuC=! zKTIr-Q(fYYQ7xsxYexwXt(MW?{FNAVfJd`6piOhxgNb3cPk?b1?!MLk7c~hQWLy;u zhMbMQg*GS}NyU0FY4tH6jkhl=+-9$hW$#RyzQU&@kAU|%v*}iTNPMxd7) zbyy{1xR^$u|Cpsq@rIm1QiFRQm!!Ptkb<36s(sW@O?60}hGEaDXrm6qBGFBgg7!-iA* zc988l$;1e)1=MmX!8ym{F|hU!5P zH^z9kt+49jaWrrZWs_bZw=fdJY$^~AU`pKjMyQ!hIh;tV^{LO`CBx}7MJyt!K0bP4 zI*}pJ_3N1;b0`;g^z0}U`FNT%nqA&u`b&6EWLjcxr3*q(^Jy(IM(-Ls{_yiT5)JxnX1qS^XUW>dD};SdSoLE-;s%qpIvW${mWs8B(g{O z3v0RE16LG7c*A%yJ|^vly5eHT3#{;VtZI-~%TOsu8tjkO;G$FWBR$8sc}w$t*J+E1 zKw^&s5M{BndE2!}XN1KCsH(w!{z<_cODDkMac#;^N!USBL1D!Gc514?twIBZydpQ) z+1@0ng{B~F)Lqntq;U-uVO<#jvqRNY6r*i9CT^JJ8gGb~868=f51LIZ^#C*)N^izM z90xaw)JQ`@sLqgbnzX1nZCAx48Zxw2D{BpEYAp#I89?*95~`yx3g*GMIWnd>14qzd zR&b1hoDt-EOeU4t?0|IDdTPC^sXeqpyFINd>yIZ^L4pImo^Jk?5czwOKwrL4iP@kZ ze|k0VcTM;Pwp)C?{Xjp|@cYQ|hsX#&)E&^f_pp7B_dk*FhqGs{IfFZ3GySFCA6BIF zQM5F}|Nc=b+QRkR6g#EyAh<6N9eYkZAB5cd^K(=98O}>e73Gjov?(H^y)-jdJVir* zbVz>b0nO-?1S9terY%gP$d&Q&FFl8t#jJ>KX_m@c5~^CAV(D`wdBs{Q4Tk>YJ4xRB zz?5n>NiB^xpK4!PL};OKfsEv%ci^eY^pPE-v5mJb;H=OtaG)tK=?q(ef;!?t%fLu% zg(H2*&?o}JH_bm9?HQPyV%isWM|)zdEQaO=DYtPLqIa119ay!~Ba3#&a3HnG5rhzU zvrbWa<3)G-NA6qaLOvdUo6v&ZEzy#PWhAm)B?biDZVvS4?k~`P0+NH-iiYo3r~(K5 ze+8s}o-0!8*fH)60Z%!-c}!@4bv5fp`_d zzZ*(*(JHbl;M7I%GL@{osq14N+55X+@zRm|XNgPptzFChoxu)YLM;}&`7fhQI6jYb z!`csA_sC)RMAsE8_<3DMzPd_*R^yc z_n9Y`MoMU5Up;j1rY)|rpR}=jNl!k^sQy2xmQ_{bNoSv)^RGz8MhD7KkF0Ms`e-0k zbW|bU!7hJu!t`lid=AdUlZ3U%*o(hQwa+Vs$+w8i1(0Mngb_qTmnYQ3r!E6zY@F0# zT}&y$Mbyavi<gV4P2{82hIqX2^?c#p(}&?HXyJMZD+Md80?2aVMP92iKG`~_ z0*r*);P7_%e`@BvXmnn}Ti$3QT4aV@8T&0Pt6g!22P#{x#4PKUEfYV>^1jzo^*7D2 z*rj{FAZe{W%vDo%$+uRo9oX~!ELg_XH!*M{&%7*D{v+tzAu*)eBFZ?65XN zXP9St-v9RP@fMCP$tvEHdAUOM$-!~m*B__d)FOMaLN4~oECDG+XQm=q3LNi;$~FoA z0EgOaA3}q}kL3nY51Tzs2^#7xJP#L&C8_Cgm2LFSp}Pic60h8nmQtLVr#F2SJA%A1 z*fMo056qQWRD6^cy#*)al8W*IJ*cIe&A6ttpNSTF0^c5|KK&XWOtO||XX<|UZq3&? ztsW6;ge1J;am-tbNmPA6{;xIsFQP2pWxBomYYpT58$SO33n~>2jjasLO#UOu6RBe5 zgr(-{8TMlbZPL|{Mv%(vs@2*H@ ztm_O;hyu@kw4?XbCC4aRdaS7@!_}cj_LJjd_OD-`Xgy$E%uN2;I2nUB1libQ^cKJHFe%wu4(58xJ^ZQkm7ZjZqS!@;?E#7|mK*jah+DgL zMl?w4bSlH)0fuidI-j4r`=R$%P1-&*1fRhCF^}eC3PNqY2d+^X7&?R`9%t=uN$A01 z73Sw?`}hlscra;QERJj0qL8f5LKF{6pY3)LmjKfmApH8!t~c})z5a0CSo zxdfb%u>doR4p_*sgv~kv-2#zUiAr{^V7DT^ za$bJM?%7%>8C5Lp5Yx*yLJ*yO?Y9cFN3RwO_{sz4^RiEh^DQVjuoDIxeRTo6F(h*D zHPDHOKy@%|R<=+B2wM_DZgmopAI|a#QT9iSf7Tdh;usY`b@6ss7x!5)Oh%`rk>+wE z%fuL{)=^mO46Kts#ihM8eIuFu1)NthacfTKFLR4 zS$F^H=mPCQtl(Dk!@x`9Xt350qaviL+!Fx`x6eyZeZ$cwS>XLna54l{($(;QTqRp^|1dxvmPzHTGGK^W19W-(EWE~`_)S1i#sy0b^ZrSpc*Lz z+sA}1dc3@*p&sCdy!qTI(pw4F>x0|9q!o{fhIHHq?oL(fa7-8M|75V0eGJzFRT!Y0 zf-FsFvl!aC1;{@<{ho5EdoSLUEDv)xwo1hDhJJIVCdg)JxDoj< zmqMP+Yct(ZuFafFgv?T)D8NUe0JopZivBc`i7W&MBd&p(P0 zBBQ6J`@bU(b(hvEdEIPK&IDFH;e-1N=f>%D$PY=$YPt2dS=@|5APM*(k=uNa6^1xw zn#kUs@VXswN+)P0FEy8R ztXRhEms50jk45UNJ;qJ@n>fU-BP)k#^4;3T_ztuRMT!JkKjNh`5iI+WBwMI-uEgq1 zo!pImH>NZK?y8#uVfrRNU44;I7=ATYkExN%0)POh{80M<^H6)wYqYOzN(LO_tIiDO zKN3BSW?L??UkjM-E7|k!K8%Ekt;v_M!+$m2i7GY<^NQ%c4D`-;iJZ`|G?>^ei9$CR z`pB_>Az&zqNWk`G8?PF+jnlHlGwmD5yLF$;!T{k;G)vaHp=3@d!&gCe*58b~45!xy z!CyXqK@Fe^;XPwz@}c*~WT~8J1NmT~&f$4tWDJ!n2hocbcs2phtgsHeLAC$C;$$?sl8YW%fRg6e@6H=QcNC6^NPNtHnd) z_!b1XlM~0-z>`{Vyi`~Jra&t9l?27Jx%r>`0$o`19S|H~Qvj~$@#hpru}5IR3NT!L;x zqpy`}OjCf?GPJR*`KxdMGx1UbLhSJB3CMikr73U8yLzQSjQJkYwFJ(UJSQ@3!{R_l zr_=G}JJ<2VM0B=(H@JILStPzRH(x`nFn2V3l9NWQMd6MmVl?(q!mpfGMza3#A{Z!! zZ3MoPG5bGZS?GUlkzF^I=aOSlA9|MOmLIqn@}aPJLJ_UtS6vQiJ9}fQRJ7sM_*V*D z@8k~0oBRDK^9e2=sOwhXA+DO;3-)|a8=Msgn7F#$o=xFRR8phFoHr&t_X)86cF=x_ z8@rcm(BnYGRx6j7dfL63A`ta4a|pP~$k2n%oZi=B(13_T`f@_J97h?P$Ee&hbJV8+ZKWj60U+t#Wv z2(@z&UsC<`JcY8;D#Cj%{G5EPwSh&8HCn=8_@KZ()p`jcnMt9^KF$yF$CN!}gp@;a zo~Bl&on&J+pDrG;k8_#WY{Lqdl#JHEmZ}cxCxOl|LRn~MdP`8ljcvRc&K2V2TnwL3 zYcjkpi_5@1YXvE|Ig3qV$`+v$ZF(1!UJ<|WBV5J)4@i?bB>029|E)scUvbc561X`N z5(r2R$-f~lzOYh3@t~|tkOc`v_ z-;omelokeTtP=sEa}>7wUq&ef)S5byn}c%UXK{mYs3|Khm?CL06ms=!HfVWfjIGx*r#l`u;6Ro}m^tNlMqx#-i+OYwc10Mx zR}d%#@(2lC_NnA36~+qz$O_;%zp{3vhVLUrlcYZF*`)Ks9ZoT1r)&|$-ymo{7*y<6)ewG0L{JE2j;N9QDnYh>t z{}$nIhv%+Y`?=UdJGQs&{2W#HUgiHw{h_OvaGUeG%>R?=8hrCp0bG#nTEFcr*8fut z_{n^2eE5n6F1Yw&X4?_GT-w$XSraN#)LJNupU6cwB~6WmRXWI2(1+YioEV(KkZL;u z&lxo?D`MLElLK&5pv}i3p}BFCM3Z`!%s0f#U!q@rS%Mu%Z zn^+AppZ1(`R~m};#8g|3sndQoU73zy)Cue8fr|H3e_L7)$!K-sq5j-IyNWD%+uS*% zn}kww?m;TAJ-tgxnY3}KDeq!&bz1y#bC51JLWmEP`+?jpgUUnsUN*BOi&){8l8+`( z<}JD+hP1I!1IC`)u?_4*C0Vk+Ir6B~JsTR7FawZ+QzDxU)eJ@cel zN{6`V7BwKP!pw{ooWyB_(wic|OeK^jm1q;|Jkj0%$OgcwFDA7l1vyGo8z3e|h2bh>=T%H%VBmLH%LZGzhAcPq$g%N8{3tRV_Ax>$IuoM2~b0 zxy>*;7PN7wV=^XUi9zcdv4bm$?nR%V8Ci~tB+=sJqlkg%1r%CRV|aAXsdEtypq29_ zxmtZ}Oua4614CppL>C4?j41YqMsKNqGANG;qgnjasT)ZcbjM=dcaOH2x_>Ogp>?mQPDXu} z)g+NgrSXYPup^3-Mj1uVR%!p4NJuSek7418k0nD=SP)-lXDt zL5Lp8Nu-99K9wA)v)Nn{BkCP_-RO#$7`>cUm%l8{g>h$1oEn|=i!gIGJGxZiLk$V0 z$GK!QwUDOqn3m>o+(VJ|Od#iJjTElz8;XFzULgL@dh1*Z+e|t+3o^kDr0BG{f{f-d z9<=B?v}kJU^tED|1W8d+S!^;G#D`+&JeLkYvNh+SYinSm)r4;jhJBiN_r@@1$FsNKgz8kTIk3Q9PFoA!*66TeAjE<(+>LLr2Tds8$cMMXi-$O| zrJmxW?HahCoO%M}<{YvoMKqydej`P->Txjsu<%H&jFb-ri+CC#PjXP-!-KL;nND;Hy9h0P<9y5pfd$%8d zkx=>~ys$Bv$_%K<3?<`Jx^zyV*z{<#$c8m7oPus;H$*xVH(H3nRrynyF|TQ0)TVI# ziCO@`HZL>$Fe>qgze(ZaB})BqUWA|j;D>pw6$QVotiIG3Nw+RP_3oc^c`4nAEJGRE z==N#ptNpRA&sL66epeg2vsyT+a_7g@zHbv`wo0T5MEdAe_%S!C>rI}p3bBRF-$(2C z%mqzoRojHEbWo%k2hX$Od*d2jsnQeAYm{BbDX){SlhcVMqQ5mx%1`A-^Sd6tUE)6} zGe;QGtv8hryf9F(QyAUJ>)U3I0rN^76w<8u)*~y*7PLl;7#=l#%Diy{2_^5VwBwzU zt>Mma;mM6T_BTG(T#O%SotEqb=7%&kHCWW_e8}s=e~xvsXT&aiTqAdup}Ww1NyctF z{O)~sd?MYQ;Wp->X1{mD2_Cu+GPhI%G{z_90K%dxLlT;>dGxssEKA`e>6$IjZgkvi#aX z#s4U`cU@eJ&Ur)CQ9!Z4-5PNK9pmPRuYkl@3By?l;x-RLYQK@$xG}?tdq_XuFSijI z)GIBSKTm|!7N<(@ub`TrQWh;EM|#aJM4#?shTrEqZKa8?D=+zj>%abk8=ke@%(KV| zd+0Z9%1IAoX?wV)u7@%?ZtwYH`L*-np+9L#eRY*DcJm^CWSQZ_A)7+6;Y7FJ+PieV z`TVUJJ<(?m6DB5s$f?*dbFts4W(G84Yo~R5{#fm^1Ab|Bp1VwX#(=#?X8-kxVr4%| z_p+21!?ZkYaP2J^CVS%XDz$WEvp04l$1>g0X$XPi?gOPe@K=1kb$tDp=Ak?O-C234 zj)aySckC&lE9%Mmri4od+ulSxS!l{^}0O z@bDwD8p=UHx&dmVCVu ziv=$Tg&l$o`g~{J8~MXxfs{Kvk?dcsiWU@2o;Tjzlw7~rk559g8g()P#~nbU>LP+* zsGD!T)jcrPvprwv*k{oX+UaI(ze+vxE5~iO!@VsXJ-5DPA^c>`db1Hbr~-TOl8&{b z6Z)8nJGi2cAsmbS`<^AA#RHTjq~cC{L}TtzD;uDw2W@cw-CI4RQ=m3TQ`Z`kEt zIitx5CMmCzR-wH)G-)`tz$aiImh5l1WJi>hhTfG)+1mEOJx{gqB{nx3LbN?eC2}p^vhUGCyn0HOs z8*-!MjWNB0=Z;yu6E`s!N;hO;F{m1RJ6wP^&C1_FM0w-D9i%W~;jO#{R2bF1j_Zh) z64L#0O1U|@Qz?SJoH|~OHm{A7xEllPTh$r5K{UIt)EVm3#ACSQacV4? zID;|g=?Wk{R7}?sN=8q$C)fvhrh{w|Li0srz44eB#HxYN|7qVwmnX)?Hxh_N|`Xx6aVn8LWFV-mUL%_&CQmHFd%0i&d_T0z;opwm@SKsHbSd znK+Xg`f-DNeY~W@V;N{+|3PpuI`PV`@OSt>0rKAQ<#w}cjP@oogRg@>4xW4LlofN~^cAugP>%?Py#6T;D}p15mjWMXUhzHSz@ z1hOZT>SNow-gJ97Q)jao)my@u`Ieb_kAVFXB^nY8!_8+J2f0PVVxy6t5-`)^My@4TjTZ1#a+b$KGPrG zS1;+@?bcv)W1n|l;+ossPZ``!rbiPK+-BMD+u%sFg~48YzSz*}&pXoH!Yz3)Lw%}X z>VJ1|yJ;rwb!hD~dmg|zVK%60)OINR(@kFK1zJ=oHYx1eowteYi}izc83J5<8?i4R z`}ysw37158d!bHRqj!7*pbM->djnZMVtV=^qMiLEc9{c)O|Aj44`jVR=32vcU;>bP zX#}l#O$ELrkMIpzbE^HzS`Q@|)y!JlikKBz^Dea`$kTznr~x5TC@) zjJ=;QzLYA!@1ekNePF_jhQztiF)$G@??7D`aG)-r9mSRMTxca;5lsu&3FC$KNW2kL z!)VBCDA@M_Y)3^T!k6Rc+coIh1UwOK#M?9W5d+DAA^;gc2uc!45}F#a8Y&_s zz7SWOJ^Jnz@GtVE3|E@HU>`G36=)0?M!8hr%CZOB1qGr3C{fhVppHEG};t-1$l-9SGGOqu5h0i&;=L)NJeHL*AaJz+06xppajF5 z0s4U`!s#{sHL*2eOwuhG_K=3ZndI$34Fi~@Qb=^9{va0tbo)&ERDtxsN}vre1nrxU zJK3%hPy+3nh&$b`18^8E>$^M2t`v|GElb#)X4e8(jFu(jPO+;AG(*c0ac9`|03M^= zhGU`XiMliIk^_@bt0;6t+;Mgff$GS5QtlYLi@;@MJsEd`-3K5i@|I*v(lte2I>3&& zBk`J}Zyj(&)DeHp(B}elL)#K@XWaGdbL~R_KA~(WJcI0t_dx>)NxW08QTikRgrwdX z*ML4sKsL#SXiMs~MV}c=Ho14ywMQQo8I=CxZiImMXb5BAEm=Q8&SMIS{1B~3?9WbJ zi{iAiemPfnF>)l;sj4g!B30$#3ez_fePn^IlMa)BR=J$E)v%iRB*zO$1f&8XkNHyb zKBz)ofQCWHW&BxzM$d9rJE8FX-&k z^G*n$z7G{ye9=Cpt_zk8o2%=ZN7OiNT$~(^&r51fR~@U1_$=fiZhdyTDY|K?F{{O7 z(P6yAkokPAR`MzoRi3wQm7;OZYLw|F`I>jQivCli=MiyfnVJK5a-!#Ih`%d<@SL#7e%)V{BLf6qlx1Pf69x6 z0e>75C)CmIx9&J5-KhG_TjQuHWya*(C4r_MaR+D#M+=gaINxevkUKs$$>=**MrUt|-_uPZx?Gb)6-G zEYeQ;Gv<1db2<&!GnVA*^##aRjQ@Jw3DOl!=%)<&rsy8b*=k!>7Dv7YXctJ;QHpiO zrFH5}t&&}PI4qTIEW=k~?m%6rTBW9^r^lF;EbE=X=JtLzSEBVJ40G3al?D+UQUH6V zwy!NUjSNIMA2(nluujT^pUPsfkhifH9UL)equ&kI3d|rI#l(qKu>f$#I>%fbi%@G3 zMv8565c*>FbnhLv-WBuFjN;mauE~RR_b`Gpp_%%nb#9t74UD2!+PQkXh%%My%}kMf zXWGhe4SaBAI$W`MIr2f|2vS?^Rg5vNOTBo;^S$ivhQ6kK!(G@BWP|~I6UX0;UXL{| z*JKBL>(1jw(P*qHogvfq%_$)uDiH z+6&5sjtIBI_>5ML2S^^a;T#Yn8?d#!xS#Fjwt;LrG;&@Qdch&;jER({jcTS4 z1UUW$SKXX9ilL98QsaNSnr3-Wrlc`T^A7rk@L5kj&wG)K^oiH=xqHQ@AWeSNHz#>i zUC;p@B9F~OyrU#eZg{3>F|tIH2zmCr9e10`nw+4J)nTnU)vFvPkL2DHn1Q*zdD;>X z+(#W)M8JFjH7`E^KZHO5pZ1Zkt7)+&zhW?uV?1+TjE9h>S#@H;kue!u&uz(MqbPnx zI;Y>gu@eqIM)Lrem&cKf5HQTQX^~oj9X>@6M@XAZk%SxGhe9yhxF^F!5QiUY+byt} znUKc)_*t}lO{oqj>ihb$Y&2(A0q5KBJ+CQ-u@_gq;o5xxLbMf|GeWVIv;Eg=i6slb znVyAdA%RN*WfNFbtYj*75PlLiFpwQ9x{@;yj*UPno*jzDX})H`YUv!>5^w3SH$o|g(Ed77DOfG}GQvaP(=?@KDHFr-*zzgrmA`)SfxY5^!NXFx zY#CLt#`m(V!Si2DW)HCycpMLn5>)Z`r6expep>|A!O4#`OrA!q{up+jW^O%CDRG?; z;1TaKHlij#wXh%+B#6REz?esgO==npch0X!$tRJVpt+{KE1j2vZJ*}y! zdbz$k@^<8VthT$@W)&+1I8{$APfvLJ`q(TFQhw+0Y|;5!U%Viyu1Cf0p-DZVejhWM zwe>P^M>=G8Idl@Fv|6v7*Y!8?~X>wDIz^)@$X|u0BBcLP{x@g^@&zGg^QOe^tvv`{_x7W<2B|k5y0eD=l6?d zr>nG%YRn~X3cc(Tdc#@<4reU;TR69+8bZ} z=_Itt)8gcLT+ONd{%!C|Os{d?j$jqea!a39!&skhU{F!oz4@L)`k)d4Zo!rbbBNmS zT~)pCK(q8YyMqql(5*B#zTR0n={A00#v(Y5k7SZlP#hsMweZb=Jz={zc#3_yvqcr| z&VBLa?ZNN11gvOYhLehFv!up0@U}u7l0c4;6R!0{ySgM_Q)NuV*Po%# zX$~HdBkz2as)q+AW!t_%NoNiL? zTW02lDn+$YS3qM~Pkm)fVkXde5}*kcaxk0oS9e|3cB&jyu%<2^$)JCr0YrfTd#TEk zugueyHh*&DPyFsUHx&r6D-#Ej@f}MMJD+e`ujn``kLuQHy+& z(i8_C?yb4V`+8!cM0&hyjvOf)j!m9NBlTGRq=iSLW|n$-9)Y>jQnq9 zmRz(DAFqeETB5L2mL7q}K4+&oRdrikJV_9@7_1!mP8yZneno}lQLIb&m0G9Fx@tDN zbzFb`v1XNs^ z)oRsa*)66QXQ{y8R>j+Qi(0o%+&Z<3G&9%HcT01Btq4p;HA_q@#`*r=2`vAEvUd!U zHC(cVyL)%{Zrj#w+qP}nw!Pc7ZQHhO+qQZ8#LPD{=S0l8_lu~gsQOWVRz8_;J(;=I z(jsoCX|avRAae+VyjD0=3ba_nQR=!BLVjOUDvSkH3N&(WnRrY*h37Aoj7CydED`~K zv{B?b59=HZ9PH93rzU?gF|w5PP;r94Y?lCK5J+}zoaUF)<^5hPQ$>h9PLT%ZG`noK zrJ~e56u~^CA)9|c)U*{h6BZ|STE@)XWGVM*UiQkz=m%*PkG4|T5Aey@%Ffk_oOTtt zq+x(uTLjL%JoA+@S8XaJ!N5IsxGcChcvo#V&(~^^l$kP9(IBUg8hvSwHgvMfO;OMs zft1oJ7yj%nXA4(hpE;RN)R>=0Q%W`e_&sMXsQyVl zNLlcr80EfrquOR!mhy9n$%61BMf-$NuY_ z-(O%{TwrU6zS>z|Gwbyn54Q{aJ_^xUhv#CNk-m(}gf!>eV46#V!%v%rQ*1OEZcG(> z%J}O@e^IPoSLzC9#;Ek)kN7Z~!&b)7ZCRT?EYEFO{irVbk}^R>!jP6c(oQK1C5}wq z7PefGum&rEJOw~@O;7KE7ycG8yWfI4SsN>w>o+0gn^0r*C;ym!Wu4kmVhz79Z!&;H zO>4_Yk0c(4*A;qC&}yw$9aS37Hbc+fbEHACr$KV0g*P!mvX3>lD)quK*9J&ol)3Yj zp7jgE_|bRCB$dmT$QsF(KJ7x|KofFg;u+YJjG*oFvyDk_$ltsQpB(ZOuGJrUgPMqU zTjFRFDg25ZWk@zZ>oJTMf#h!oq>|1LgSW^ zOR>5x+?pe0Ko#5SNG|r27FDZiSpx}hZe%^umU2k4h6Ky_&)4(G_J1EbL!ST8{a*dH z>>dL*hygQtUw;=lp_mY-Ev;_Et+1PftCH?n5w_+Svq*m|*E)?K7{nw{*L%q8cCKor z5D6F;L$H($I`una*YE|Fc@74qCw8xp3>(=ky~=M7kJ6ES9kuD;VL$%ZCgdg=*y9ZE zc{2HWh}6g#=)sf7Vi)h}D?v&qAtjX}VHrB$gD4M^a4 zMlq?FU^DoWk?k}j-qORGFUo{&bN>pB+9#xDGp;cfKfSJ3?@7zBGP;hMo-pF7(G1k#qoZaTWhnNoy$Gp%}CVr{au z!9^vk$whv&?uHQV=!y#NplU_5@kMd8-bHn^(S{Q4Fe@+aG^=cO536YQ2-*S(-Bpo{ zF;<0)-iB88SW7T>q@9cx`@Z&%F(m$*+Vf&EUDQ%C!&Py$?hiZCuwqVyE^1MQ zA!>e^_Nuzt2&=lhgEKSgjKBCsA7qQPI`%jL3*~CR(i3S9;d{{Afw2} zq+-^ER(jcm9;e`1KO=XUZfe1WVQTJ~c53OFerom{9d_w5!r>8gNZku}pVNzH-}4h- zAE-0dF4sH8F4jAwR+?v`MU|(oMUZE#MUiKyMUrRAHN@NRR`!!=-@$0Ww1FlVIQe6Ja0XlionGyAN%-nx6Q=@b?Xb{Ur*CznT`Q{HF7HQ_7Z z*7TEXpYE-Gtu5AjoCLp8e z8~?!ZvoeO^!G(Wn;Ty?5=_@&={_&ZAYL*9#P34>Pfb%mx=KgV-pL(VntX1}#{D9!o z1|Ri&J3uqBcgja$Y$V{IUj6pv)YWp z$t8+uu8XQJc;~#IHve^9PVWMq#8@N?-PWKEn$_4oY zHzX)n=eFNpe%u<}n3+fv;6QHEUTc2bI^CL?V5$|Z6GD^={0BM6C#1I&5D###4L^MT z?3x_GlXw&;~_2uT4L?#@}v3k2GE{>PDmY&EF%=CF-sO zJ!{+Dr=(w>Eguw2Vb#m?oyleH*NfyAoq?xXo{%G3u^kpK4{eG#uM@MV%KaD)SenL$ znqNNu+<`}c@rm#IS*)!6VUqv(H;a`&dv9WnMppkR=@!3gJPuek%3w z{^R)h<+$302Y^zS0~|XX{6Q}?*a%12RrOFWGMI#u^H47{*aU-_(UM+p145w4)w;8J zqD+a0NkV(PGTWM#RBD{VAY^$X&B1liv4pd>Y_ZNrhxS1y`OkHkxI}21lEa$RcoDmr z)A`hvQRPJgn(AMC^=2Mfr-_`_NBMYV^aZKrEBAG%$&Kvb@9tFouMl>R*^-z5#oF@w z8S;B-`oSP8rRa*J@!{Trz06jtpwhg}l2qkFIcLdYH?^i|toJ@kMwy9E|4hH*g^{{0 zh2iy6cgBSAaZjo36{Hr_{8IkH{%hyUB~wSdt-sQX+S5DU7$`QbSd)jNhbik@``q&( z8OrMcH@R^fM_eQu&bw>xM3s-Ag+oT;&d!?Dg0SwX$8AoAwS@)%&5nkyC&zkV{p@oc z7zg-+{b0gQ5qb%Fd$`1M?_3g3L|^t0ruKukvyBi!)_fy)g&UN!eoX+js;#ccU}imfFWJl9zHpKUoq)eAWi0HvcK%8X31P z{UZ<+^i4GgvGg+d!iOL5)(^&&g8x>yp* z!g!j|#&AC=z0IS&4UmzS&WV%w7w$}CW{onU7m>pi7sPMketSw?duE5?~S^)PzCr00IQD zaV&l8PzE@n185l3(nDs+)AbFDb+iYaKptf=jieliM}x8d7f_})&|l9GAv1;32tkm| zys+80Q1?{BpbjvMxB`czS>OrxzsA@yF*SFHCrfGEe0Ql`=BoIuRnlAX(d>&BvK66} zS2f~t5|7h*(CK9o(zT{zag5+bVmO(3YDx^j(1YTb`D9DEUjIXA@E;*&%Jv>O{|Rx> z54rK*Q6&Cnh<~DOWN&0`@ShyVM1}RAst3n)&gx7p9S;ftd=khEUg}}D&3A~v8-^rT z%7+}iaz$)scVT*|cvk&D^QMb`+w=QIE@V|HL75!3H_pVw*yJgLLHqmb{vOqr5DQ7J zCmbPcC21>)QOZnxuA$J)On*6GQWlOg)THki>hUYkjH(;3Gd% z@QO=6g9E{kOLKmO>_Rug#T>7d zCj^n_#Rv`Hp3Z)`tg=jUA6f`p8JJj!Qp)g`{-!MAo3x76*U(cAs1AJx#TX^B~UMlK+#Br5JeItFs?PP z8tE2qO4R>QUPxX~`hx@!eSCSwT#ZX~{a~Hq*^Vb#Ctkbi8UBM>gK9IbDqIhQSe@{w z9-4%pA+9QJiD{}*2~+&v4I zp6S8J?gV#wGq?id?MR^XY~iSyLC2$(EL#$1My`4uobdXrwa}Ed#NViTXQ7I1iXYNJ z^qVHE=2VJa>1S5cri^PC^hoZrWOVAMh_$fwJ@B`odF4mQtsA&^s%4)WYO<83mcz>i zOh3j^16atE`p`;< zOn=Tw=oPGsy-N(UcjdSD*9P0kg%YzJTCnGb_T&`tCFXZGhtHB9;ubH1&)O{n zom*tIUt7bYsHPIi&7l&?E1?p~7felWGw~M&R1E2%XJ7d9{6DxZ|0q=?u`z5gKazbU z=l}p@|8K|bKmV4gLV9W#A%FXbtreVZE(IE`I9cYNo2E03WBJWYHd>4}@wP`bIXjZ? zGq;-2NZIU7PNIduA|2qDkisY@diDpKun+_D#8f~9psXRgzabu;$%74Xj>_a ze0+X9CSTii-Dh6=;B3E6UHVsVd(rqZ^<55`t?UmdS+CR-0~PO?lRUM_8A}OgwhTch zGra<_=o}oWA8j2EI7xesMuM#D_a(P>XQg9qq(oz8zJy_FN6;NhQF}J}5wo=0h9fq& z$@y2e-Z-&X_g_k1xEQcq?I>J1>ScufZb{uSo|7ux9JKgNVaHO`@(MbCRhlF9+-8Rh zb9<7$;W-{?(|(gF?uq(b4;tKxpSrz2_`AhzCh(de2Djx_fOBB7pYt;oGP>o)0OxBU zP(-aq#_iTb^0gH*y7dMU6~|>a85uY;fOEGmUYhf8U>>N-`cIsb{xK>V{MkrZZ9$j>MyUX#>%#y52ixzJH$WbFnLjt~qa5k0xZy%IXmKiK4eCX8t`Y~6o zQ;tB)Ok>LQ_^VD)F^h#OWz-gU^5%M5rmgKwRg9btcomYTu^qpUW-Iam?Eefpcqf{q zJG$8l&O#}Ggh~HSwF=Q62-wns`+NdL!KIYzpWv3C<TH2t(Z$ z3J%@qZTrS%1KvsGS; zfdd&&OQj?lpe5b4gpxq>Bi~hdY2>xqirjV8L{HeqeC%cPAZp;qBU%*(3O9Lcqrwia zk4Pi>f~buIh826PHX?!W711qAu8O}~{gNKgy^p)` zq0l#M_cy?2*NEhcY8UxKq_5mns?WqWFd)2UJaqX_$6wSx1+@}=!FKFor6f>~lUZ!|O)roL@#NZtLrl|(?b?Fl+=6BEq(Ai0}o~y|u6qOe1 z#5xgvvIsDs_i~_!Ax6|Bsmbb0Mda@IVH<4RguCU*wlJqeV?=V&?BFC6Pkyz%MIiU&F3=fLp?~SmbNDaq0?oG7)t6b* z2U4k16&c;#)518BBI`w!%XWS*h^iuqV?x)zhV*Ml;vFtk#Ua?oqMA(&Z)HiwkC7nD zwF(llRyxYSj=y~)Yp!_GlpD{Tisj5KMlLunqNVi{D>`L7^5AORDOe}x&!Pj=5wGf@ z@W~mus93^;DCVma%>62jkPgQb-Q44*k#-@o3#0*7YhlNv62h^unFT4sEr~dhJP{`) z`Dsn_Yn76dV;yB^ye~ac0~R3ir{yYisXZMv(sa^?RXJGA$f}zeCFREk7>|?* zk7(6uMk->Vzh=z2T!qmnDp)1NlJeLInI~2-nV%v3DW&*O6*j44pN@5!e26FMPM*i3 z*;jqD=ZxgGILgIXw`KP-b-HgxayQ-5p!H#ye1|w%H}e+m?Z`gjfH=C&ef5Amy3T)1 z1-Z{;W?qcr-CXkYZ)gb z$qs&<36O}C{;U`AGE&Fqmy*=5EB02M7-d$^?D{<%7ch*Xo#Gx4mI%2`4urp+RZY}r zulcTif52kjHPhu0d}kB!2a0#Clo-`VLS6*xG@%gHj7-0gIOdceH?WO^n$zm;>B=@U zwujRyYuT@QB~5wCdoa?E2hku|H?8TuCb)SdKa^L zMoNlDOad*FB6%UUy`Uty$jwxV^{FmOXHfSoXAUk$K{d8rj4P+qY}7wghsTJOs2!-LC+zuyl^fC798qPRj)D zXzN%zb&}j^;WX#b1F8D6@NVjeZDz+6H3W?`%MzD3OzLgZciWQ6zo)E_j%N2dVjj_) z;k+)@agn){5mdJ*tv=Hb;vYu?zaKw9<>2%=_ zzTi^99s>He^JXqbZU-*OYJKVW|XY4dphmP@@k{2=K=l(9W&wA?pVCRA=jUyDyWR4?*8M&lZHigjA z#k`g<#%mSqX>+m1~(OjHwB`nIv;E|Mb3jyTU~t-Zv0)*VMEzD3C?ay!1n3v zxU=9;_r>T!O$Pd1myU+Yo7`Ocn}k;^H}f`}OKsPy;1Zhz^#5Lh?ACS?p{!a6Hg3`+ zt*C@!ct}##!$M?#ir4ma$tPO~FSFj-F;KH=yR?pnOvPoA*C9VQX6H13E zigKW&N9RX=RWUlfak5V?mEoRga8XA|6WElbe!3)&5!Zv#ARoxTE?a=14J;^M z*|xe76KLqtzKZ908L^!?3wvf_@-~Uy2(FNF`}-vyYkD&vAeoVtkYU5)YV}81;fd{d zW0L3l>Kl3o#@T42#}QMJb7x$ji*rvRgNA_~$3S^tn4U;dB4z&_5j^|mbKaSVcA5%> zh%!ty&JHj;R5fWf9NAkn@uoF`$+Oq1(m^UtLZOM@s zVnBC88c{$Cd|n@N&@-&H+?{-wwYVvFe!ZQTM^fhcxc`0^rtz_L@iibV7p%+=in(M{ zu|DT$lK-zHvY}qsiegP*h9Bp%iyV{VcpVqh-~uDVhSsow86eBlfj@~Qxa+eeN=sp7 zPp<)cz#wy91HwI4S-B9SP(K&Z6)4N;We!^RCaOyXrY9r>_9CCVN&{juXCAr z7(F{Xzx+L;MgNM{u`^xcC{)^eFUzC#MiZy88TLk<*I z;p+l+u$tmuRYHG-GVw>ZY&T~ifj`jMO@!fJNBNXFiLKNmj2n1&@t~tKP@@Z+42f0n zF`V0x_FeD0BiQ}FxGXN-Ujn|O%ZmkMibv(F+H6=NU0AoUR=wy+7h||+&RY9I2~^a_ zXzKW9qa1H!=XD>)GlCJZmzh;}3+~mWPCUxzc$kO;-+<@6fWAaj!n)@x_pSvNGpW(k z|8P5faqnFN_E|iM-g{@S zC?~6UN3+}oK#dEQg;~poT?BNGpDoLCf<-;fucfD+#b0n}jcE4f6M2x)B+I}4V;ENz zheWl1$?jqxYuYK2;U#+g4FCC+>Kpj($`|n&V)ha7`vn^ImSc}p544)@{Js?77Y&$Q zv@MVt41#l?iCyl@3TLs^>ro$^I8B8<1M9!SC>OPQe^Xtp?{Y(!^G)N>8DhU4 z&O3e;Ai?rFRtPu#xOil{82w=m_GohYnU2GfKQeevRRX%SDKp$y6=R}?lC0H6!5We1 ztJ7UimbFRaW$x$@i1DJKHy!3fAB?SB(c6eWrN-6`A8fpl^Z^dyU;)l4-Y{K&7dU>OxzjM%{Cxr1RKsVZ^t)6l8{VA%TAeU^fapEM8Kp8}X`vl_ z1(^+;lQ>?W9iNHs?oK&9&%E9z9-|Sw z(}+{)``$GOxeToH*!6G09mIjzm`A7zBe%a&M-*sv8T;NH_F5qjQ@Sz2I*Wq0&?4%H zHlY(e-`nqoat#m;!)2s{$L{|glKevu1=vUxF^yg_Lp|u zupzprDjotH7#!Xz7A7w|kRKf1T!1fl2$(u?d%U4hefyNOWXa-I<5S*K5l&^Nd^H3) zCfvD}W#!Y%mWx&6Q`dFB_x0q3r7!eN{oS~S&DO2Y_V>Gvjn`Q>EGKY|S_W?4WeZ^l zhkpx2fcyqk`ZTDW3>e^sR!}Bu&aQ6AXD7y0eEK!)o-AA|9I+l_KqxC^I-&jhFMCJE zfZukEA=81h(6E6uDK`E_oT0mHWeLDRvuP%`E(eiz-O>BWZkg>YFz4EUbt zI^etIFKHW}6+!1roFvKJ)VH1jQC(!uo)jTA!80N4Or9c7+liCU#5?aVd~iHadSu>2 zJl>QvU!lNn9YNV+^E~mzIx{!gWZy!oADaCV7~Z+N$r#>+yUQ5f`Mb>+-o?A>Zl~8w zAAC&gU+!%RK|U85sll6EM+F9qq_W=Eb}(wS9Apfrqa%8|%zG-Mx|9E(`o z&61lVi;2~Zx0|Y(tgB#C)c&ri&W#vbxV8vmSKY!a7ci`*O=`5UV3fMbYty+w4Jo^Y z?TxiP7hQP&tU9-BrHc}`N1^gmHdT?j>R7N_LnOEm$r~T<@J5?iF}cST5fNZB#3iFC z^Lw|)7pl#p%+$-5@wrPH_~v2vhB`J-C89TEo+fTJQO}1+EX;RWor8LKNR3BuP;8*v zIzxcXBNjJk@L(}8I1^<4crg8u2lr^~Iczl1or#}x6?QId4@g+~1gBSKnEGqkpbOat zQTj?HOdw>eoPn_RMr0LR7p|+Y{4^gq)cynvzG1b(EcR%U5k9`qv}8ySFS5X_`w%<% zq!LoXI^^5YSf9>aJz#m&Iv3&AJRkTpBSguNs&l=?F%vI+w9Mix_9-qk9;c3S(EKOf zI6GF;;t^V$*1$?Tb!09YQB9*Q{LaYWd@I5+ZjAtdCcdpW{!~$e+!|&+eXRg-Ey$?d z{q9MO6+@kE4yaWawx=3qQ=?8 zLL(jNDEe{!kkrPcoH2Z{dF3>TR01stp3oirFFFM_L%kZmm4uO%1ubzRlB%L$q8(>| ze7YGhi305+5@D{WH7PoAfg1_6W6>q_DIYm|&~=>N*s}6qoOMZH8!`nZ0{zQ4r1v(F z5r~j1Dh4;TtQY$%P(7pu`@H#lpmBBmXx&^=6#hm@I6b`n8#|fI>B%pLdro)z_`3t* z>G*WC7%324cI$ZGA~h0Msisk!CMP<+6UVYWH_@CjQ5=UQFd4~&Ng}O;a0o3)6g@4; z-bg;WL>ze{y;FS*w6Fy2(awof_6ln(-_0hGQlDR>sj_@t@;_y`0 zWa=rDdPh2q3Ggs;tqJ6NKm9Ih^MQ&S)tvA^{a9-ALC!T|i)*R0RqyzZ5O(<4TWPm8 z>4oz=KE|U*tbMGgE}+@o3bo9uO6fv{NRYfTHR`fVK}{#df!P9*e)ML@IDP#$!2ZEw-BLYd(aQOwdxUNI}Kx*}aq{KXaUEyvk6ZO2= z+}zxv+(Id{a+gK(&Ndlc1g<&8if~H8ELk}=v8V_`J%W)pDXtT9j7^q$A*FlX zrAc1D!NZGq8r2T{!LSorqw86_Ut0qoyylJ_QZS$3seDcya^5e7VvBar+7y9n%I>hg z`bcQzZb8}Ds&2eJe4mqvLEj8t8&tD?nXy>C?FC6qyN0**0NyHhh@qC78fb=cMGa>c z0fQ?dNyf^I2u-)LZF8u2^Do5pZ#68IBIu_|0#t&o!kMC_8#g^^oZ_cKMUOKEstF5Z zo4K@}I$AM*iHk?dP47d>jQF$FR^+bFLvd$0@Baav~@8wx+uvUmc5C9Rh^L8`rxtuOFAh zaOQuamnkYZ8=tOF&%B)+?p%8zCpHT#Cf&X=xiK{u95Jb-;|*ui)QBZJ<%u6k6X&+^ z1Ap~f+2EKG@Yj4dUq?C|TV*hl0L9j-M$;sW|JfEfpja9)H0?pmGuK?pNSJg;%bfD) zzfjQOe-H>tl-IDBjsPCz3rVxwyBF-l_$;CvqfabSVAe^QfCjuT<0BmHHMF+GZlFv( zyYK3<#afhcZyL*qK_~tWv*$75c9CjfMn0F(NEzRDY3~{4_EF_ek{kI}6;qmKFLOsx zYD%M|DLZEPYl2{IMel=2A9}|zT8+9B9Q`?!4|ahjRP(8ADwD^l>5P_({mh5S=gY7Q z&US(=LT5KDC%Goa6Lu%3XlXv8XK%7kCmF?f1h-YiEu#JP>z(Y8O)?V8H2Of64CaPB z2UFt}u@m?g7R^45%MKP02kQN6Bhs-R+jk{D#Ah(khml86nbsVM%_>BDe#~1`1Jl5v->@rn54(F>3zE z0weJS(Y1mEgC%j)5x%lLlWlF8v8g1G&}t*XdW)gNB)?oIz~ z>8UD(oAq0E5FX!0*G~NgL1ib@FO09mI~gQu=n?~t1(3z5JQ8JB{XmK)!7hAFy=%Kx z(=wZ!E=Uber7nXMA9AnH;ZluK>FYcTP3hw{pn0>u!b1YuO5#s3jBcW7H^$4{QV< z=H9Vo)`*ooX*W&b&7%cuu)o8UhRhq9tShKNizR5U5KF*8~&LGRdZm1CT z;QLUYM|}XwD(p62p4n*bm$D$XE3`ojju0V(xB_dMfJ0)m6ij%uZYb>UVN;gAlc#LY zrZ8#mDfopD^Sg6xgB=)UIXzW!Hqd zy?EWTfZFuiwN0w~F`IL8xZ0yoouNurN+jv`8lHvYACbd?HFO>7y&aWfsM`IrBDN?Z zs3o(4QA=fuvOjljNr;;nrcNY%_WIZ))QX6Qv2QnTH$ifmjDDa~)|}o= zR=|lFUWsXo_w|=pjuHBZ?b5~ToMBXiE1PIts+SvAquEHMs8uga85iV|&I(gt1Q{FZ zDI3gT62i2R@#~8Rz|Sv*T}EF)1{FEO9wz;a>{n6zwq5Cg7_5Rkqq$i5DPjE+)FLM) zur81{wUo)zV$OJcvc{EN4%KRi&3ynJEykEdXdut6Wo%86GajjZ$>s2yD$rQ|fC`e>m(ru6{iDwWgMT@{km8DaGm;EHvI%}}}7 zpCr#%0ABWI0RhsXWz#mHBew#}N(_Mkt6Rur;o{?jq;4Lp^FSg)0=4aj=?$#5I5U1< z8=qEBs*_qJlDdB~^GKm^oM2!3)0>S$ zydf5^6hakF--%VE^$c?K4&vorsx}3VNn*vKQ>W>aSh$CKELtl^#HQUvNKozaeEvS1 zdRNxzpWZ!J+_vuSnz|64^<1D{Q(hsS`_%@tYmPi``^8OGoeHVUL4VDmVKzWnk_(Hc z@bzCVSpV;xTYGDhf9c$M(9Z{B{DdjyCrtm_Uh6-8W$>eYtY`Kki%b3UEm5A&+MgDV z6Oqh^ccWL#qaN$-uOQdM+&L(7=pW1c#~;BPR7AW4^58ea$*GG7m&zv=g~4r6ZH{({ zrd8tAnLaH>J3JSIYq<+?&VZ(?-&}yeW7Bp07 z4{?yE<_(1u82(8{+iECN^rqpA$;mxE&ls?8g1pb8T~_NAUe}x3%;}Xc>^R)v6d0l+ zfii73v3F1dyC`H8v@3)71JrJ7hrKjsU_Fv=3$!o^dMJqa@)0a3h&qyfTe_#bQ@3g= z0&%h~C_E=8raRq=4}QUi+lt3UWpfxW>?U0KQf=F(+D;6r=A!*QUyE0O(5LrydR(kN z2VgX%61<^yGU8C*RNw#N^r4w|!oB}<_Je-_Ci!1-;Qs^nM_8K5!P(>=@H)lR{sZ2i zW4v3Kq-XmXX*@id7-_XS?GQ-i%U_vNzRlHqvQDC0uMa-oB%43_Oc=L{7mhNC6LE@J z=d9!!!WOYYqN7T6_uixcs^}S|QtsA&u~?@K_C=Iyp7unsY%GvpbgEA;eYLk6XT1T5 z&b-jxV>%utgy)~DEz*h%-&PdWvW{yC?S&xy7nJ2=k$kXVq3(=iQN2tK4ik^Lq!?Pf zw5z0wDZ8+tNzOMBMT+GW42FUcu*<8(ffO*G@Tx~hc4_cyiW41hR;&HtjCetEl@cAN zvB`D;`V#ec96o>jbISyZh!6eX2cM81oc^~>p8tuHtEr=v<$oYWXB|KbCv+~f2b1(p z8>5J)OH)%iSCDChU85g8y8_(e1*MjUgsFn_`J8=NIvvimCsDf`g`sBH%Gqot{~WPI z5S|iea{$+;3RpwmBAd;2^_TOdM*)>sx#n?B5X;0y=?5tX=YgE+wUZhkgjP5a)cD}6 zLDRPnr^)+_Nt*UD(s6_*MQc-|m^WeaxV`B8Ai1unv%Knv4(>b7V>iI->f~l?S(NOk zpyVG*0^(wI1(Tw5gkR;+!axeR-+X*>BYRr>hClX*zwB2)@y|ja_{*C_Dqr=?SwmWk zTdrF_LH`-5gHRfh?Vntw|8X-T{J$Tme}I&!B4x8q3&mB;`|W?^v1iQDD5|deYYE!4 zRv!v6sqFl~t1P`bqf08+**W5u>t;G2-^~)2oeI zpb&8ukcAj$Cj;KB9K&xcL0K=}kB)gJzcBGTqKVz2a^j=ou_aCL#2-{a5|L4)>wtGJ z9YaU)sK-kB)U&G{v-rB2#-?rnB8VeM#&q4<1~gu#Ki72#Z_DSy+Y3H%5*4Ep4aUq3 zZaFd5JvN^dd#Xt6Omg;0tW5=Dww=hU11tzGV@!4CDS>sw*8-)Ahz1+ABGF`55d@@e z?{-W@)*%PoHOX)S0;Z}D0810v(TkNg{ZnXb)v(n_&AH>FSF?74U(3P}-)qHm>s74S zT$`JJC_dpMK~}h)3wj4a`^H@O_txwNGLV3ckcSE?VBnqKSTaE6C4@unM3Z=g$bR^p zobcg~kQ5_Gp@z-Y7bmVtIzyQE>PPTg8o*c%X498d;q+n&wpFREk_Kv&8dpIYl-6(! zlW5tqid~7xVqx4DxxDosYBQ5+1EwPGo?rQ8urp~*PRRaY3`#)lwg}Y>jn}7~tVZxk z2&Mdd+rje@#XpJp09TSzEiZ*0_9os zt|3#;4;|QXK#&_=F_6bpi0ePRnaXAjx0KbM6WUG8)rt6t&YBH_d`5x&W{2~vy7HC6 z#`_{eM8%w;usJ?oRJ^1dC2D%BLrvdMDZeJL=ahcD)O||ofh}68F5wSR^BZn>MtYM5 zMkzzH!~xb+2s$*$kx{CQ3Tr}9jnw!&9?W@E#ozq4g3o}>o7DBMM~V}*go7&1#QdR? zR}&QiN+~*%DGSZN1<|~&5xN@vE&%cjiV0E*)~9n{USR(@Kh&ZJTBPg&02==Q{o7Jv z=%{aFV?jkvOUpz>|Bo!W?DTM0SFWRZd*)I)=Gd_v`(s8e6zV>hWRz`ZX_B|v6mLPs zuNQ7V2mIJu#~S-?aedw^?WRbupy|1 zQ#_BF>21@EC^)aj9#*_e!_K4WUH{&2->vgC{cZQu?d{0-*ElB`pFO7b?HzH_AO z^X>YK2X@j;(*8c}{G7cPSxK)A%!slE3@_on(Q8h;-W@8qIha)sk z&=qC|&c~Ym$AvEzbdYt5ZqzJi8-&lq#pb&Ib3Y;!6Gckd#E0>d-AZRQTORA=JNvkgh^@$q!7 zKzVQK@@@OP!@9Dl6Xgt>wR9!jyLk=o2W&I9>&YKHWa7pW?#D7q3tnH7vzdA4_r)Al z^x$Rq)Ne2oI#xQb{M&`kgq`aW*enRQFKQx5sGf4n%ya@rkLd4=Hh*#N43-d|ItF{_ zJ;BIv04rUjM`B_8j+f+g9+7J{0>-`<)WE(0cIVEbDUv~@UY`FAAh286F)fS@0T7Rs z9>ScbBV|4-?vz6YPEcE9xSdg4)}9m2Dn3R2OjI{?efkOYOInRLmbCj;tn0B|!#WSl z)*R40Wf6$+Y@|MPG`~mBR&~82Hzcu~;tr@AZW7FEJ7rf??YOOW#5^Sr6KYKd+}C_I zVP7ig3v8b-|7XOv@?S!o?;BzqknP}RwoE_tD`Y-mnghk{4)*Ss=^Z92*2yqeZt%WS z(w;_;!<_E)b=!2~Y(D}B61Qon`D>8v>3X#^5$;@90S{7B*krvs@O0$6d^FRUYx1nS zP|$TjOlLo}q&fP0%_%Md-aug9Ho^E9<3A(2(LxWcU~}boP{PKH?*3Pll`-&P%)DUf zseC8IuwZGN&|bn0nnDo>4J~FV;BWWN#lQs?uS{9=bdaxAE6wh`Ztwx%_!~;B5r}I# zz0Z-hPTCVkiAGk3jL!`{Kn6qIv@PKEtmIcOox5=3Xhb=st3;G{IQ`HXgVO!ySZEQw zuMqRHj!$UB)E|HSJ4TNB^|OSuwt%w&UL4o~0m5Uhq|pL?spn!t<)^^kKnpkYKZqBv zIO@*Z@@ota6Mo3`!ud%CtSBT11}z{xm~9Q-v)*sbfQ*zq>d6`2>Pquo!jBoLF;XJo zpauILWp@WgV0l^NPMzw4XTfg^un+Me9k|TzvPu-+(#(PhOgiKo48GsH^lsl?`)_^8 zOaM6GBcP3mAn9BC0XwQeHH%hLy7kc?JZuR1iS*l=%f>%(WXxxQr3fY&i@6rJ@95Q( z@&zcRh8ptL<2z`g!C{8=MO?Mt;BdZ0X!yp)IfCU`0rD=BP4Vi5>T?J(n|yFj_UwWg zAh-|fR&`QNOeF^MqP%dx`(JmxM|b-v;LId`hNk>7c!GxRDaHUI3#pB@)fYYoK^0^j z%l3YLBZ>C*^)sZSx-m$gjrbN;ED8vc%xr>|ayz`5dR4TBMe)4N7MvvJz(HmRp;l!g zxT75jj~PJWmhakI`GT&!K+kVoWw?}56QG=v;%wl3z5V345%gpS*{IGpGb|ZFZqbtd zW!xaC%_JSegyHRf;2;gPv_<^Ut4aoVjr7;sw#ZEh-Gj1AOj{mNO&7@O7!Y!puS z5Pp%^O`5VG+}794TcZ)G-}=?j?4LfcBo5UvVi%8F1b`_5H4HsEm^Gev zd_Adw2J#ciDriD4L`b%3?=+X116&vP4jPG$Q|s9#8^y0$UlbVL7UU(_5R+w+kZVD&vupZ`G)toSnrC3PkRo!xM*w!H&ON z_16$kFCI}JC5E~zUwyRg^$Kn0@ZYC*jQ)B=-brU`s;g0U|jd%z@#@;~>ztfg>T~|EcXF_f1&qEH^T@@Ne`$`fXwlg#EbqYebt)DNz zFmAW!h-bM!5gw^Nb0;G3awx)C9R7 zlF{k1u`&Sh^O$N6_Z#%?7jWmps@bXN^##fyId|sn&AjVh(mp4+ABI7r{vpY{t|XMi z#&19Sx3ZQgBL0r|hO>skj6)k@d&c*>X!g9v5vo1Ky4OY`F*dxOcjVNHws9OG5;+Xu zGD<>X*L8)v0BfXav*naVs&Uprw29%?eMC67cYPLde)oMONkqM>U^={N?gVl%e%A+@W&%v=}MZRNls;8ygZ^09Gil zw!+fD&MN2)W+=uJA8twk*N$Pm=i%X-d?kV`G*_YoXz}LgADK80K7AQ4p)iRebq@?G zw@It*8Qe+S3E6?9C7OCRH;kEAcQhy@{3GLmE3Cx3lBKA)M71m^LicQ97QW@5@&|f{ z&;j0R?Bl*tfMnw__Mbwl`2>CXi*RvPaSvkz~fuM*IbT zqf%jd+aDhmM^;7J{$PS>6MSA^(MzEd4k20rW=P&R?e>G@DXONZheggGH$9UvG+ z4hN;mjio2Z;|a;mnb5B=&*ziKBRoJ!dgy__ENwCAvYL5LJcF(|6xB4l!~VUup-)1! zj*_ch=?MOp*{{BM@t+r$Z{M58Yz?iob{eFgKxq@LLpEoHC!YTMAHIHf{yO;KL+5 zDmX5gO4?(Lc;C7!(u$xYcNGL6=Afkm7-Hv=E zY0E^6h_|z8nC((oVI_Za1Tt(~7#2F?QAz7&S=s_)?S=cN^7rpvU7TO+UVeN=(%w%* zkqT%#@53pnCQLA1hr}GxYj;0FnD*qtGT}D{M#GaB=ZT%on2_T3(AKS?z>^;?Md*;> z2@F1J&?ZS>xSA*Bk)zVUEKZRiMoJL0VUqS`^&*CD8zE{!x-;?h9SlWa&E0X`0kRln z5D84}+CHR3= z;~4?Y(mlTH80HA`rM{_!QVuh11@yzL%utF*wZwKuC8EZPNxjb+=$}~XvY?k z^C{gMfjZ7<8bu>opMk$XAGpA`hg6X{mJhlR-$YYfAd-%p30-A~c&Y>dJUA+>O@?(f zYlD=N%_~b{aTS(*+K$*0jC(CEdhVu)1A&kyoL^5A1pX+rGN+EEtonOWme}nU(Du$z zmb_&z{ytm);YfaHu$JXTT^ri4RM;tjZ4Ae3W9d zx<||Fl&fK3#*pRqFH-$goRLz-NTC4Jdr?xF)cZDdh5*1hSFm+OoinpFAgQ=ri0Hyf z9vL%VnvJ5Y>m!$UGzKTWf%)Te2!*0uyeo_ND$kbW+`s$soJTcB1n`i#jgjB!bNtOo zaps>V-n-8mhN}?#e+Hvd{;E7u3-!krR`Fc=m9PVRlM`7b?!5dHpFI#0p5~{c;PsnV zm#>09d~^Qe+c&|MCo|>@dlnjb8(VJppM2I5bV|VK&rvJxUvMf-zGs(hVKUwtHk-kQ;QGmS~x=?y&_qiy}(~ z<4FDYQv-5m$_oq{W4!_tcGX#V*GpZNllxU=) z5_>+_ZyYKrUO6Hr_(^M-rICbyEF5^7)Dk(N#iNYfWgpNHLH^drg~uYK*iwa#;!ibX z)VuGU{d`T+`BME_lvR4)=;M-?yTivJ~!3|s+uQ$$e*xup*5za_+7 zlmlYlV$Jq)#S}Ag9)pXkW!xK)E!>QuqRbk8duOaT(dSt>9oYftb0>K6o#QuQ*bxr_ zi>uQ*RYF&E!8WaTalv*RLe%f)gLtIB*J#mUHi(NX%Jnd(SOK|(UW^M{rrBm`WH}pT@appN-TB3(S+fWw70JwthjX+>-BZQ8{h9F9wA>hk#qJ<1Q?bf>t-Td4Bla5C=uJe6ZWbX-oS(2BmRRo>kJm+kwMge zSmBIZCjJql;YK4HC&dTE(q7ed?EC%c3=C#}nvzJu)CcnXg6>wf`-zd5?Is|TdP)^1 zJR)O=8>I8=amnz$mDd~_J=M5Hb+uVIP-C8vlR7Qk|&-WHcZbDNe-pQDtScX6V)i8@^axHF+C$MPZ~>oO-VNR%%m~4fAEV(eUfu0Kd-iO<-={y^#2}dT<6r3B;?F)0^!WenA@lyr zk9!~AzUD#v$q$xIegK!@L2%)R9|bzn0haT0|G0m!>fH847rNwyEFJXrt1}tLl)O+e z|6w4u0B*mz{CYbru^dq=i1HCYYi}f-mS`+NGEYjRqV}d{2PGkU|J1Lte9WRQU1ZU2@=|2H?a#~ES9fq75{|eY3%Rk zumXT(l!`xJVtz*H?KDZ{#)jfCWV}-|wC{0P2%xMtpuaWJQd8(I8 z046e8oFY25vyy@#auBLzuJuk}aC;LpT@IMVEG*&RyS%8L+@YXk5|V-`-Y~jWMQEqF z4Na`=;qLxdoO`oP!0PYP{|@^*O;m_9aE;UTv4rt0|)NA8;}_qZ&w%ED?S%yq;oZ5 zdyxo8QV3PJBp?852_EFRZ!oMT&A0eBTYc82u7@Muw$v03+wB4gdg?~b`Ora$e4+O zk8lMQ1#`|USfPU6~M!eKffky&CI>D2imr<%i)+yxw>WwV*0pk{83 zEsOH_n)v!CoOzUaWX5Fz@G4OD2c^%wC{A4n>n^C##A?D4<3|~qOJC6vdTO&VRKTWA zX?(hZ@TVp^d*A`#m^9 zuuy~?Gb=B@Sw1Adt{%36;~}foft%SCkP}0fPC|A^bY1giTUOb9Sl_R@#2^f*ej0%P!^%GV&-%#`26C#{{G3) z3E`QaGIB|p_7ow7cfoG(!!!oHr<=uL?<8UFem5*g?0uc8b*dZzxBbKGiyivzd)WQ^ zr$ix0=O`l4Hn6#`!g? zO=tI(niWz}X-1KCWE!{G6(sHu*F{6))B4$b@H~Bb{Hy|<@15;sH+Z@`K!P3pLU0+} z6%l83j)LnfoQ)-rwG@z;dysiY<6#4{aY!N$$;Q2)PxKb)g_xF?^YklT&Ua!=WBC^@ zAQDCmSKWQq@sxUON;LTLw91+p7~v#N?%Xc_a!z_yhyGnY$h@OU{y@FIo>)LHmx3=% zOkriKAhQ4Q>cd~oyZFy5{-UzDyoqpsni%~w#Q_#6RfpK>qiCO3&(D!^1fW+uMI9#)n-YQ&8tacSLvUl8iUR*H{NZc-=k z4Q}UG7-{>Jxx~Q%_Imk|pYQbOYR!}2&sm!1X%{T;E5hVip&W6)=>SrqNck?oXv%yF z1Sa1rGK^W?!N+f2_m7W3F25yQPSj}fb-XJwrdXXX;a9_DL+};d=Wlz#2a*{Eh`P)e z-aeB)Y+BTi@H`#I>28iRw_Y@w?+veGA~(~$>}rVrV=0U4dv4oWx|ndJo3M zM_ZFIriqm%tK$?|61yBiFa8qHnO= zsY27dh+>J8`jFmO6glaYf)|OC(;@>BuhS$#N(5u&LBFd%90+OVU!LvT=%OdDMMQw% z*9`X>*p@JfiDTk0HG}3eHTT9Ewt-6N^o%9;9Za4 zmb2#G4PMQ!aXVo8u0uV!g0Rl#DhG4)gh&b3I6X}g&01pVIrDQ`<}8)r4qRmi{s37^;(X|^L^uG3mid}!|z`URYbG?^#% zuvqT|9)ThB1td0K73$M&js>tyomHl;uUdJ^euW=-iDla+;k8~L+|fu8vDRQ%W+UK4 zblJHGK`G2uZBJ>*sd@2dWXWUQxd|b~sL^Nr3x0}}lOjJ;1O05&fJy7j+qCkPP4^BJ zI2&@$9kz2~cD%qd3;uowwFr_?@HYfx|1BC+iVM^n^3m=$5&R=}K(nKz3j$hxo+P^r z`hK53+COj~*6I0gYfZIFOdc4>T0L~Yz!_w$9az*B7N|?mb&+rw;FowN6{A*zcpphD z=12KYkA^TGgYs6bgC?d!O@b(_QjFBZ=_z&oQTEvbX-ii4Rjecxuu{pPC|~IJw$z9v zOnM1}?F-3zc`FeYJ9P(t5_~r-Qm|B9ZeF0I=B|gKiV*Uit2FeY{vWOS6ue8XgNylO z0@~8>s=QxcyXfGl8o);!uVP#hzTF3?gHj!=hala1Klr^g)ql6rRFy+MJU9*BWa-Sr zLLg5Rz^u;{?OH3NI|hKrMpb#}cAHMONNdTWkW*YZc82}@W~#i`SQ?G~ccAEXs@OI% z9yeFDPU+!kIeQN3{h*}Y-}LwQnV}bWcj4u-EdUGXJalD&A=RfVEN##E2TT;?steuo zq9+?rhfn#nQie*54b-l$PEI&lu*e0i;4Og6%K~C8t=asD^uOcaiQHPvL_UR|+DIu# zNghh-W#wY471FeKSlE4pe0MsXZ%>P!s{j8ZOulG>zay8d^t97q2*GtvlM=YQ4-S zI4hvogai$DUR)-m@!m3jQp7fDM2YTUKt5y+qMb^nv)J2*aiP&1h^lYDtZ%^bP&q53 ziA=nis*XGyqlBW!kVd5=bULF)J6zdV-hA1NEhoX@k)4#$P!UW#?%Ra) zJO6LFMi~F?k4w(R?4<8bwP`cs{!89~TW^201@|9i#Rn^__@KJtgVk1i@F*)jTw%qB z)fFGUTooCQRv7-MI{eYf!ym6O{Bd>ohLEm!yh4n`iX>Vgo!Ufv$#o` zt`VU16=tF45wlT~IIUsrc(&?%(==RRN_uPUSr@s;_*6ty5m0GNrbOg8jRwbRwht>|0p;-9t1&2G(Y3tUfQ~Nw9hlF<0UBb8Kjn%?U(BC znAqktE#jfGt*Wej%6h8t%ONL(YhA_kO2VP?;cy&BHzsTgu{r}}yK-uQmq;}oMcIpv zWeFXzV)`X9-N1ffPtHjiL8=!^dJ+>Qxec=^TU*BAFJU&4#NiP*LB^Hah7ygrOxi!b zKILfsDcfe}`Qkb|oLMG2)ck&!SEZ(!Tb3;ds1tYH3cXdC#TpYe8#1^;=y&SfCVZV~ z5o;Tw?aiW&gJBZpxdSeSVVN7orx`LQ(7K>-mT;b91yJbO{WpR{_3|3c*r^75!D=t# z;Xb|){d)EHjT+wkMfG&(BdgGhgRZh`Rk)B3sRp(?1Jh5)Ss^Li4&arpl+4>sH|Pw< zX*Nd~1I)@aOp!L*$}EL5!nINjPD;uI(k0*7ilmY$n1oAm=~!dRS~?CRFL4J@xl^qn zR2^(3+f|9`Apko51;T6+WOGRhAsQGFT1p+q7JBZRPD+Q|^vOXm$l}p;B-+bzOfsA* zJ{2nqN4@CQXQZJK%UMG1PiP*P1`YHH7qY^`D9(-^#aw1xOFv+k6qP>1L^5Z^xXoNH zZzV5>eVxn5>W+19{UA1kS6jlnObuRJ38C{N)19sJ$_v5AbP~4G_xf4&s*KavI(#}m z@D!a_9g~7qUWQpi=e$$51~CkzlNnJPVOiGM!A`(tHSjxrL9xzqKGy(+vv_h{vb(>3Z@&HtG~%ye7N_$( zh^))XLp7{au2#*mt!m;B?@75b#`E$- zW)>EZFi}~XX`j&tzpbs)k+lZ@G^2fw%MwUZu->#v zSPn!Rwm<>KYJ%F;#p2*fhZRU^0HV-6JD#zSv%kOJI}Y2|@kXVCEuLb_P%Z}FC98WkP0j?k^*UMp7p(b_A(pVY?&EQ`Joz6%r-s(9UU$`^_+pPo{#h}vHc3kSRWoRL zCSTBPT=KS(l;=Bt?24bD7z#-lYx35(zdJr@2FywQ{a%RY(T|S7();_efo_$KoZ=>P z`Cp9Up-Fk&>K63UxysLxF^PB?F5h3bbhCUY66Du7wlRwlBZ7a?SMw~EYi-LF1A#eTisKu- zVcQyDlB`Hvp=Ju3;l413mV(giJ5-rnYpQK&m3ef$V`nAS@6q0ca0##Mm?MSvn)JB8 zQ!f?q#ykgOkNZT4No2}xJH?>amHMCBV2Gc0J=;YWe^pxyBTnyL%j_RK+p(g>pIFmV ztGx~DkW>`@G5dKy#uuzE+gCZXhsU!3;2mKv>;T=nWka_!M-VfXtlNa;hV z7_pW5yYk;@s#+xeAQR^9M}E!Ib?~eFaL-kJ)ea_?gHi=nOpMc+dwH@>CZt53~s`_ zlp5j)T1yHB_eI9XufcL$&fRPDM45_hxGe<($_F_CKcu)+90D|5Db$ z?$h)w5Qm%HDK{=edkfGbzKYU_gcGoHuZuB~!Mw)D*Z@CMAI!S}C%GNVRyeV%MO(j>f8n_KPe^ z!q23#;QeX7SMu<%_@TYz_PDfLIrJ_Naud9{n&$t~n-ha`NRyH+rcJ^ebJsC@W!6}7W|HQLIN%prbFQaE# zw~jn2HnobygmjMOhW*$jqBpF><#BIjH7=RHx&|K_HBO?3C4p4;Wm5J~tEX;bAKqVn z_aARRv;Z|RNq^uGUAqy^v2K|31KX1~14k|{pGnB?2w}&0(@x{*r%Q+M51m&l3P&Jh zg}MnfEaH>t#ag=#t}O5-%7+_ShYX?DOT5N(xfhou=w^HdDTyfZ9_pU3WnAVBWRX9(I;Ntbi zw{Jf%6RQOQvcETT3a;)RG}K)D2(@#PBDpCt(o$bRi@up!4CRYl!xfeBn$|pl7RNug z;qZ;Dw7S1iF?_pIVkxgg3Tnk4cEF9(WF!q9EBz}tn1EL!9;r$-cg3XG6oZ6`OuC(+ zyM%e!c8$44ZI}+yh%kxHfjxAZ5vJ^jeCY1V%`zTqdooMo{#MjJ9#uJP0y74FD3Hqw zF+BwnWAE4JbNjrF)PzN2gCr&+=Ndt93$K%#%R2m*%|AU<;J* z#B#5UvGUA>Jl8+fDB${s&7V1ysQ!7G=b2Z|_Pi}D^6w=uvpRMqTen^qUpv>idKTqC zmle*S9ukODZ2&#pocbr92BU_v6wBVK09ET>piN-!{QC6?2fo3$U4nW$OxI5R_Q~Q( z>EHKBYhIgsG+yV*MK0mPs(8?FrXW1^Pew_@-{YJ52QCb_{yE)`#s@-C>XC~8-?Vl; zi-z^^@ic5gPppAV=poiW1!(mV~K0E`zG&HsF;{jD#e$% zJdxk*QtSH&$y0gDjIb>UE6nR$#^or!icIb=mncsqcxs+Vjqx?F@k(_Omfz;a+6WK6 z*D}ZkVz*=DeVJ^P`>w94QsOvceq z9GH0+g+(#f zGjz4uw!Db9tYpvP0?O*K;D92O9x$XrzLkH+BVD-(1KPbsDN@z;ZPZa6rXC~SQvJV>ud&WxFRJ-5V0C$G>O~6MF;Pv^LU){weujxiB!?u%-$tlHGUQhiC!r{T#X6$J;3U zv^S0B1>)zB!Q+F#{X;N%kwjNWtPHaFdff0D0qX@n#(Q|*zn`4PTFE(*A^~<^Hmf|E z?*4FrRC4W%9R4HC44q&_l^c~xw|5Rr;`$HTS=hnm%6x@E{&4>O`*-K2C>qB&ac8tnF#i`fbwo?VxquLF>GO)_DhY^KR@afB5e5t!h($12w&==@ZG}SkmQP+XZuF z3OQqUTByscNT5~%^p7yzq&V&YG5Q&2P}%r7HpX({+vp}uxP%>RCOZ6WsFcKOxW<~5 ztVdeEpiu%G9o&oqF?(oT5N+j5qo(BsYBHMF=okidX&XC_^Kp>Qi`l%`6=#rZ#2kBV zlb|G7FPh5D;<2jbbqj#vD%GaDD(;|jL8hitURqpk(h0a`Y?Xk$DQ>@!67 z*)9P(Bpakvx${O6{}~fJN*~M`KA4&R z^33qQ`JW}Fd6LD?6Sww-Z)XkP&KAGbZk$t(6Lto&$wBib2MWQ;%mdkM&4;tfhqcot zrD<#S?0@a{P#R*^FhpemUGMvDbv5$uOKw3fag`=Kh^g*#=@wG0I0K*Yge!>4_ck7s zCH;89aZFq>lZZ^gw=%RH-;g^dX2EKFGmUVL;%5I z20OM@hA`u8lq4LgC>R-1crJR`_KB~hWr=%P(ud@S-3Gkli}2b^=m zL(&wSM&OjKQ%4jRGvshhtWIB=4dAMuNJ*PNh1GX7O(f3zu@sWr4ns;1M41%0aczT; zeTuX#lA}OIw6z}^2RTQc+sHOI4LTz@N+rKM`kCmBr${lejmGYx5#Nn&u3a5@N$=l>YK~2rQs$EgHq>7ni336;bHlQWj23iv|QHx^VV(K!iD9z zK`QHX%QGW!Nh?@8^7+IT&j3u^7`|X<`aFOF4m;f$i&Jhyf(*cb_AR5TIg{vn#3w@za$#qDmvA=QptWFV2 zYtJlAt<}wx)2(dMJ8;EmS+sU!H0#M>s*e)g30`x`cgrcb*m_-I z-NVu;5V7Mzr20xr7?3$($2xS9wj+FaAD4AIx!kXpOU>b%jA$9#zknSbwBvVc5DsCF z*ss8>mXG`_Jt>%5;BO9jtQgEA!Exz1mgvAMxY< znod9S{hz$bUFs`(d>zN9agg{1^b}ECG(r-EH_;kSMSJmQj zFki}-RV84(_>(4SeRY|csD}s3%#jx-Pw=I8vzb3>$TSvK`C{3 z&6|voeChTrw8(PNBUAiet14B>_}m4?z#{Y5zVxmLoC#c!Xe(2aXZc0tU9NahD~_xc z?5*WGGnL^?6`D<(Ovf-bZiG0jJl&THz%0DFIaTO-m31~fE#38|-P&p}o1gRMSD%y3 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 |~qY}~qB&BCM`?k?P?Co4F$vA@nOl{N1B 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 Ptgcje=>#nKt8k)xQP5jr>0VH@wr~ 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%0AF;*W4-5j5E-J;k0!<8gE#l>zr4Ao_^$F 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

rN&;?BwlZ=q6+C$t!UYY5Yr-3a#=8|cPd$ht(C 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 z%0A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
~sqUa*s@tx zLJ~<6MEs$Yb|{yWG|jw8%Zwt|T3Fl(NbW?G#%iqJNob`fJIJQlWYcW2X*?TSC6VpR z`$@8sB-y0UozNb&)d2~0j1ck*L7fT)oaR8DWFt@F{n5agNDZ)&50uE~pfKt0E0P6r z6k4Y&7wl(Z70wdaLuP3kd$Nr^nGcc;DOu1_1f3j7X90?X1QImqWHmzPRMmyjxo9?P z9Zfc9QwrLYf_$)~6y!rNrHB;KR1w!uTX4@xnk6B08%b#5zTGf(2XsL*?pl(CCf=

Ihz>Hy8jO3ArnSI9%M+)`#=EU z1xV{c)WSv35-x`Ja0wdnIxKk^mc0T?uZMiN9ExFsUAuhn^ISd*xo!zV`EWi$)TG3& zaS0zOYg}S$ZWJFaYxgi>AYDv0D>hM9tT+=*qz_h%ezUP+nK2bJji|3_M^+7!N~nTa zR{eUx7$~soXEyAOpu;BA&Na{mu0_Xs9hPdqayMhi8(|#Wgob*nZ6o8bVN=}{d}Fkz z8|iDZUAM`iiDQpX`*dZEDn-Kv$O$z3a3}J!Met>q*m=I_c!AEqNXmzh^_7$!3+1JquK?j@E~-6hiuV$(K$`vg~C`m@k1~LA~jL^kWSL0 z0&N|ajI6-Y^lSuHZpfoBFqATM3k<=VT*_#KVY{)j-2ubVf<~A*BU6SVXoOK%u3_)1 zlo?^ubZ(ELMLdR{;c-ZVCtwIX<&g3SDHp~|Z2guZQ^a%|qKh^-Y!{3!MwinMdmgqq zGgg7mBC6-mZ$6K{{so6?Yh#PN4WA?$hyejUS-1qor|_wgTz`B*tdK%;8zC=NjjuS^ z_1f%Cvt^bo-`B_>Vqbp4@v>&WJe|*wFQeZR_Q91~V%~hmVLjZg3g(M~pf?dx3mi0YziuGOvT(^!q3Th~4p9U>yC9!>EjsA~m5TYd2h$g^Aq| zpr4Y4y+33;D*8IF2$GAizzTd)xD5`;RYTbAPR!NtzWHt_p`W{+Xk4o&sQm(dp-YQERZe($QiFQx^FoUJQ5v&D-SxZ>S zTEi)L_}CIu9!8t�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 J%YTlL{s%8|!|(tA literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/jing_license.txt b/thirdparty/epubcheck/jing_license.txt new file mode 100644 index 0000000..57d36a3 --- /dev/null +++ b/thirdparty/epubcheck/jing_license.txt @@ -0,0 +1,12 @@ +Jing Copying Conditions + +Copyright (c) 2001-2003 Thai Open Source Software Center Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the Thai Open Source Software Center Ltd nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine new file mode 100644 index 0000000..327aad0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.datatype.xsd.regex.RegexEngine @@ -0,0 +1,3 @@ +com.thaiopensource.datatype.xsd.regex.jdk1_4.RegexEngineImpl +com.thaiopensource.datatype.xsd.regex.xerces2.RegexEngineImpl +com.thaiopensource.datatype.xsd.regex.xerces.RegexEngineImpl diff --git a/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory new file mode 100644 index 0000000..44a7cc0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.SchemaReaderFactory @@ -0,0 +1,4 @@ +com.thaiopensource.validate.jarv.JarvSchemaReaderFactory +com.thaiopensource.validate.xerces.XsdSchemaReaderFactory +com.thaiopensource.validate.schematron.SaxonSchemaReaderFactory +com.thaiopensource.validate.schematron.XalanSchemaReaderFactory diff --git a/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory new file mode 100644 index 0000000..ff95351 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/META-INF/services/com.thaiopensource.validate.auto.SchemaReceiverFactory @@ -0,0 +1,4 @@ +com.thaiopensource.validate.rng.SAXSchemaReceiverFactory +com.thaiopensource.validate.mns.MnsSchemaReceiverFactory +com.thaiopensource.validate.nrl.NrlSchemaReceiverFactory +com.thaiopensource.validate.auto.SchemaReaderLoaderSchemaReceiverFactory diff --git a/thirdparty/epubcheck/jingsrc/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader b/thirdparty/epubcheck/jingsrc/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader new file mode 100644 index 0000000..6393d7f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader @@ -0,0 +1 @@ +com.thaiopensource.relaxng.jarv.VerifierFactoryLoaderImpl diff --git a/thirdparty/epubcheck/jingsrc/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory b/thirdparty/epubcheck/jingsrc/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory new file mode 100644 index 0000000..1353184 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory @@ -0,0 +1 @@ +com.thaiopensource.datatype.xsd.DatatypeLibraryFactoryImpl diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/Datatype2.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/Datatype2.java new file mode 100644 index 0000000..5e3d141 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/Datatype2.java @@ -0,0 +1,7 @@ +package com.thaiopensource.datatype; + +import org.relaxng.datatype.Datatype; + +public interface Datatype2 extends Datatype { + boolean alwaysValid(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/AnyUriDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/AnyUriDatatype.java new file mode 100644 index 0000000..c7ad5f5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/AnyUriDatatype.java @@ -0,0 +1,14 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.util.Uri; +import org.relaxng.datatype.ValidationContext; + +class AnyUriDatatype extends TokenDatatype { + public boolean lexicallyAllows(String str) { + return Uri.isValid(str); + } + + public boolean alwaysValid() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.java new file mode 100644 index 0000000..2bf526b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Base64BinaryDatatype.java @@ -0,0 +1,105 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class Base64BinaryDatatype extends BinaryDatatype { + static private final byte[] weightTable = makeWeightTable(); + static private final byte INVALID = (byte)-1; + static private final byte WHITESPACE = (byte)-2; + static private final byte PADDING = (byte)-3; + + // for efficiency, don't assume whitespace normalized + boolean lexicallyAllows(String str) { + return byteCount(str) >= 0; + } + + private static int byteCount(String str) { + int nChars = 0; + int nPadding = 0; + int lastCharWeight = -1; + for (int i = 0, len = str.length(); i < len; i++) { + char c = str.charAt(i); + if (c >= 128) + return -1; + int w = weightTable[c]; + switch (w) { + case WHITESPACE: + break; + case PADDING: + if (++nPadding > 2) + return -1; + break; + case INVALID: + return -1; + default: + if (nPadding > 0) + return -1; + lastCharWeight = w; + nChars++; + break; + } + } + if (((nChars + nPadding) & 0x3) != 0) + return -1; + switch (nPadding) { + case 1: + // 1 padding char; last quartet specifies 2 bytes = 16 bits = 6 + 6 + 4 bits + // lastChar must have 6 - 4 = 2 unused bits + if ((lastCharWeight & 0x3) != 0) + return -1; + break; + case 2: + // 2 padding chars; last quartet specifies 1 byte = 8 bits = 6 + 2 bits + // lastChar must have 6 - 2 = 4 unused bits + if ((lastCharWeight & 0xF) != 0) + return -1; + break; + } + return ((nChars + nPadding) >> 2)*3 - nPadding; + } + + Object getValue(String str, ValidationContext vc) { + int nBytes = byteCount(str); + byte[] value = new byte[nBytes]; + int valueIndex = 0; + int nBytesAccum = 0; + int accum = 0; + for (int i = 0, len = str.length(); i < len; i++) { + int w = weightTable[str.charAt(i)]; + if (w != WHITESPACE) { + accum <<= 6; + if (w != PADDING) + accum |= w; + if (++nBytesAccum == 4) { + for (int shift = 16; shift >= 0; shift -= 8) { + if (valueIndex < nBytes) + value[valueIndex++] = (byte)((accum >> shift) & 0xFF); + } + nBytesAccum = 0; + accum = 0; + } + } + } + return value; + } + + static private byte[] makeWeightTable() { + byte[] w = new byte[128]; + byte n = INVALID; + for (int i = 0; i < 128; i++) + w[i] = n; + n = 0; + for (int i = 'A'; i <= 'Z'; i++, n++) + w[i] = n; + for (int i = 'a'; i <= 'z'; i++, n++) + w[i] = n; + for (int i = '0'; i <= '9'; i++, n++) + w[i] = n; + w['+'] = n++; + w['/'] = n++; + w[' '] = w['\t'] = w['\r'] = w['\n'] = WHITESPACE; + w['='] = PADDING; + return w; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BinaryDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BinaryDatatype.java new file mode 100644 index 0000000..2cd3348 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BinaryDatatype.java @@ -0,0 +1,35 @@ +package com.thaiopensource.datatype.xsd; + +abstract class BinaryDatatype extends DatatypeBase implements Measure { + BinaryDatatype() { + // whiteSpace is actually collapse, but we handle it ourselves for efficiency + super(WHITE_SPACE_PRESERVE); + } + + public int valueHashCode(Object value) { + byte[] v = (byte[])value; + int hc = 0; + for (int i = 0, len = v.length; i < len; i++) + hc = (hc * 33) ^ (v[i] & 0xFF); + return hc; + } + + public boolean sameValue(Object value1, Object value2) { + byte[] v1 = (byte[])value1; + byte[] v2 = (byte[])value2; + if (v1.length != v2.length) + return false; + for (int i = 0, len = v1.length; i < len; i++) + if (v1[i] != v2[i]) + return false; + return true; + } + + public int getLength(Object obj) { + return ((byte[])obj).length; + } + + Measure getMeasure() { + return this; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BooleanDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BooleanDatatype.java new file mode 100644 index 0000000..d3fb9c8 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/BooleanDatatype.java @@ -0,0 +1,17 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class BooleanDatatype extends DatatypeBase { + boolean lexicallyAllows(String str) { + return str.equals("true") || str.equals("false") || str.equals("1") || str.equals("0"); + } + Object getValue(String str, ValidationContext vc) { + switch (str.charAt(0)) { + case 't': + case '1': + return Boolean.TRUE; + } + return Boolean.FALSE; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/CdataDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/CdataDatatype.java new file mode 100644 index 0000000..5c298af --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/CdataDatatype.java @@ -0,0 +1,7 @@ +package com.thaiopensource.datatype.xsd; + +class CdataDatatype extends TokenDatatype { + CdataDatatype() { + super(WHITE_SPACE_REPLACE); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBase.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBase.java new file mode 100644 index 0000000..d875c01 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBase.java @@ -0,0 +1,171 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.ValidationContext; +import org.relaxng.datatype.DatatypeStreamingValidator; +import org.relaxng.datatype.helpers.StreamingValidatorImpl; +import com.thaiopensource.datatype.Datatype2; + +abstract class DatatypeBase implements Datatype2 { + abstract boolean lexicallyAllows(String str); + private final int whiteSpace; + + static final int WHITE_SPACE_PRESERVE = 0; + static final int WHITE_SPACE_REPLACE = 1; + static final int WHITE_SPACE_COLLAPSE = 2; + + DatatypeBase() { + whiteSpace = WHITE_SPACE_COLLAPSE; + } + + DatatypeBase(int whiteSpace) { + this.whiteSpace = whiteSpace; + } + + int getWhiteSpace() { + return whiteSpace; + } + + public boolean isValid(String str, ValidationContext vc) { + str = normalizeWhiteSpace(str); + return lexicallyAllows(str) && allowsValue(str, vc); + } + + public void checkValid(String str, ValidationContext vc) throws DatatypeException { + if (!isValid(str, vc)) + throw new DatatypeException(); + } + + public Object createValue(String str, ValidationContext vc) { + str = normalizeWhiteSpace(str); + if (!lexicallyAllows(str)) + return null; + return getValue(str, vc); + } + + final String normalizeWhiteSpace(String str) { + switch (whiteSpace) { + case WHITE_SPACE_COLLAPSE: + return collapseWhiteSpace(str); + case WHITE_SPACE_REPLACE: + return replaceWhiteSpace(str); + } + return str; + } + + /* Requires lexicallyAllows to be true. Must return same value as + getValue(str, vc) != null. */ + boolean allowsValue(String str, ValidationContext vc) { + return true; + } + + /* Requires lexicallyAllows to be true. Returns null if value does not satisfy + constraints on value space. */ + abstract Object getValue(String str, ValidationContext vc); + + OrderRelation getOrderRelation() { + return null; + } + + /* For datatypes that have a length. */ + Measure getMeasure() { + return null; + } + + static private final String collapseWhiteSpace(String s) { + int i = collapseStart(s); + if (i < 0) + return s; + StringBuffer buf = new StringBuffer(s.substring(0, i)); + boolean collapsing = (i == 0 || s.charAt(i - 1) == ' '); + for (int len = s.length(); i < len; i++) { + char c = s.charAt(i); + switch (c) { + case '\r': + case '\n': + case '\t': + case ' ': + if (!collapsing) { + buf.append(' '); + collapsing = true; + } + break; + default: + collapsing = false; + buf.append(c); + break; + } + } + if (buf.length() > 0 && buf.charAt(buf.length() - 1) == ' ') + buf.setLength(buf.length() - 1); + return buf.toString(); + } + + static private final int collapseStart(String s) { + for (int i = 0, len = s.length(); i < len; i++) { + switch (s.charAt(i)) { + case ' ': + if (i == 0 || s.charAt(i - 1) == ' ' || i == len - 1) + return i; + break; + case '\r': + case '\n': + case '\t': + return i; + } + } + return -1; + } + + static private final String replaceWhiteSpace(String s) { + int len = s.length(); + for (int i = 0; i < len; i++) + switch (s.charAt(i)) { + case '\r': + case '\n': + case '\t': + { + char[] buf = s.toCharArray(); + buf[i] = ' '; + for (++i; i < len; i++) + switch (buf[i]) { + case '\r': + case '\n': + case '\t': + buf[i] = ' '; + } + return new String(buf); + } + } + return s; + } + + DatatypeBase getPrimitive() { + return this; + } + + public boolean isContextDependent() { + return false; + } + + public boolean alwaysValid() { + return false; + } + + public int getIdType() { + return ID_TYPE_NULL; + } + + public int valueHashCode(Object value) { + return value.hashCode(); + } + + public boolean sameValue(Object value1, Object value2) { + return value1.equals(value2); + } + + public DatatypeStreamingValidator createStreamingValidator(ValidationContext vc) { + return new StreamingValidatorImpl(this, vc); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.java new file mode 100644 index 0000000..1bea8c1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeBuilderImpl.java @@ -0,0 +1,178 @@ +package com.thaiopensource.datatype.xsd; + +import java.util.ResourceBundle; +import java.text.MessageFormat; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeBuilder; +import org.relaxng.datatype.ValidationContext; +import org.relaxng.datatype.DatatypeException; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; +import com.thaiopensource.util.Localizer; + +class DatatypeBuilderImpl implements DatatypeBuilder { + static final Localizer localizer = new Localizer(DatatypeBuilderImpl.class); + + private DatatypeBase base; + private final DatatypeLibraryImpl library; + + DatatypeBuilderImpl(DatatypeLibraryImpl library, DatatypeBase base) throws DatatypeException { + this.library = library; + this.base = base; + } + + public void addParameter(String name, + String value, + ValidationContext context) throws DatatypeException { + if (name.equals("pattern")) + addPatternParam(value); + else if (name.equals("minInclusive")) + addMinInclusiveParam(value, context); + else if (name.equals("maxInclusive")) + addMaxInclusiveParam(value, context); + else if (name.equals("minExclusive")) + addMinExclusiveParam(value, context); + else if (name.equals("maxExclusive")) + addMaxExclusiveParam(value, context); + else if (name.equals("length")) + addLengthParam(value); + else if (name.equals("minLength")) + addMinLengthParam(value); + else if (name.equals("maxLength")) + addMaxLengthParam(value); + else if (name.equals("fractionDigits")) + addScaleParam(value); + else if (name.equals("totalDigits")) + addPrecisionParam(value); + else if (name.equals("enumeration")) + error("enumeration_param"); + else if (name.equals("whiteSpace")) + error("whiteSpace_param"); + else + error("unrecognized_param", name); + } + + private void addPatternParam(String value) throws DatatypeException { + try { + base = new PatternRestrictDatatype(base, + library.getRegexEngine().compile(value)); + } + catch (RegexSyntaxException e) { + int pos = e.getPosition(); + if (pos == RegexSyntaxException.UNKNOWN_POSITION) + pos = DatatypeException.UNKNOWN; + error("invalid_regex", e.getMessage(), pos); + } + } + + private void addMinInclusiveParam(String value, ValidationContext context) + throws DatatypeException { + base = new MinInclusiveRestrictDatatype(base, + getLimit(value, context)); + } + + private void addMaxInclusiveParam(String value, ValidationContext context) + throws DatatypeException { + base = new MaxInclusiveRestrictDatatype(base, + getLimit(value, context)); + } + + private void addMinExclusiveParam(String value, ValidationContext context) + throws DatatypeException { + base = new MinExclusiveRestrictDatatype(base, + getLimit(value, context)); + } + + private void addMaxExclusiveParam(String value, ValidationContext context) + throws DatatypeException { + base = new MaxExclusiveRestrictDatatype(base, + getLimit(value, context)); + } + + private Object getLimit(String str, ValidationContext context) + throws DatatypeException { + if (base.getOrderRelation() == null) + error("not_ordered"); + Object value = base.createValue(str, context); + if (value == null) + error("invalid_limit", str); + return value; + } + + private void addLengthParam(String value) throws DatatypeException { + base = new LengthRestrictDatatype(base, getLength(value)); + } + + private void addMinLengthParam(String value) throws DatatypeException { + base = new MinLengthRestrictDatatype(base, getLength(value)); + } + + private void addMaxLengthParam(String value) throws DatatypeException { + base = new MaxLengthRestrictDatatype(base, getLength(value)); + } + + private int getLength(String str) throws DatatypeException { + if (base.getMeasure() == null) + error("no_length"); + int len = convertNonNegativeInteger(str); + if (len < 0) + error("value_not_non_negative_integer"); + return len; + } + + private void addScaleParam(String str) throws DatatypeException { + if (!(base.getPrimitive() instanceof DecimalDatatype)) + error("scale_not_derived_from_decimal"); + int scale = convertNonNegativeInteger(str); + if (scale < 0) + error("value_not_non_negative_integer"); + base = new ScaleRestrictDatatype(base, scale); + } + + private void addPrecisionParam(String str) throws DatatypeException { + if (!(base.getPrimitive() instanceof DecimalDatatype)) + error("precision_not_derived_from_decimal"); + int scale = convertNonNegativeInteger(str); + if (scale <= 0) + error("value_not_positive_integer"); + base = new PrecisionRestrictDatatype(base, scale); + } + + public Datatype createDatatype() { + return base; + } + + private static void error(String key) throws DatatypeException { + throw new DatatypeException(localizer.message(key)); + } + + private static void error(String key, String arg) throws DatatypeException { + throw new DatatypeException(localizer.message(key, arg)); + } + + private static void error(String key, String arg, int pos) throws DatatypeException { + throw new DatatypeException(pos, localizer.message(key, arg)); + } + + // Return -1 for anything that is not a nonNegativeInteger + // Return Integer.MAX_VALUE for values that are too big + + private int convertNonNegativeInteger(String str) { + str = str.trim(); + DecimalDatatype decimal = new DecimalDatatype(); + if (!decimal.lexicallyAllows(str)) + return -1; + // Canonicalize the value + str = decimal.getValue(str, null).toString(); + // Reject negative and fractional numbers + if (str.charAt(0) == '-' || str.indexOf('.') >= 0) + return -1; + try { + return Integer.parseInt(str); + } + catch (NumberFormatException e) { + // Map out of range integers to MAX_VALUE + return Integer.MAX_VALUE; + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.java new file mode 100644 index 0000000..77f4d6d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryFactoryImpl.java @@ -0,0 +1,20 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.DatatypeLibrary; +import org.relaxng.datatype.DatatypeLibraryFactory; +import com.thaiopensource.xml.util.WellKnownNamespaces; + +public class DatatypeLibraryFactoryImpl implements DatatypeLibraryFactory { + + private DatatypeLibrary datatypeLibrary = null; + + public DatatypeLibrary createDatatypeLibrary(String uri) { + if (!WellKnownNamespaces.XML_SCHEMA_DATATYPES.equals(uri)) + return null; + synchronized (this) { + if (datatypeLibrary == null) + datatypeLibrary = new DatatypeLibraryImpl(); + return datatypeLibrary; + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.java new file mode 100644 index 0000000..f1ea515 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DatatypeLibraryImpl.java @@ -0,0 +1,149 @@ +package com.thaiopensource.datatype.xsd; + +import java.util.Hashtable; +import java.util.Enumeration; + +import com.thaiopensource.util.Service; +import com.thaiopensource.datatype.xsd.regex.RegexEngine; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; + +import org.relaxng.datatype.DatatypeLibrary; +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.DatatypeBuilder; + +public class DatatypeLibraryImpl implements DatatypeLibrary { + private final Hashtable typeTable = new Hashtable(); + private final RegexEngine regexEngine; + + static private final String LONG_MAX = "9223372036854775807"; + static private final String LONG_MIN = "-9223372036854775808"; + static private final String INT_MAX = "2147483647"; + static private final String INT_MIN = "-2147483648"; + static private final String SHORT_MAX = "32767"; + static private final String SHORT_MIN = "-32768"; + static private final String BYTE_MAX = "127"; + static private final String BYTE_MIN = "-128"; + + static private final String UNSIGNED_LONG_MAX = "18446744073709551615"; + static private final String UNSIGNED_INT_MAX = "4294967295"; + static private final String UNSIGNED_SHORT_MAX = "65535"; + static private final String UNSIGNED_BYTE_MAX = "255"; + // Follow RFC 3066 syntax. + static private final String LANGUAGE_PATTERN = "[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*"; + + public DatatypeLibraryImpl() { + this.regexEngine = findRegexEngine(); + typeTable.put("string", new StringDatatype()); + typeTable.put("normalizedString", new CdataDatatype()); + typeTable.put("token", new TokenDatatype()); + typeTable.put("boolean", new BooleanDatatype()); + + DatatypeBase decimalType = new DecimalDatatype(); + typeTable.put("decimal", decimalType); + DatatypeBase integerType = new IntegerRestrictDatatype(decimalType); + typeTable.put("integer", integerType); + typeTable.put("nonPositiveInteger", restrictMax(integerType, "0")); + typeTable.put("negativeInteger", restrictMax(integerType, "-1")); + typeTable.put("long", restrictMax(restrictMin(integerType, LONG_MIN), LONG_MAX)); + typeTable.put("int", restrictMax(restrictMin(integerType, INT_MIN), INT_MAX)); + typeTable.put("short", restrictMax(restrictMin(integerType, SHORT_MIN), SHORT_MAX)); + typeTable.put("byte", restrictMax(restrictMin(integerType, BYTE_MIN), BYTE_MAX)); + DatatypeBase nonNegativeIntegerType = restrictMin(integerType, "0"); + typeTable.put("nonNegativeInteger", nonNegativeIntegerType); + typeTable.put("unsignedLong", restrictMax(nonNegativeIntegerType, UNSIGNED_LONG_MAX)); + typeTable.put("unsignedInt", restrictMax(nonNegativeIntegerType, UNSIGNED_INT_MAX)); + typeTable.put("unsignedShort", restrictMax(nonNegativeIntegerType, UNSIGNED_SHORT_MAX)); + typeTable.put("unsignedByte", restrictMax(nonNegativeIntegerType, UNSIGNED_BYTE_MAX)); + typeTable.put("positiveInteger", restrictMin(integerType, "1")); + typeTable.put("double", new DoubleDatatype()); + typeTable.put("float", new FloatDatatype()); + + typeTable.put("Name", new NameDatatype()); + typeTable.put("QName", new QNameDatatype()); + + DatatypeBase ncNameType = new NCNameDatatype(); + typeTable.put("NCName", ncNameType); + + DatatypeBase nmtokenDatatype = new NmtokenDatatype(); + typeTable.put("NMTOKEN", nmtokenDatatype); + typeTable.put("NMTOKENS", list(nmtokenDatatype)); + + typeTable.put("ID", new IdDatatype()); + DatatypeBase idrefType = new IdrefDatatype(); + typeTable.put("IDREF", idrefType); + typeTable.put("IDREFS", list(idrefType)); + + typeTable.put("NOTATION", new QNameDatatype()); + + typeTable.put("base64Binary", new Base64BinaryDatatype()); + typeTable.put("hexBinary", new HexBinaryDatatype()); + typeTable.put("anyURI", new AnyUriDatatype()); + typeTable.put("language", new RegexDatatype(LANGUAGE_PATTERN)); + + typeTable.put("dateTime", new DateTimeDatatype("Y-M-DTt")); + typeTable.put("time", new DateTimeDatatype("t")); + typeTable.put("date", new DateTimeDatatype("Y-M-D")); + typeTable.put("gYearMonth", new DateTimeDatatype("Y-M")); + typeTable.put("gYear", new DateTimeDatatype("Y")); + typeTable.put("gMonthDay", new DateTimeDatatype("--M-D")); + typeTable.put("gDay", new DateTimeDatatype("---D")); + typeTable.put("gMonth", new DateTimeDatatype("--M")); + + DatatypeBase entityType = new EntityDatatype(); + typeTable.put("ENTITY", entityType); + typeTable.put("ENTITIES", list(entityType)); + // Partially implemented + typeTable.put("duration", new DurationDatatype()); + } + + public DatatypeBuilder createDatatypeBuilder(String localName) throws DatatypeException { + DatatypeBase base = (DatatypeBase)typeTable.get(localName); + if (base == null) + throw new DatatypeException(); + if (base instanceof RegexDatatype) { + try { + ((RegexDatatype)base).compile(getRegexEngine()); + } + catch (RegexSyntaxException e) { + throw new DatatypeException(DatatypeBuilderImpl.localizer.message("regex_internal_error", localName)); + } + } + return new DatatypeBuilderImpl(this, base); + } + + RegexEngine getRegexEngine() throws DatatypeException { + if (regexEngine == null) + throw new DatatypeException(DatatypeBuilderImpl.localizer.message("regex_impl_not_found")); + return regexEngine; + } + + private static DatatypeBase restrictMax(DatatypeBase base, String limit) { + return new MaxInclusiveRestrictDatatype(base, base.getValue(limit, null)); + } + + private static DatatypeBase restrictMin(DatatypeBase base, String limit) { + return new MinInclusiveRestrictDatatype(base, base.getValue(limit, null)); + } + + private static DatatypeBase list(DatatypeBase base) { + return new MinLengthRestrictDatatype(new ListDatatype(base), 1); + } + + private static RegexEngine findRegexEngine() { + Enumeration e = new Service(RegexEngine.class).getProviders(); + if (!e.hasMoreElements()) + return null; + return (RegexEngine)e.nextElement(); + } + + public Datatype createDatatype(String type) throws DatatypeException { + return createDatatypeBuilder(type).createDatatype(); + } + + static public void main(String[] args) throws DatatypeException { + System.err.println(new DatatypeLibraryImpl().createDatatype(args[0]).isValid(args[1], null) + ? "valid" + : "invalid"); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DateTimeDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DateTimeDatatype.java new file mode 100644 index 0000000..8a6ad04 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DateTimeDatatype.java @@ -0,0 +1,312 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +class DateTimeDatatype extends RegexDatatype implements OrderRelation { + static private final String YEAR_PATTERN = "-?([1-9][0-9]*)?[0-9]{4}"; + static private final String MONTH_PATTERN = "[0-9]{2}"; + static private final String DAY_OF_MONTH_PATTERN = "[0-9]{2}"; + static private final String TIME_PATTERN = "[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]*)?"; + static private final String TZ_PATTERN = "(Z|[+\\-][0-9][0-9]:[0-5][0-9])?"; + + private final String template; + + /** + * The argument specifies the lexical representation accepted: + * Y specifies a year with optional preceding minus + * M specifies a two digit month + * D specifies a two digit day of month + * t specifies a time (hh:mm:ss.sss) + * any other character stands for itself. + * All lexical representations are implicitly followed by an optional time zone. + */ + DateTimeDatatype(String template) { + super(makePattern(template)); + this.template = template; + } + + static private String makePattern(String template) { + StringBuffer pattern = new StringBuffer(); + for (int i = 0, len = template.length(); i < len; i++) { + char c = template.charAt(i); + switch (c) { + case 'Y': + pattern.append(YEAR_PATTERN); + break; + case 'M': + pattern.append(MONTH_PATTERN); + break; + case 'D': + pattern.append(DAY_OF_MONTH_PATTERN); + break; + case 't': + pattern.append(TIME_PATTERN); + break; + default: + pattern.append(c); + break; + } + } + pattern.append(TZ_PATTERN); + return pattern.toString(); + } + + boolean allowsValue(String str, ValidationContext vc) { + return getValue(str, vc) != null; + } + + static private class DateTime { + private final Date date; + private final int leapMilliseconds; + private final boolean hasTimeZone; + + DateTime(Date date, int leapMilliseconds, boolean hasTimeZone) { + this.date = date; + this.leapMilliseconds = leapMilliseconds; + this.hasTimeZone = hasTimeZone; + } + + public boolean equals(Object obj) { + if (!(obj instanceof DateTime)) + return false; + DateTime other = (DateTime)obj; + return (this.date.equals(other.date) + && this.leapMilliseconds == other.leapMilliseconds + && this.hasTimeZone == other.hasTimeZone); + } + + public int hashCode() { + return date.hashCode(); + } + + Date getDate() { + return date; + } + + int getLeapMilliseconds() { + return leapMilliseconds; + } + + boolean getHasTimeZone() { + return hasTimeZone; + } + } + + // XXX Check leap second validity? + // XXX Allow 24:00:00? + Object getValue(String str, ValidationContext vc) { + boolean negative = false; + int year = 2000; // any leap year will do + int month = 1; + int day = 1; + int hours = 0; + int minutes = 0; + int seconds = 0; + int milliseconds = 0; + int pos = 0; + int len = str.length(); + for (int templateIndex = 0, templateLength = template.length(); + templateIndex < templateLength; + templateIndex++) { + char templateChar = template.charAt(templateIndex); + switch (templateChar) { + case 'Y': + negative = str.charAt(pos) == '-'; + int yearStartIndex = negative ? pos + 1 : pos; + pos = skipDigits(str, yearStartIndex); + try { + year = Integer.parseInt(str.substring(yearStartIndex, pos)); + } + catch (NumberFormatException e) { + return null; + } + break; + case 'M': + month = parse2Digits(str, pos); + pos += 2; + break; + case 'D': + day = parse2Digits(str, pos); + pos += 2; + break; + case 't': + hours = parse2Digits(str, pos); + pos += 3; + minutes = parse2Digits(str, pos); + pos += 3; + seconds = parse2Digits(str, pos); + pos += 2; + if (pos < len && str.charAt(pos) == '.') { + int end = skipDigits(str, ++pos); + for (int j = 0; j < 3; j++) { + milliseconds *= 10; + if (pos < end) + milliseconds += str.charAt(pos++) - '0'; + } + pos = end; + } + break; + default: + pos++; + break; + } + } + boolean hasTimeZone = pos < len; + int tzOffset; + if (hasTimeZone && str.charAt(pos) != 'Z') + tzOffset = parseTimeZone(str, pos); + else + tzOffset = 0; + int leapMilliseconds; + if (seconds == 60) { + leapMilliseconds = milliseconds + 1; + milliseconds = 999; + seconds = 59; + } + else + leapMilliseconds = 0; + try { + GregorianCalendar cal = CalendarFactory.getCalendar(); + Date date; + if (cal == CalendarFactory.cal) { + synchronized (cal) { + date = createDate(cal, tzOffset, negative, year, month, day, hours, minutes, seconds, milliseconds); + } + } + else + date = createDate(cal, tzOffset, negative, year, month, day, hours, minutes, seconds, milliseconds); + return new DateTime(date, leapMilliseconds, hasTimeZone); + } + catch (IllegalArgumentException e) { + return null; + } + } + + // The GregorianCalendar constructor is incredibly slow with some + // versions of GCJ (specifically the version shipped with RedHat 9). + // This code attempts to detect when construction is slow. + // When it is, we synchronize access to a single + // object; otherwise, we create a new object each time we need it + // so as to avoid thread lock contention. + + static class CalendarFactory { + static private final int UNKNOWN = -1; + static private final int SLOW = 0; + static private final int FAST = 1; + static private final int LIMIT = 10; + static private int speed = UNKNOWN; + static GregorianCalendar cal = new GregorianCalendar(); + + static GregorianCalendar getCalendar() { + // Don't need to synchronize this because speed is atomic. + switch (speed) { + case SLOW: + return cal; + case FAST: + return new GregorianCalendar(); + } + // Note that we are not timing the first construction (which happens + // at class initialization), since that may involve one-time cache + // initialization. + long start = System.currentTimeMillis(); + GregorianCalendar tem = new GregorianCalendar(); + long time = System.currentTimeMillis() - start; + speed = time > LIMIT ? SLOW : FAST; + return tem; + } + } + + private static Date createDate(GregorianCalendar cal, int tzOffset, boolean negative, + int year, int month, int day, + int hours, int minutes, int seconds, int milliseconds) { + cal.setLenient(false); + cal.setGregorianChange(new Date(Long.MIN_VALUE)); + cal.clear(); + // Using a time zone of "GMT+XX:YY" doesn't work with JDK 1.1, so we have to do it like this. + cal.set(Calendar.ZONE_OFFSET, tzOffset); + cal.set(Calendar.DST_OFFSET, 0); + cal.set(Calendar.ERA, negative ? GregorianCalendar.BC : GregorianCalendar.AD); + // months in ISO8601 start with 1; months in Java start with 0 + month -= 1; + cal.set(year, month, day, hours, minutes, seconds); + cal.set(Calendar.MILLISECOND, milliseconds); + checkDate(cal.isLeapYear(year), month, day); // for GCJ + return cal.getTime(); + } + + static private void checkDate(boolean isLeapYear, int month, int day) { + if (month < 0 || month > 11 || day < 1) + throw new IllegalArgumentException(); + int dayMax; + switch (month) { + // Thirty days have September, April, June and November... + case Calendar.SEPTEMBER: + case Calendar.APRIL: + case Calendar.JUNE: + case Calendar.NOVEMBER: + dayMax = 30; + break; + case Calendar.FEBRUARY: + dayMax = isLeapYear ? 29 : 28; + break; + default: + dayMax = 31; + break; + } + if (day > dayMax) + throw new IllegalArgumentException(); + } + + static private int parseTimeZone(String str, int i) { + int sign = str.charAt(i) == '-' ? -1 : 1; + return (Integer.parseInt(str.substring(i + 1, i + 3))*60 + Integer.parseInt(str.substring(i + 4)))*60*1000*sign; + } + + static private int parse2Digits(String str, int i) { + return (str.charAt(i) - '0')*10 + (str.charAt(i + 1) - '0'); + } + + static private int skipDigits(String str, int i) { + for (int len = str.length(); i < len; i++) { + if ("0123456789".indexOf(str.charAt(i)) < 0) + break; + } + return i; + } + + OrderRelation getOrderRelation() { + return this; + } + + static private final int TIME_ZONE_MAX = 14*60*60*1000; + + public boolean isLessThan(Object obj1, Object obj2) { + DateTime dt1 = (DateTime)obj1; + DateTime dt2 = (DateTime)obj2; + long t1 = dt1.getDate().getTime(); + long t2 = dt2.getDate().getTime(); + if (dt1.getHasTimeZone() == dt2.getHasTimeZone()) + return isLessThan(t1, + dt1.getLeapMilliseconds(), + t2, + dt2.getLeapMilliseconds()); + else if (!dt2.getHasTimeZone()) + return isLessThan(t1, dt1.getLeapMilliseconds(), t2 - TIME_ZONE_MAX, dt2.getLeapMilliseconds()); + else + return isLessThan(t1 + TIME_ZONE_MAX, dt1.getLeapMilliseconds(), t2, dt2.getLeapMilliseconds()); + } + + static private boolean isLessThan(long t1, int leapMillis1, long t2, int leapMillis2) { + if (t1 < t2) + return true; + if (t1 > t2) + return false; + if (leapMillis1 < leapMillis2) + return true; + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DecimalDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DecimalDatatype.java new file mode 100644 index 0000000..0143586 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DecimalDatatype.java @@ -0,0 +1,79 @@ +package com.thaiopensource.datatype.xsd; + +import java.math.BigDecimal; + +import org.relaxng.datatype.ValidationContext; + +class DecimalDatatype extends DatatypeBase implements OrderRelation { + + boolean lexicallyAllows(String str) { + int len = str.length(); + if (len == 0) + return false; + int i = 0; + switch (str.charAt(i)) { + case '+': + case '-': + if (++i == len) + return false; + } + boolean hadDecimalPoint = false; + if (str.charAt(i) == '.') { + hadDecimalPoint = true; + if (++i == len) + return false; + } + do { + switch (str.charAt(i)) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + break; + case '.': + if (hadDecimalPoint) + return false; + hadDecimalPoint = true; + break; + default: + return false; + } + } while (++i < len); + return true; + } + + Object getValue(String str, ValidationContext vc) { + if (str.charAt(0) == '+') + str = str.substring(1); // JDK 1.1 doesn't handle leading + + return new BigDecimal(str); + } + + OrderRelation getOrderRelation() { + return this; + } + + public boolean isLessThan(Object obj1, Object obj2) { + return ((BigDecimal)obj1).compareTo((BigDecimal)obj2) < 0; + } + + /** + * BigDecimal.equals considers objects distinct if they have the + * different scales but the same mathematical value. Similarly + * for hashCode. + */ + + public boolean sameValue(Object value1, Object value2) { + return ((BigDecimal)value1).compareTo((BigDecimal)value2) == 0; + } + + public int valueHashCode(Object value) { + return ((BigDecimal)value).toBigInteger().hashCode(); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DoubleDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DoubleDatatype.java new file mode 100644 index 0000000..055a964 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DoubleDatatype.java @@ -0,0 +1,80 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class DoubleDatatype extends DatatypeBase implements OrderRelation { + + boolean lexicallyAllows(String str) { + if (str.equals("INF") || str.equals("-INF") || str.equals("NaN")) + return true; + int len = str.length(); + boolean hadSign = false; + boolean hadDecimalPoint = false; + boolean hadDigit = false; + boolean hadE = false; + for (int i = 0; i < len; i++) { + switch (str.charAt(i)) { + case '+': + case '-': + if (hadDigit || hadDecimalPoint || hadSign) + return false; + hadSign = true; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + hadDigit = true; + break; + case 'e': + case 'E': + if (hadE || !hadDigit) + return false; + hadDigit = false; + hadE = true; + hadSign = false; + hadDecimalPoint = false; + break; + case '.': + if (hadDecimalPoint || hadE) + return false; + hadDecimalPoint = true; + break; + default: + return false; + } + } + return hadDigit; + } + + Object getValue(String str, ValidationContext vc) { + if (str.equals("INF")) + return new Double(Double.POSITIVE_INFINITY); + if (str.equals("-INF")) + return new Double(Double.NEGATIVE_INFINITY); + if (str.equals("NaN")) + return new Double(Double.NaN); + return new Double(str); + } + + OrderRelation getOrderRelation() { + return this; + } + + public boolean isLessThan(Object obj1, Object obj2) { + return ((Double)obj1).doubleValue() < ((Double)obj2).doubleValue(); + } + + public boolean sameValue(Object value1, Object value2) { + double d1 = ((Double)value1).doubleValue(); + double d2 = ((Double)value2).doubleValue(); + // NaN = NaN + return d1 == d2 || (d1 != d1 && d2 != d2); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DurationDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DurationDatatype.java new file mode 100644 index 0000000..a13cbbe --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/DurationDatatype.java @@ -0,0 +1,243 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +import java.math.BigInteger; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.GregorianCalendar; + +class DurationDatatype extends RegexDatatype implements OrderRelation { + static private final String PATTERN = + "-?P([0-9]+Y)?([0-9]+M)?([0-9]+D)?(T([0-9]+H)?([0-9]+M)?(([0-9]+(\\.[0-9]*)?|\\.[0-9]+)S)?)?"; + + DurationDatatype() { + super(PATTERN); + } + + public boolean lexicallyAllows(String str) { + if (!super.lexicallyAllows(str)) + return false; + char last = str.charAt(str.length()-1); + // This enforces that there must be at least one component + // and that T is omitted if all time components are omitted + return last != 'P' && last != 'T'; + } + + static private class Duration { + private final BigInteger years; + private final BigInteger months; + private final BigInteger days; + private final BigInteger hours; + private final BigInteger minutes; + private final BigDecimal seconds; + + Duration(boolean negative, + BigInteger years, BigInteger months, BigInteger days, + BigInteger hours, BigInteger minutes, BigDecimal seconds) { + if (negative) { + this.years = years.negate(); + this.months = months.negate(); + this.days = days.negate(); + this.hours = hours.negate(); + this.minutes = minutes.negate(); + this.seconds = seconds.negate(); + } + else { + this.years = years; + this.months = months; + this.days = days; + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + } + } + + BigInteger getYears() { + return years; + } + + BigInteger getMonths() { + return months; + } + + BigInteger getDays() { + return days; + } + + BigInteger getHours() { + return hours; + } + + BigInteger getMinutes() { + return minutes; + } + + BigDecimal getSeconds() { + return seconds; + } + + public boolean equals(Object obj) { + if (!(obj instanceof Duration)) + return false; + Duration other = (Duration)obj; + return (this.years.equals(other.years) + && this.months.equals(other.months) + && this.days.equals(other.days) + && this.hours.equals(other.hours) + && this.minutes.equals(other.minutes) + && this.seconds.compareTo(other.seconds) == 0); + } + + public int hashCode() { + return (years.hashCode() + ^ months.hashCode() + ^ days.hashCode() + ^ hours.hashCode() + ^ minutes.hashCode() + ^ seconds.hashCode()); + } + } + + Object getValue(String str, ValidationContext vc) { + int t = str.indexOf('T'); + if (t < 0) + t = str.length(); + String date = str.substring(0, t); + String time = str.substring(t); + return new Duration(str.charAt(0) == '-', + getIntegerField(date, 'Y'), + getIntegerField(date, 'M'), + getIntegerField(date, 'D'), + getIntegerField(time, 'H'), + getIntegerField(time, 'M'), + getDecimalField(time, 'S')); + + } + + static private BigInteger getIntegerField(String str, char code) { + int end = str.indexOf(code); + if (end < 0) + return BigInteger.valueOf(0); + int start = end; + while (Character.isDigit(str.charAt(start - 1))) + --start; + return new BigInteger(str.substring(start, end)); + } + + static private BigDecimal getDecimalField(String str, char code) { + int end = str.indexOf(code); + if (end < 0) + return BigDecimal.valueOf(0); + int start = end; + while (!Character.isLetter(str.charAt(start - 1))) + --start; + return new BigDecimal(str.substring(start, end)); + } + + OrderRelation getOrderRelation() { + return this; + } + + private static final int[] REF_YEAR_MONTHS = { 1696, 9, 1697, 2, 1903, 3, 1903, 7 }; + + public boolean isLessThan(Object obj1, Object obj2) { + Duration d1 = (Duration)obj1; + Duration d2 = (Duration)obj2; + BigInteger months1 = computeMonths(d1); + BigInteger months2 = computeMonths(d2); + BigDecimal seconds1 = computeSeconds(d1); + BigDecimal seconds2 = computeSeconds(d2); + switch (months1.compareTo(months2)) { + case -1: + if (seconds1.compareTo(seconds2) <= 0) + return true; + break; + case 0: + return seconds1.compareTo(seconds2) < 0; + case 1: + if (seconds1.compareTo(seconds2) >= 0) + return false; + break; + } + for (int i = 0; i < REF_YEAR_MONTHS.length; i += 2) { + BigDecimal total1 = daysPlusSeconds(computeDays(months1, REF_YEAR_MONTHS[i], REF_YEAR_MONTHS[i + 1]), seconds1); + BigDecimal total2 = daysPlusSeconds(computeDays(months2, REF_YEAR_MONTHS[i], REF_YEAR_MONTHS[i + 1]), seconds2); + if (total1.compareTo(total2) >= 0) + return false; + } + return true; + } + + /** + * Returns the number of days spanned by a period of months starting with a particular + * reference year and month. + */ + private static BigInteger computeDays(BigInteger months, int refYear, int refMonth) { + switch (months.signum()) { + case 0: + return BigInteger.valueOf(0); + case -1: + return computeDays(months.negate(), refYear, refMonth).negate(); + } + // Complete cycle of Gregorian calendar is 400 years + BigInteger[] tem = months.divideAndRemainder(BigInteger.valueOf(400*12)); + --refMonth; // use 0 base to match Java + int total = 0; + for (int rem = tem[1].intValue(); rem > 0; rem--) { + total += daysInMonth(refYear, refMonth); + if (++refMonth == 12) { + refMonth = 0; + refYear++; + } + } + // In the Gregorian calendar, there are 97 (= 100 + 4 - 1) leap years every 400 years. + return tem[0].multiply(BigInteger.valueOf(365*400 + 97)).add(BigInteger.valueOf(total)); + } + + private static int daysInMonth(int year, int month) { + switch (month) { + case Calendar.SEPTEMBER: + case Calendar.APRIL: + case Calendar.JUNE: + case Calendar.NOVEMBER: + return 30; + case Calendar.FEBRUARY: + return isLeapYear(year) ? 29 : 28; + } + return 31; + } + + private static boolean isLeapYear(int year) { + return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; + } + + /** + * Returns the total number of seconds from a specified number of days and seconds. + */ + private static BigDecimal daysPlusSeconds(BigInteger days, BigDecimal seconds) { + return seconds.add(new BigDecimal(days.multiply(BigInteger.valueOf(24*60*60)))); + } + + /** + * Returns the total number of months specified by the year and month fields of the duration + */ + private static BigInteger computeMonths(Duration d) { + return d.getYears().multiply(BigInteger.valueOf(12)).add(d.getMonths()); + } + + /** + * Returns the total number of seconds specified by the days, hours, minuts and seconds fields of + * the duration. + */ + private static BigDecimal computeSeconds(Duration d) { + return d.getSeconds().add(new BigDecimal(d.getDays().multiply(BigInteger.valueOf(24)) + .add(d.getHours()).multiply(BigInteger.valueOf(60)) + .add(d.getMinutes()).multiply(BigInteger.valueOf(60)))); + } + + public static void main(String[] args) { + DurationDatatype dt = new DurationDatatype(); + System.err.println(dt.isLessThan(dt.getValue(args[0], null), dt.getValue(args[1], null))); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/EntityDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/EntityDatatype.java new file mode 100644 index 0000000..0736c55 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/EntityDatatype.java @@ -0,0 +1,15 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class EntityDatatype extends NCNameDatatype { + boolean allowsValue(String str, ValidationContext vc) { + return vc.isUnparsedEntity(str); + } + + Object getValue(String str, ValidationContext vc) { + if (!allowsValue(str, vc)) + return null; + return super.getValue(str, vc); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/FloatDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/FloatDatatype.java new file mode 100644 index 0000000..e26f8cd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/FloatDatatype.java @@ -0,0 +1,27 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class FloatDatatype extends DoubleDatatype { + + Object getValue(String str, ValidationContext vc) { + if (str.equals("INF")) + return new Float(Float.POSITIVE_INFINITY); + if (str.equals("-INF")) + return new Float(Float.NEGATIVE_INFINITY); + if (str.equals("NaN")) + return new Float(Float.NaN); + return new Float(str); + } + + public boolean isLessThan(Object obj1, Object obj2) { + return ((Float)obj1).floatValue() < ((Float)obj2).floatValue(); + } + + public boolean sameValue(Object value1, Object value2) { + float f1 = ((Float)value1).floatValue(); + float f2 = ((Float)value2).floatValue(); + // NaN = NaN + return f1 == f2 || (f1 != f1 && f2 != f2); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/HexBinaryDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/HexBinaryDatatype.java new file mode 100644 index 0000000..603ccc1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/HexBinaryDatatype.java @@ -0,0 +1,53 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class HexBinaryDatatype extends BinaryDatatype { + static private final int INVALID = -1; + static private final int WHITESPACE = -2; + + boolean lexicallyAllows(String str) { + int len = str.length(); + int i = 0; + while (i < len && weight(str.charAt(i)) == WHITESPACE) + i++; + while (i + 1 < len && weight(str.charAt(i)) >= 0 && weight(str.charAt(i + 1)) >= 0) + i += 2; + while (i < len && weight(str.charAt(i)) == WHITESPACE) + i++; + return i == len; + } + + Object getValue(String str, ValidationContext vc) { + int len = str.length(); + int start = 0; + while (start < len && weight(str.charAt(start)) == WHITESPACE) + start++; + int end = len; + while (end > start && weight(str.charAt(end - 1)) == WHITESPACE) + end--; + byte[] value = new byte[(end - start) >> 1]; + int j = 0; + for (int i = start; i < end; i += 2, j++) + value[j] = (byte)((weight(str.charAt(i)) << 4) | weight(str.charAt(i + 1))); + return value; + } + + static private int weight(char c) { + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return c - '0'; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + return c + (10 - 'A'); + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + return c + (10 - 'a'); + case ' ': case '\n': case '\r': case '\t': + return WHITESPACE; + } + return INVALID; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdDatatype.java new file mode 100644 index 0000000..290b210 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdDatatype.java @@ -0,0 +1,7 @@ +package com.thaiopensource.datatype.xsd; + +class IdDatatype extends NCNameDatatype { + public int getIdType() { + return ID_TYPE_ID; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdrefDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdrefDatatype.java new file mode 100644 index 0000000..fc2a554 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IdrefDatatype.java @@ -0,0 +1,7 @@ +package com.thaiopensource.datatype.xsd; + +class IdrefDatatype extends NCNameDatatype { + public int getIdType() { + return ID_TYPE_IDREF; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.java new file mode 100644 index 0000000..20ba6a9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/IntegerRestrictDatatype.java @@ -0,0 +1,11 @@ +package com.thaiopensource.datatype.xsd; + +class IntegerRestrictDatatype extends ScaleRestrictDatatype { + IntegerRestrictDatatype(DatatypeBase base) { + super(base, 0); + } + + boolean lexicallyAllows(String str) { + return super.lexicallyAllows(str) && str.charAt(str.length() - 1) != '.'; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/LengthRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/LengthRestrictDatatype.java new file mode 100644 index 0000000..4921557 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/LengthRestrictDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +class LengthRestrictDatatype extends ValueRestrictDatatype { + private final int length; + private final Measure measure; + + LengthRestrictDatatype(DatatypeBase base, int length) { + super(base); + this.measure = base.getMeasure(); + this.length = length; + } + + boolean satisfiesRestriction(Object obj) { + return measure.getLength(obj) == length; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ListDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ListDatatype.java new file mode 100644 index 0000000..49b1b1c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ListDatatype.java @@ -0,0 +1,77 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; +import com.thaiopensource.xml.util.StringSplitter; + +class ListDatatype extends DatatypeBase implements Measure { + private final DatatypeBase itemType; + + ListDatatype(DatatypeBase itemType) { + this.itemType = itemType; + } + + Object getValue(String str, ValidationContext vc) { + String[] tokens = StringSplitter.split(str); + Object[] items = new Object[tokens.length]; + for (int i = 0; i < items.length; i++) { + items[i] = itemType.getValue(tokens[i], vc); + if (items[i] == null) + return null; + } + return items; + } + + boolean lexicallyAllows(String str) { + String[] tokens = StringSplitter.split(str); + for (int i = 0; i < tokens.length; i++) + if (!itemType.lexicallyAllows(tokens[i])) + return false; + return true; + } + + boolean allowsValue(String str, ValidationContext vc) { + String[] tokens = StringSplitter.split(str); + for (int i = 0; i < tokens.length; i++) + if (!itemType.allowsValue(tokens[i], vc)) + return false; + return true; + } + + Measure getMeasure() { + return this; + } + + public int getLength(Object obj) { + return ((Object[])obj).length; + } + + public boolean isContextDependent() { + return itemType.isContextDependent(); + } + + public int getIdType() { + if (itemType.getIdType() == ID_TYPE_IDREF) + return ID_TYPE_IDREFS; + else + return ID_TYPE_NULL; + } + + public int valueHashCode(Object obj) { + Object[] items = (Object[])obj; + int hc = 0; + for (int i = 0; i < items.length; i++) + hc ^= itemType.valueHashCode(items[i]); + return hc; + } + + public boolean sameValue(Object obj1, Object obj2) { + Object[] items1 = (Object[])obj1; + Object[] items2 = (Object[])obj2; + if (items1.length != items2.length) + return false; + for (int i = 0; i < items1.length; i++) + if (!itemType.sameValue(items1[i], items2[i])) + return false; + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.java new file mode 100644 index 0000000..b1a113d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxExclusiveRestrictDatatype.java @@ -0,0 +1,18 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class MaxExclusiveRestrictDatatype extends ValueRestrictDatatype { + private final OrderRelation order; + private final Object limit; + + MaxExclusiveRestrictDatatype(DatatypeBase base, Object limit) { + super(base); + this.order = base.getOrderRelation(); + this.limit = limit; + } + + boolean satisfiesRestriction(Object value) { + return order.isLessThan(value, limit); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.java new file mode 100644 index 0000000..2fe0ebf --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxInclusiveRestrictDatatype.java @@ -0,0 +1,18 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class MaxInclusiveRestrictDatatype extends ValueRestrictDatatype { + private final OrderRelation order; + private final Object limit; + + MaxInclusiveRestrictDatatype(DatatypeBase base, Object limit) { + super(base); + this.order = base.getOrderRelation(); + this.limit = limit; + } + + boolean satisfiesRestriction(Object value) { + return order.isLessThan(value, limit) || super.sameValue(value, limit); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxLengthRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxLengthRestrictDatatype.java new file mode 100644 index 0000000..4290521 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MaxLengthRestrictDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +class MaxLengthRestrictDatatype extends ValueRestrictDatatype { + private final int length; + private final Measure measure; + + MaxLengthRestrictDatatype(DatatypeBase base, int length) { + super(base); + this.measure = base.getMeasure(); + this.length = length; + } + + boolean satisfiesRestriction(Object obj) { + return measure.getLength(obj) <= length; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Measure.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Measure.java new file mode 100644 index 0000000..10c31fc --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/Measure.java @@ -0,0 +1,5 @@ +package com.thaiopensource.datatype.xsd; + +interface Measure { + int getLength(Object obj); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.java new file mode 100644 index 0000000..3a9e19c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinExclusiveRestrictDatatype.java @@ -0,0 +1,18 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class MinExclusiveRestrictDatatype extends ValueRestrictDatatype { + private final OrderRelation order; + private final Object limit; + + MinExclusiveRestrictDatatype(DatatypeBase base, Object limit) { + super(base); + this.order = base.getOrderRelation(); + this.limit = limit; + } + + boolean satisfiesRestriction(Object value) { + return order.isLessThan(limit, value); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.java new file mode 100644 index 0000000..d92a5b3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinInclusiveRestrictDatatype.java @@ -0,0 +1,18 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class MinInclusiveRestrictDatatype extends ValueRestrictDatatype { + private final OrderRelation order; + private final Object limit; + + MinInclusiveRestrictDatatype(DatatypeBase base, Object limit) { + super(base); + this.order = base.getOrderRelation(); + this.limit = limit; + } + + boolean satisfiesRestriction(Object value) { + return order.isLessThan(limit, value) || super.sameValue(value, limit); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.java new file mode 100644 index 0000000..d185bd3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/MinLengthRestrictDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +class MinLengthRestrictDatatype extends ValueRestrictDatatype { + private final int length; + private final Measure measure; + + MinLengthRestrictDatatype(DatatypeBase base, int length) { + super(base); + this.measure = base.getMeasure(); + this.length = length; + } + + boolean satisfiesRestriction(Object obj) { + return measure.getLength(obj) >= length; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NCNameDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NCNameDatatype.java new file mode 100644 index 0000000..c6d3524 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NCNameDatatype.java @@ -0,0 +1,9 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.xml.util.Naming; + +class NCNameDatatype extends NameDatatype { + public boolean lexicallyAllows(String str) { + return Naming.isNcname(str); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NameDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NameDatatype.java new file mode 100644 index 0000000..45ee8fe --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NameDatatype.java @@ -0,0 +1,17 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.xml.util.Naming; + +class NameDatatype extends TokenDatatype { + public boolean lexicallyAllows(String str) { + return Naming.isName(str); + } + public int getLength(Object obj) { + // Surrogates are not possible in an Name. + return ((String)obj).length(); + } + + public boolean alwaysValid() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NmtokenDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NmtokenDatatype.java new file mode 100644 index 0000000..86f6dc9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/NmtokenDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.xml.util.Naming; + +class NmtokenDatatype extends TokenDatatype { + public boolean lexicallyAllows(String str) { + return Naming.isNmtoken(str); + } + public int getLength(Object obj) { + // Surrogates are not possible in an NMTOKEN. + return ((String)obj).length(); + } + public boolean alwaysValid() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/OrderRelation.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/OrderRelation.java new file mode 100644 index 0000000..55f0944 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/OrderRelation.java @@ -0,0 +1,5 @@ +package com.thaiopensource.datatype.xsd; + +interface OrderRelation { + boolean isLessThan(Object obj1, Object obj2); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.java new file mode 100644 index 0000000..9e64a3e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PatternRestrictDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.datatype.xsd.regex.Regex; + +class PatternRestrictDatatype extends RestrictDatatype { + private final Regex pattern; + + PatternRestrictDatatype(DatatypeBase base, Regex pattern) { + super(base); + this.pattern = pattern; + } + + boolean lexicallyAllows(String str) { + return pattern.matches(str) && super.lexicallyAllows(str); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PrecisionRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PrecisionRestrictDatatype.java new file mode 100644 index 0000000..c7085d5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/PrecisionRestrictDatatype.java @@ -0,0 +1,20 @@ +package com.thaiopensource.datatype.xsd; + +import java.math.BigDecimal; + +class PrecisionRestrictDatatype extends ValueRestrictDatatype { + private final int precision; + + PrecisionRestrictDatatype(DatatypeBase base, int precision) { + super(base); + this.precision = precision; + } + + boolean satisfiesRestriction(Object obj) { + return getPrecision((BigDecimal)obj) <= precision; + } + + static int getPrecision(BigDecimal n) { + return n.movePointRight(n.scale()).abs().toString().length(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/QNameDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/QNameDatatype.java new file mode 100644 index 0000000..54b8e8b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/QNameDatatype.java @@ -0,0 +1,54 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; +import com.thaiopensource.xml.util.Naming; + +class QNameDatatype extends DatatypeBase { + public boolean lexicallyAllows(String str) { + return Naming.isQname(str); + } + + static class QName { + private final String namespaceURI; + private final String localName; + QName(String namespaceURI, String localName) { + this.namespaceURI = namespaceURI; + this.localName = localName; + } + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof QName)) + return false; + QName other = (QName)obj; + return namespaceURI.equals(other.namespaceURI) && localName.equals(other.localName); + } + public int hashCode() { + return localName.hashCode() ^ namespaceURI.hashCode(); + } + } + + Object getValue(String str, ValidationContext vc) { + int i = str.indexOf(':'); + if (i < 0) { + String ns = vc.resolveNamespacePrefix(""); + if (ns == null) + ns = ""; + return new QName(ns, str); + } + else { + String prefix = str.substring(0, i); + String ns = vc.resolveNamespacePrefix(prefix); + if (ns == null) + return null; + return new QName(ns, str.substring(i + 1)); + } + } + + boolean allowsValue(String str, ValidationContext vc) { + int i = str.indexOf(':'); + return i < 0 || vc.resolveNamespacePrefix(str.substring(0, i)) != null; + } + + public boolean isContextDependent() { + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RegexDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RegexDatatype.java new file mode 100644 index 0000000..2f40be5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RegexDatatype.java @@ -0,0 +1,27 @@ +package com.thaiopensource.datatype.xsd; + +import com.thaiopensource.datatype.xsd.regex.Regex; +import com.thaiopensource.datatype.xsd.regex.RegexEngine; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; + +class RegexDatatype extends TokenDatatype { + private final String pattern; + private Regex regex; + + RegexDatatype(String pattern) { + this.pattern = pattern; + } + + synchronized void compile(RegexEngine engine) throws RegexSyntaxException { + if (regex == null) + regex = engine.compile(pattern); + } + + public boolean lexicallyAllows(String str) { + return regex.matches(str); + } + + public boolean alwaysValid() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RestrictDatatype.java new file mode 100644 index 0000000..53e1d43 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/RestrictDatatype.java @@ -0,0 +1,52 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +class RestrictDatatype extends DatatypeBase { + protected final DatatypeBase base; + + RestrictDatatype(DatatypeBase base) { + this(base, base.getWhiteSpace()); + } + + RestrictDatatype(DatatypeBase base, int whiteSpace) { + super(whiteSpace); + this.base = base; + } + + boolean lexicallyAllows(String str) { + return base.lexicallyAllows(str); + } + + boolean allowsValue(String str, ValidationContext vc) { + return base.allowsValue(str, vc); + } + + OrderRelation getOrderRelation() { + return base.getOrderRelation(); + } + + Measure getMeasure() { + return base.getMeasure(); + } + + Object getValue(String str, ValidationContext vc) { + return base.getValue(str, vc); + } + + DatatypeBase getPrimitive() { + return base.getPrimitive(); + } + + public int getIdType() { + return base.getIdType(); + } + + public boolean sameValue(Object value1, Object value2) { + return base.sameValue(value1, value2); + } + + public int valueHashCode(Object value) { + return base.valueHashCode(value); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ScaleRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ScaleRestrictDatatype.java new file mode 100644 index 0000000..d7956da --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ScaleRestrictDatatype.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd; + +import java.math.BigDecimal; + +class ScaleRestrictDatatype extends ValueRestrictDatatype { + private final int scale; + + ScaleRestrictDatatype(DatatypeBase base, int scale) { + super(base); + this.scale = scale; + } + + boolean satisfiesRestriction(Object obj) { + return ((BigDecimal)obj).scale() <= scale; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/StringDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/StringDatatype.java new file mode 100644 index 0000000..3753379 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/StringDatatype.java @@ -0,0 +1,7 @@ +package com.thaiopensource.datatype.xsd; + +class StringDatatype extends TokenDatatype { + StringDatatype() { + super(WHITE_SPACE_PRESERVE); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/TokenDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/TokenDatatype.java new file mode 100644 index 0000000..5fb1824 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/TokenDatatype.java @@ -0,0 +1,38 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; +import com.thaiopensource.util.Utf16; + +class TokenDatatype extends DatatypeBase implements Measure { + + TokenDatatype() { } + TokenDatatype(int whiteSpace) { + super(whiteSpace); + } + + public boolean lexicallyAllows(String str) { + return true; + } + + public boolean alwaysValid() { + return true; + } + + Object getValue(String str, ValidationContext vc) { + return str; + } + + Measure getMeasure() { + return this; + } + + public int getLength(Object obj) { + String str = (String)obj; + int len = str.length(); + int nSurrogatePairs = 0; + for (int i = 0; i < len; i++) + if (Utf16.isSurrogate1(str.charAt(i))) + nSurrogatePairs++; + return len - nSurrogatePairs; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.java new file mode 100644 index 0000000..dee7f09 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/ValueRestrictDatatype.java @@ -0,0 +1,22 @@ +package com.thaiopensource.datatype.xsd; + +import org.relaxng.datatype.ValidationContext; + +abstract class ValueRestrictDatatype extends RestrictDatatype { + ValueRestrictDatatype(DatatypeBase base) { + super(base); + } + + boolean allowsValue(String str, ValidationContext vc) { + return getValue(str, vc) != null; + } + + Object getValue(String str, ValidationContext vc) { + Object obj = base.getValue(str, vc); + if (obj == null || !satisfiesRestriction(obj)) + return null; + return obj; + } + + abstract boolean satisfiesRestriction(Object value); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/Regex.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/Regex.java new file mode 100644 index 0000000..60de4e5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/Regex.java @@ -0,0 +1,16 @@ +package com.thaiopensource.datatype.xsd.regex; + +/** + * A regular expression that can be matched against a string. + * @see RegexEngine + */ +public interface Regex { + /** + * Tests whether this regular expression matches a string. + * + * @param str the String to be tested + * @return true if str matches this regular expression, + * false otherwise + */ + boolean matches(String str); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexEngine.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexEngine.java new file mode 100644 index 0000000..2276b8f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexEngine.java @@ -0,0 +1,17 @@ +package com.thaiopensource.datatype.xsd.regex; + +/** + * A provider of a regular expression matching capability. + */ +public interface RegexEngine { + /** + * Compiles a string containing a regular expression into a Regex object. + * The Regex object can be used to test whether a string matches the regular + * expression. + * + * @param str a String containing a regular expression + * @return a Regex for str + * @throws RegexSyntaxException if str is not a valid regular expression + */ + Regex compile(String str) throws RegexSyntaxException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.java new file mode 100644 index 0000000..ec11b26 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/RegexSyntaxException.java @@ -0,0 +1,33 @@ +package com.thaiopensource.datatype.xsd.regex; + +/** + * Thrown when an syntactically incorrect regular expression is detected. + */ +public class RegexSyntaxException extends Exception { + private final int position; + + /** + * Represents an unknown position within a string containing a regular expression. + */ + static public final int UNKNOWN_POSITION = -1; + + public RegexSyntaxException(String detail) { + this(detail, UNKNOWN_POSITION); + } + + public RegexSyntaxException(String detail, int position) { + super(detail); + this.position = position; + } + + /** + * Returns the index into the regular expression where the error was detected + * or UNKNOWN_POSITION if this is unknown. + * + * @return the index into the regular expression where the error was detected, + * or UNKNOWNN_POSITION if this is unknown + */ + public int getPosition() { + return position; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.java new file mode 100644 index 0000000..2a4d51f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Categories.java @@ -0,0 +1,141 @@ +// This file was automatically generated by com.thaiopensource.datatype.xsd.regex.jdk1_4.gen.CategoriesGen +package com.thaiopensource.datatype.xsd.regex.jdk1_4; + +class Categories { + + static final String CATEGORY_NAMES = "NoLoMnCfLlNlLuMcNdSoSmCo"; + + static final int[][] CATEGORY_RANGES = { + { + // No + 0x10320, 0x10323 + }, + { + // Lo + 0x10300, 0x1031e, + 0x10330, 0x10349, + 0x20000, 0x2a6d6, + 0x2f800, 0x2fa1d + }, + { + // Mn + 0x1d167, 0x1d169, + 0x1d17b, 0x1d182, + 0x1d185, 0x1d18b, + 0x1d1aa, 0x1d1ad + }, + { + // Cf + 0x1d173, 0x1d17a, + 0xe0001, 0xe0001, + 0xe0020, 0xe007f + }, + { + // Ll + 0x10428, 0x1044d, + 0x1d41a, 0x1d433, + 0x1d44e, 0x1d454, + 0x1d456, 0x1d467, + 0x1d482, 0x1d49b, + 0x1d4b6, 0x1d4b9, + 0x1d4bb, 0x1d4bb, + 0x1d4bd, 0x1d4c0, + 0x1d4c2, 0x1d4c3, + 0x1d4c5, 0x1d4cf, + 0x1d4ea, 0x1d503, + 0x1d51e, 0x1d537, + 0x1d552, 0x1d56b, + 0x1d586, 0x1d59f, + 0x1d5ba, 0x1d5d3, + 0x1d5ee, 0x1d607, + 0x1d622, 0x1d63b, + 0x1d656, 0x1d66f, + 0x1d68a, 0x1d6a3, + 0x1d6c2, 0x1d6da, + 0x1d6dc, 0x1d6e1, + 0x1d6fc, 0x1d714, + 0x1d716, 0x1d71b, + 0x1d736, 0x1d74e, + 0x1d750, 0x1d755, + 0x1d770, 0x1d788, + 0x1d78a, 0x1d78f, + 0x1d7aa, 0x1d7c2, + 0x1d7c4, 0x1d7c9 + }, + { + // Nl + 0x1034a, 0x1034a + }, + { + // Lu + 0x10400, 0x10425, + 0x1d400, 0x1d419, + 0x1d434, 0x1d44d, + 0x1d468, 0x1d481, + 0x1d49c, 0x1d49c, + 0x1d49e, 0x1d49f, + 0x1d4a2, 0x1d4a2, + 0x1d4a5, 0x1d4a6, + 0x1d4a9, 0x1d4ac, + 0x1d4ae, 0x1d4b5, + 0x1d4d0, 0x1d4e9, + 0x1d504, 0x1d505, + 0x1d507, 0x1d50a, + 0x1d50d, 0x1d514, + 0x1d516, 0x1d51c, + 0x1d538, 0x1d539, + 0x1d53b, 0x1d53e, + 0x1d540, 0x1d544, + 0x1d546, 0x1d546, + 0x1d54a, 0x1d550, + 0x1d56c, 0x1d585, + 0x1d5a0, 0x1d5b9, + 0x1d5d4, 0x1d5ed, + 0x1d608, 0x1d621, + 0x1d63c, 0x1d655, + 0x1d670, 0x1d689, + 0x1d6a8, 0x1d6c0, + 0x1d6e2, 0x1d6fa, + 0x1d71c, 0x1d734, + 0x1d756, 0x1d76e, + 0x1d790, 0x1d7a8 + }, + { + // Mc + 0x1d165, 0x1d166, + 0x1d16d, 0x1d172 + }, + { + // Nd + 0x1d7ce, 0x1d7ff + }, + { + // So + 0x1d000, 0x1d0f5, + 0x1d100, 0x1d126, + 0x1d12a, 0x1d164, + 0x1d16a, 0x1d16c, + 0x1d183, 0x1d184, + 0x1d18c, 0x1d1a9, + 0x1d1ae, 0x1d1dd + }, + { + // Sm + 0x1d6c1, 0x1d6c1, + 0x1d6db, 0x1d6db, + 0x1d6fb, 0x1d6fb, + 0x1d715, 0x1d715, + 0x1d735, 0x1d735, + 0x1d74f, 0x1d74f, + 0x1d76f, 0x1d76f, + 0x1d789, 0x1d789, + 0x1d7a9, 0x1d7a9, + 0x1d7c3, 0x1d7c3 + }, + { + // Co + 0xf0000, 0xffffd, + 0x100000, 0x10fffd + } + }; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/NamingExceptions.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/NamingExceptions.java new file mode 100644 index 0000000..1f8bd69 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/NamingExceptions.java @@ -0,0 +1,46 @@ +// This file was automatically generated by com.thaiopensource.datatype.xsd.regex.jdk1_4.gen.NamingExceptionsGen +package com.thaiopensource.datatype.xsd.regex.jdk1_4; + +class NamingExceptions { + static final String NMSTRT_INCLUDES = + "\u003A\u005F\u02BB\u02BC\u02BD\u02BE\u02BF\u02C0\u02C1\u0559" + + "\u06E5\u06E6\u212E"; + static final String NMSTRT_EXCLUDE_RANGES = + "\u00AA\u00BA\u0132\u0133\u013F\u0140\u0149\u0149\u017F\u017F" + + "\u01C4\u01CC\u01F1\u01F3\u01F6\u01F9\u0218\u0233\u02A9\u02AD" + + "\u03D7\u03D7\u03DB\u03DB\u03DD\u03DD\u03DF\u03DF\u03E1\u03E1" + + "\u0400\u0400\u040D\u040D\u0450\u0450\u045D\u045D\u048C\u048F" + + "\u04EC\u04ED\u0587\u0587\u06B8\u06B9\u06BF\u06BF\u06CF\u06CF" + + "\u06FA\u07A5\u0950\u0950\u0AD0\u0AD0\u0D85\u0DC6\u0E2F\u0E2F" + + "\u0EAF\u0EAF\u0EDC\u0F00\u0F6A\u1055\u1101\u1101\u1104\u1104" + + "\u1108\u1108\u110A\u110A\u110D\u110D\u1113\u113B\u113D\u113D" + + "\u113F\u113F\u1141\u114B\u114D\u114D\u114F\u114F\u1151\u1153" + + "\u1156\u1158\u1162\u1162\u1164\u1164\u1166\u1166\u1168\u1168" + + "\u116A\u116C\u116F\u1171\u1174\u1174\u1176\u119D\u119F\u11A2" + + "\u11A9\u11AA\u11AC\u11AD\u11B0\u11B6\u11B9\u11B9\u11BB\u11BB" + + "\u11C3\u11EA\u11EC\u11EF\u11F1\u11F8\u1200\u18A8\u207F\u2124" + + "\u2128\u2128\u212C\u212D\u212F\u217F\u2183\u3006\u3038\u303A" + + "\u3131\u4DB5\uA000\uA48C\uF900\uFFDC"; + static final String NMSTRT_CATEGORIES = "LlLuLoLtNl"; + static final String NMCHAR_INCLUDES = + "\u002D\u002E\u003A\u005F\u00B7\u0387\u212E"; + static final String NMCHAR_EXCLUDE_RANGES = + "\u00AA\u00B5\u00BA\u00BA\u0132\u0133\u013F\u0140\u0149\u0149" + + "\u017F\u017F\u01C4\u01CC\u01F1\u01F3\u01F6\u01F9\u0218\u0233" + + "\u02A9\u02B8\u02E0\u02EE\u0346\u034E\u0362\u037A\u03D7\u03D7" + + "\u03DB\u03DB\u03DD\u03DD\u03DF\u03DF\u03E1\u03E1\u0400\u0400" + + "\u040D\u040D\u0450\u0450\u045D\u045D\u0488\u048F\u04EC\u04ED" + + "\u0587\u0587\u0653\u0655\u06B8\u06B9\u06BF\u06BF\u06CF\u06CF" + + "\u06FA\u07B0\u0950\u0950\u0AD0\u0AD0\u0D82\u0DF3\u0E2F\u0E2F" + + "\u0EAF\u0EAF\u0EDC\u0F00\u0F6A\u0F6A\u0F96\u0F96\u0FAE\u0FB0" + + "\u0FB8\u0FB8\u0FBA\u1059\u1101\u1101\u1104\u1104\u1108\u1108" + + "\u110A\u110A\u110D\u110D\u1113\u113B\u113D\u113D\u113F\u113F" + + "\u1141\u114B\u114D\u114D\u114F\u114F\u1151\u1153\u1156\u1158" + + "\u1162\u1162\u1164\u1164\u1166\u1166\u1168\u1168\u116A\u116C" + + "\u116F\u1171\u1174\u1174\u1176\u119D\u119F\u11A2\u11A9\u11AA" + + "\u11AC\u11AD\u11B0\u11B6\u11B9\u11B9\u11BB\u11BB\u11C3\u11EA" + + "\u11EC\u11EF\u11F1\u11F8\u1200\u18A9\u207F\u207F\u20DD\u20E0" + + "\u20E2\u2124\u2128\u2128\u212C\u212D\u212F\u217F\u2183\u2183" + + "\u3006\u3006\u3038\u303A\u3131\u4DB5\uA000\uA48C\uF900\uFFDC"; + static final String NMCHAR_CATEGORIES = "LlLuLoLtNlMcMeMnLmNd"; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.java new file mode 100644 index 0000000..e396fd1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/RegexEngineImpl.java @@ -0,0 +1,30 @@ +package com.thaiopensource.datatype.xsd.regex.jdk1_4; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import com.thaiopensource.datatype.xsd.regex.RegexEngine; +import com.thaiopensource.datatype.xsd.regex.Regex; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; + +/** + * An implementation of RegexEngine using the JDK 1.4 java.util.regex + * package. + */ +public class RegexEngineImpl implements RegexEngine { + public RegexEngineImpl() { + // Force a linkage error on instantiation if JDK 1.4 is not available. + Pattern.compile("x"); + } + + public Regex compile(String str) throws RegexSyntaxException { + // Don't catch PatternSyntaxException + // The Translator should detect all syntax errors + final Pattern pattern = Pattern.compile(Translator.translate(str)); + return new Regex() { + public boolean matches(String str) { + return pattern.matcher(str).matches(); + } + }; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.java new file mode 100644 index 0000000..3437bba --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/Translator.java @@ -0,0 +1,1313 @@ +package com.thaiopensource.datatype.xsd.regex.jdk1_4; + +import com.thaiopensource.util.Utf16; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.math.BigDecimal; + +/** + * Translates XML Schema regexes into java.util.regex regexes. + * + * @see java.util.regex.Pattern + * @see XML Schema Part 2 + */ +public class Translator { + private final String regExp; + private int pos = 0; + private final int length; + private char curChar; + private boolean eos = false; + private final StringBuffer result = new StringBuffer(); + + static private final String categories = "LMNPZSC"; + static private final CharClass[] categoryCharClasses = new CharClass[categories.length()]; + static private final String subCategories = "LuLlLtLmLoMnMcMeNdNlNoPcPdPsPePiPfPoZsZlZpSmScSkSoCcCfCoCn"; + static private final CharClass[] subCategoryCharClasses = new CharClass[subCategories.length() / 2]; + + static private final int NONBMP_MIN = 0x10000; + static private final int NONBMP_MAX = 0x10FFFF; + static private final char SURROGATE2_MIN = '\uDC00'; + static private final char SURROGATE2_MAX = '\uDFFF'; + + static final Localizer localizer = new Localizer(Translator.class); + + static private final String[] blockNames = { + "BasicLatin", + "Latin-1Supplement", + "LatinExtended-A", + "LatinExtended-B", + "IPAExtensions", + "SpacingModifierLetters", + "CombiningDiacriticalMarks", + "Greek", + "Cyrillic", + "Armenian", + "Hebrew", + "Arabic", + "Syriac", + "Thaana", + "Devanagari", + "Bengali", + "Gurmukhi", + "Gujarati", + "Oriya", + "Tamil", + "Telugu", + "Kannada", + "Malayalam", + "Sinhala", + "Thai", + "Lao", + "Tibetan", + "Myanmar", + "Georgian", + "HangulJamo", + "Ethiopic", + "Cherokee", + "UnifiedCanadianAboriginalSyllabics", + "Ogham", + "Runic", + "Khmer", + "Mongolian", + "LatinExtendedAdditional", + "GreekExtended", + "GeneralPunctuation", + "SuperscriptsandSubscripts", + "CurrencySymbols", + "CombiningMarksforSymbols", + "LetterlikeSymbols", + "NumberForms", + "Arrows", + "MathematicalOperators", + "MiscellaneousTechnical", + "ControlPictures", + "OpticalCharacterRecognition", + "EnclosedAlphanumerics", + "BoxDrawing", + "BlockElements", + "GeometricShapes", + "MiscellaneousSymbols", + "Dingbats", + "BraillePatterns", + "CJKRadicalsSupplement", + "KangxiRadicals", + "IdeographicDescriptionCharacters", + "CJKSymbolsandPunctuation", + "Hiragana", + "Katakana", + "Bopomofo", + "HangulCompatibilityJamo", + "Kanbun", + "BopomofoExtended", + "EnclosedCJKLettersandMonths", + "CJKCompatibility", + "CJKUnifiedIdeographsExtensionA", + "CJKUnifiedIdeographs", + "YiSyllables", + "YiRadicals", + "HangulSyllables", + // surrogates excluded because there are never any *characters* with codes in surrogate range + // "PrivateUse", excluded because 3.1 adds non-BMP ranges + "CJKCompatibilityIdeographs", + "AlphabeticPresentationForms", + "ArabicPresentationForms-A", + "CombiningHalfMarks", + "CJKCompatibilityForms", + "SmallFormVariants", + "ArabicPresentationForms-B", + "Specials", + "HalfwidthandFullwidthForms", + "Specials" + }; + + + /** + * Names of blocks including ranges outside the BMP. + */ + static private final String[] specialBlockNames = { + "OldItalic", + "Gothic", + "Deseret", + "ByzantineMusicalSymbols", + "MusicalSymbols", + "MathematicalAlphanumericSymbols", + "CJKUnifiedIdeographsExtensionB", + "CJKCompatibilityIdeographsSupplement", + "Tags", + "PrivateUse", + "HighSurrogates", + "HighPrivateUseSurrogates", + "LowSurrogates", + }; + + /** + * CharClass for each block name in specialBlockNames. + */ + static private final CharClass[] specialBlockCharClasses = { + new CharRange(0x10300, 0x1032F), + new CharRange(0x10330, 0x1034F), + new CharRange(0x10400, 0x1044F), + new CharRange(0x1D000, 0x1D0FF), + new CharRange(0x1D100, 0x1D1FF), + new CharRange(0x1D400, 0x1D7FF), + new CharRange(0x20000, 0x2A6D6), + new CharRange(0x2F800, 0x2FA1F), + new CharRange(0xE0000, 0xE007F), + new Union(new CharClass[] { + new CharRange(0xE000, 0xF8FF), + new CharRange(0xF0000, 0xFFFFD), + new CharRange(0x100000, 0x10FFFD) + }), + Empty.getInstance(), + Empty.getInstance(), + Empty.getInstance() + }; + + static private final CharClass DOT = new Complement(new Union(new CharClass[] { new SingleChar('\n'), new SingleChar('\r') })); + + static private final CharClass ESC_d = new Property("Nd"); + + static private final CharClass ESC_D = new Complement(ESC_d); + + static private final CharClass ESC_W = new Union(new CharClass[] {new Property("P"), new Property("Z"), new Property("C")}); + + static private final CharClass ESC_w = new Complement(ESC_W); + + static private final CharClass ESC_s = new Union(new CharClass[] { + new SingleChar(' '), + new SingleChar('\n'), + new SingleChar('\r'), + new SingleChar('\t') + }); + + static private final CharClass ESC_S = new Complement(ESC_s); + + static private final CharClass ESC_i = makeCharClass(NamingExceptions.NMSTRT_CATEGORIES, + NamingExceptions.NMSTRT_INCLUDES, + NamingExceptions.NMSTRT_EXCLUDE_RANGES); + + static private final CharClass ESC_I = new Complement(ESC_i); + + static private final CharClass ESC_c = makeCharClass(NamingExceptions.NMCHAR_CATEGORIES, + NamingExceptions.NMCHAR_INCLUDES, + NamingExceptions.NMCHAR_EXCLUDE_RANGES); + + static private final CharClass ESC_C = new Complement(ESC_c); + + static private final char EOS = '\0'; + + private Translator(String regExp) { + this.regExp = regExp; + this.length = regExp.length(); + advance(); + } + + /** + * Translates a regular expression in the syntax of XML Schemas Part 2 into a regular + * expression in the syntax of java.util.regex.Pattern. The translation + * assumes that the string to be matched against the regex uses surrogate pairs correctly. + * If the string comes from XML content, a conforming XML parser will automatically + * check this; if the string comes from elsewhere, it may be necessary to check + * surrogate usage before matching. + * + * @param regexp a String containing a regular expression in the syntax of XML Schemas Part 2 + * @return a String containing a regular expression in the syntax of java.util.regex.Pattern + * @throws RegexSyntaxException if regexp is not a regular expression in the + * syntax of XML Schemas Part 2 + * @see java.util.regex.Pattern + * @see XML Schema Part 2 + */ + static public String translate(String regexp) throws RegexSyntaxException { + Translator tr = new Translator(regexp); + tr.translateTop(); + return tr.result.toString(); + } + + private void advance() { + if (pos < length) + curChar = regExp.charAt(pos++); + else { + pos++; + curChar = EOS; + eos = true; + } + } + + private void translateTop() throws RegexSyntaxException { + translateRegExp(); + if (!eos) + throw makeException("expected_eos"); + } + + private void translateRegExp() throws RegexSyntaxException { + translateBranch(); + while (curChar == '|') { + copyCurChar(); + translateBranch(); + } + } + + private void translateBranch() throws RegexSyntaxException { + while (translateAtom()) + translateQuantifier(); + } + + private void translateQuantifier() throws RegexSyntaxException { + switch (curChar) { + case '*': + case '?': + case '+': + copyCurChar(); + return; + case '{': + copyCurChar(); + translateQuantity(); + expect('}'); + copyCurChar(); + } + } + + private void translateQuantity() throws RegexSyntaxException { + String lower = parseQuantExact(); + int lowerValue = -1; + try { + lowerValue = Integer.parseInt(lower); + result.append(lower); + } + catch (NumberFormatException e) { + // JDK 1.4 cannot handle ranges bigger than this + result.append(Integer.MAX_VALUE); + } + if (curChar == ',') { + copyCurChar(); + if (curChar != '}') { + String upper = parseQuantExact(); + try { + int upperValue = Integer.parseInt(upper); + result.append(upper); + if (lowerValue < 0 || upperValue < lowerValue) + throw makeException("invalid_quantity_range"); + } + catch (NumberFormatException e) { + result.append(Integer.MAX_VALUE); + if (lowerValue < 0 && new BigDecimal(lower).compareTo(new BigDecimal(upper)) > 0) + throw makeException("invalid_quantity_range"); + } + } + } + } + + private String parseQuantExact() throws RegexSyntaxException { + StringBuffer buf = new StringBuffer(); + do { + if ("0123456789".indexOf(curChar) < 0) + throw makeException("expected_digit"); + buf.append(curChar); + advance(); + } while (curChar != ',' && curChar != '}'); + return buf.toString(); + } + + private void copyCurChar() { + result.append(curChar); + advance(); + } + + static final int NONE = -1; + static final int SOME = 0; + static final int ALL = 1; + + static final String SURROGATES1_CLASS = "[\uD800-\uDBFF]"; + static final String SURROGATES2_CLASS = "[\uDC00-\uDFFF]"; + static final String NOT_ALLOWED_CLASS = "[\u0000&&[^\u0000]]"; + + static final class Range implements Comparable { + private final int min; + private final int max; + + Range(int min, int max) { + this.min = min; + this.max = max; + } + + int getMin() { + return min; + } + + int getMax() { + return max; + } + + public int compareTo(Object o) { + Range other = (Range)o; + if (this.min < other.min) + return -1; + if (this.min > other.min) + return 1; + if (this.max > other.max) + return -1; + if (this.max < other.max) + return 1; + return 0; + } + } + + static abstract class CharClass { + + private final int containsBmp; + // if it contains ALL and containsBmp != NONE, then the generated class for containsBmp must + // contain all the high surrogates + private final int containsNonBmp; + + protected CharClass(int containsBmp, int containsNonBmp) { + this.containsBmp = containsBmp; + this.containsNonBmp = containsNonBmp; + } + + int getContainsBmp() { + return containsBmp; + } + + int getContainsNonBmp() { + return containsNonBmp; + } + + final void output(StringBuffer buf) { + switch (containsNonBmp) { + case NONE: + if (containsBmp == NONE) + buf.append(NOT_ALLOWED_CLASS); + else + outputBmp(buf); + break; + case ALL: + buf.append('('); + if (containsBmp == NONE) { + buf.append(SURROGATES1_CLASS); + buf.append(SURROGATES2_CLASS); + } + else { + outputBmp(buf); + buf.append(SURROGATES2_CLASS); + buf.append('?'); + } + buf.append(')'); + break; + case SOME: + buf.append('('); + boolean needSep = false; + if (containsBmp != NONE) { + needSep = true; + outputBmp(buf); + } + List ranges = new Vector(); + addNonBmpRanges(ranges); + sortRangeList(ranges); + String hi = highSurrogateRanges(ranges); + if (hi.length() > 0) { + if (needSep) + buf.append('|'); + else + needSep = true; + buf.append('['); + for (int i = 0, len = hi.length(); i < len; i += 2) { + char min = hi.charAt(i); + char max = hi.charAt(i + 1); + if (min == max) + buf.append(min); + else { + buf.append(min); + buf.append('-'); + buf.append(max); + } + } + buf.append(']'); + buf.append(SURROGATES2_CLASS); + } + String lo = lowSurrogateRanges(ranges); + for (int i = 0, len = lo.length(); i < len; i += 3) { + if (needSep) + buf.append('|'); + else + needSep = true; + buf.append(lo.charAt(i)); + char min = lo.charAt(i + 1); + char max = lo.charAt(i + 2); + if (min == max && (i + 3 >= len || lo.charAt(i + 3) != lo.charAt(i))) + buf.append(min); + else { + buf.append('['); + for (;;) { + if (min == max) + buf.append(min); + else { + buf.append(min); + buf.append('-'); + buf.append(max); + } + if (i + 3 >= len || lo.charAt(i + 3) != lo.charAt(i)) + break; + i += 3; + min = lo.charAt(i + 1); + max = lo.charAt(i + 2); + } + buf.append(']'); + } + } + if (!needSep) + buf.append(NOT_ALLOWED_CLASS); + buf.append(')'); + break; + } + } + + static String highSurrogateRanges(List ranges) { + StringBuffer highRanges = new StringBuffer(); + for (int i = 0, len = ranges.size(); i < len; i++) { + Range r = (Range)ranges.get(i); + char min1 = Utf16.surrogate1(r.getMin()); + char min2 = Utf16.surrogate2(r.getMin()); + char max1 = Utf16.surrogate1(r.getMax()); + char max2 = Utf16.surrogate2(r.getMax()); + if (min2 != SURROGATE2_MIN) + min1++; + if (max2 != SURROGATE2_MAX) + max1--; + if (max1 >= min1) { + highRanges.append(min1); + highRanges.append(max1); + } + } + return highRanges.toString(); + } + + static String lowSurrogateRanges(List ranges) { + StringBuffer lowRanges = new StringBuffer(); + for (int i = 0, len = ranges.size(); i < len; i++) { + Range r = (Range)ranges.get(i); + char min1 = Utf16.surrogate1(r.getMin()); + char min2 = Utf16.surrogate2(r.getMin()); + char max1 = Utf16.surrogate1(r.getMax()); + char max2 = Utf16.surrogate2(r.getMax()); + if (min1 == max1) { + if (min2 != SURROGATE2_MIN || max2 != SURROGATE2_MAX) { + lowRanges.append(min1); + lowRanges.append(min2); + lowRanges.append(max2); + } + } + else { + if (min2 != SURROGATE2_MIN) { + lowRanges.append(min1); + lowRanges.append(min2); + lowRanges.append(SURROGATE2_MAX); + } + if (max2 != SURROGATE2_MAX) { + lowRanges.append(max1); + lowRanges.append(SURROGATE2_MIN); + lowRanges.append(max2); + } + } + } + return lowRanges.toString(); + } + + abstract void outputBmp(StringBuffer buf); + abstract void outputComplementBmp(StringBuffer buf); + + int singleChar() { + return -1; + } + + void addNonBmpRanges(List ranges) { + } + + + static void sortRangeList(List ranges) { + Collections.sort(ranges); + int toIndex = 0; + int fromIndex = 0; + int len = ranges.size(); + while (fromIndex < len) { + Range r = (Range)ranges.get(fromIndex); + int min = r.getMin(); + int max = r.getMax(); + while (++fromIndex < len) { + Range r2 = (Range)ranges.get(fromIndex); + if (r2.getMin() > max + 1) + break; + if (r2.getMax() > max) + max = r2.getMax(); + } + if (max != r.getMax()) + r = new Range(min, max); + ranges.set(toIndex++, r); + } + while (len > toIndex) + ranges.remove(--len); + } + + } + + static abstract class SimpleCharClass extends CharClass { + SimpleCharClass(int containsBmp, int containsNonBmp) { + super(containsBmp, containsNonBmp); + } + + void outputBmp(StringBuffer buf) { + buf.append('['); + inClassOutputBmp(buf); + buf.append(']'); + } + + // must not call if containsBmp == ALL + void outputComplementBmp(StringBuffer buf) { + if (getContainsBmp() == NONE) + buf.append("[\u0000-\uFFFF]"); + else { + buf.append("[^"); + inClassOutputBmp(buf); + buf.append(']'); + } + } + abstract void inClassOutputBmp(StringBuffer buf); + } + + static class SingleChar extends SimpleCharClass { + private final char c; + SingleChar(char c) { + super(SOME, NONE); + this.c = c; + } + + int singleChar() { + return c; + } + + void outputBmp(StringBuffer buf) { + inClassOutputBmp(buf); + } + + void inClassOutputBmp(StringBuffer buf) { + if (isJavaMetaChar(c)) + buf.append('\\'); + buf.append(c); + } + + } + + static class WideSingleChar extends SimpleCharClass { + private final int c; + + WideSingleChar(int c) { + super(NONE, SOME); + this.c = c; + } + + void inClassOutputBmp(StringBuffer buf) { + throw new RuntimeException("BMP output botch"); + } + + int singleChar() { + return c; + } + + void addNonBmpRanges(List ranges) { + ranges.add(new Range(c, c)); + } + } + + static class Empty extends SimpleCharClass { + static private final Empty instance = new Empty(); + private Empty() { + super(NONE, NONE); + } + + static Empty getInstance() { + return instance; + } + + void inClassOutputBmp(StringBuffer buf) { + throw new RuntimeException("BMP output botch"); + } + + } + + static class CharRange extends SimpleCharClass { + private final int lower; + private final int upper; + + CharRange(int lower, int upper) { + super(lower < NONBMP_MIN ? SOME : NONE, + // don't use ALL here, because that requires that the BMP class contains high surrogates + upper >= NONBMP_MIN ? SOME : NONE); + this.lower = lower; + this.upper = upper; + } + + void inClassOutputBmp(StringBuffer buf) { + if (lower >= NONBMP_MIN) + throw new RuntimeException("BMP output botch"); + if (isJavaMetaChar((char)lower)) + buf.append('\\'); + buf.append((char)lower); + buf.append('-'); + if (upper < NONBMP_MIN) { + if (isJavaMetaChar((char)upper)) + buf.append('\\'); + buf.append((char)upper); + } + else + buf.append('\uFFFF'); + } + + void addNonBmpRanges(List ranges) { + if (upper >= NONBMP_MIN) + ranges.add(new Range(lower < NONBMP_MIN ? NONBMP_MIN : lower, upper)); + } + } + + static class Property extends SimpleCharClass { + private final String name; + + Property(String name) { + super(SOME, NONE); + this.name = name; + } + + void outputBmp(StringBuffer buf) { + inClassOutputBmp(buf); + } + + void inClassOutputBmp(StringBuffer buf) { + buf.append("\\p{"); + buf.append(name); + buf.append('}'); + } + + void outputComplementBmp(StringBuffer buf) { + buf.append("\\P{"); + buf.append(name); + buf.append('}'); + } + } + + static class Subtraction extends CharClass { + private final CharClass cc1; + private final CharClass cc2; + Subtraction(CharClass cc1, CharClass cc2) { + // min corresponds to intersection + // complement corresponds to negation + super(Math.min(cc1.getContainsBmp(), -cc2.getContainsBmp()), + Math.min(cc1.getContainsNonBmp(), -cc2.getContainsNonBmp())); + this.cc1 = cc1; + this.cc2 = cc2; + } + + void outputBmp(StringBuffer buf) { + buf.append('['); + cc1.outputBmp(buf); + buf.append("&&"); + cc2.outputComplementBmp(buf); + buf.append(']'); + } + + void outputComplementBmp(StringBuffer buf) { + buf.append('['); + cc1.outputComplementBmp(buf); + cc2.outputBmp(buf); + buf.append(']'); + } + + void addNonBmpRanges(List ranges) { + List posList = new Vector(); + cc1.addNonBmpRanges(posList); + List negList = new Vector(); + cc2.addNonBmpRanges(negList); + sortRangeList(posList); + sortRangeList(negList); + Iterator negIter = negList.iterator(); + Range negRange; + if (negIter.hasNext()) + negRange = (Range)negIter.next(); + else + negRange = null; + for (int i = 0, len = posList.size(); i < len; i++) { + Range posRange = (Range)posList.get(i); + while (negRange != null && negRange.getMax() < posRange.getMin()) { + if (negIter.hasNext()) + negRange = (Range)negIter.next(); + else + negRange = null; + } + // if negRange != null, negRange.max >= posRange.min + int min = posRange.getMin(); + while (negRange != null && negRange.getMin() <= posRange.getMax()) { + if (min < negRange.getMin()) { + ranges.add(new Range(min, negRange.getMin() - 1)); + } + min = negRange.getMax() + 1; + if (min > posRange.getMax()) + break; + if (negIter.hasNext()) + negRange = (Range)negIter.next(); + else + negRange = null; + } + if (min <= posRange.getMax()) + ranges.add(new Range(min, posRange.getMax())); + } + } + } + + static class Union extends CharClass { + private final List members; + + Union(CharClass[] v) { + this(toList(v)); + } + + static private List toList(CharClass[] v) { + List members = new Vector(); + for (int i = 0; i < v.length; i++) + members.add(v[i]); + return members; + } + + Union(List members) { + super(computeContainsBmp(members), computeContainsNonBmp(members)); + this.members = members; + } + + void outputBmp(StringBuffer buf) { + buf.append('['); + for (int i = 0, len = members.size(); i < len; i++) { + CharClass cc = (CharClass)members.get(i); + if (cc.getContainsBmp() != NONE) { + if (cc instanceof SimpleCharClass) + ((SimpleCharClass)cc).inClassOutputBmp(buf); + else + cc.outputBmp(buf); + } + } + buf.append(']'); + } + + void outputComplementBmp(StringBuffer buf) { + boolean first = true; + int len = members.size(); + for (int i = 0; i < len; i++) { + CharClass cc = (CharClass)members.get(i); + if (cc.getContainsBmp() != NONE && cc instanceof SimpleCharClass) { + if (first) { + buf.append("[^"); + first = false; + } + ((SimpleCharClass)cc).inClassOutputBmp(buf); + } + } + for (int i = 0; i < len; i++) { + CharClass cc = (CharClass)members.get(i); + if (cc.getContainsBmp() != NONE && !(cc instanceof SimpleCharClass)) { + if (first) { + buf.append('['); + first = false; + } + else + buf.append("&&"); + // can't have any members that are ALL, because that would make this ALL, which violates + // the precondition for outputComplementBmp + cc.outputComplementBmp(buf); + } + } + if (first == true) + // all members are NONE, so this is NONE, so complement is everything + buf.append("[\u0000-\uFFFF]"); + else + buf.append(']'); + } + + void addNonBmpRanges(List ranges) { + for (int i = 0, len = members.size(); i < len; i++) + ((CharClass)members.get(i)).addNonBmpRanges(ranges); + } + + private static int computeContainsBmp(List members) { + int ret = NONE; + for (int i = 0, len = members.size(); i < len; i++) + ret = Math.max(ret, ((CharClass)members.get(i)).getContainsBmp()); + return ret; + } + + private static int computeContainsNonBmp(List members) { + int ret = NONE; + for (int i = 0, len = members.size(); i < len; i++) + ret = Math.max(ret, ((CharClass)members.get(i)).getContainsNonBmp()); + return ret; + } + } + + static class Complement extends CharClass { + private final CharClass cc; + Complement(CharClass cc) { + super(-cc.getContainsBmp(), -cc.getContainsNonBmp()); + this.cc = cc; + } + + void outputBmp(StringBuffer buf) { + cc.outputComplementBmp(buf); + } + + void outputComplementBmp(StringBuffer buf) { + cc.outputBmp(buf); + } + + void addNonBmpRanges(List ranges) { + List tem = new Vector(); + cc.addNonBmpRanges(tem); + sortRangeList(tem); + int c = NONBMP_MIN; + for (int i = 0, len = tem.size(); i < len; i++) { + Range r = (Range)tem.get(i); + if (r.getMin() > c) + ranges.add(new Range(c, r.getMin() - 1)); + c = r.getMax() + 1; + } + if (c != NONBMP_MAX + 1) + ranges.add(new Range(c, NONBMP_MAX)); + } + } + + private boolean translateAtom() throws RegexSyntaxException { + switch (curChar) { + case EOS: + if (!eos) + break; + // fall through + case '?': + case '*': + case '+': + case ')': + case '{': + case '}': + case '|': + case ']': + return false; + case '(': + copyCurChar(); + translateRegExp(); + expect(')'); + copyCurChar(); + return true; + case '\\': + advance(); + parseEsc().output(result); + return true; + case '[': + advance(); + parseCharClassExpr().output(result); + return true; + case '.': + DOT.output(result); + advance(); + return true; + case '$': + case '^': + result.append('\\'); + break; + } + copyCurChar(); + return true; + } + + + static private CharClass makeCharClass(String categories, String includes, String excludeRanges) { + List includeList = new Vector(); + for (int i = 0, len = categories.length(); i < len; i += 2) + includeList.add(new Property(categories.substring(i, i + 2))); + for (int i = 0, len = includes.length(); i < len; i++) { + int j = i + 1; + for (; j < len && includes.charAt(j) - includes.charAt(i) == j - i; j++) + ; + --j; + if (i == j - 1) + --j; + if (i == j) + includeList.add(new SingleChar(includes.charAt(i))); + else + includeList.add(new CharRange(includes.charAt(i), includes.charAt(j))); + i = j; + } + List excludeList = new Vector(); + for (int i = 0, len = excludeRanges.length(); i < len; i += 2) { + char min = excludeRanges.charAt(i); + char max = excludeRanges.charAt(i + 1); + if (min == max) + excludeList.add(new SingleChar(min)); + else if (min == max - 1) { + excludeList.add(new SingleChar(min)); + excludeList.add(new SingleChar(max)); + } + else + excludeList.add(new CharRange(min, max)); + } + return new Subtraction(new Union(includeList), new Union(excludeList)); + } + + private CharClass parseEsc() throws RegexSyntaxException { + switch (curChar) { + case 'n': + advance(); + return new SingleChar('\n'); + case 'r': + advance(); + return new SingleChar('\r'); + case 't': + advance(); + return new SingleChar('\t'); + case '\\': + case '|': + case '.': + case '-': + case '^': + case '?': + case '*': + case '+': + case '(': + case ')': + case '{': + case '}': + case '[': + case ']': + break; + case 's': + advance(); + return ESC_s; + case 'S': + advance(); + return ESC_S; + case 'i': + advance(); + return ESC_i; + case 'I': + advance(); + return ESC_I; + case 'c': + advance(); + return ESC_c; + case 'C': + advance(); + return ESC_C; + case 'd': + advance(); + return ESC_d; + case 'D': + advance(); + return ESC_D; + case 'w': + advance(); + return ESC_w; + case 'W': + advance(); + return ESC_W; + case 'p': + advance(); + return parseProp(); + case 'P': + advance(); + return new Complement(parseProp()); + default: + throw makeException("bad_escape"); + } + CharClass tem = new SingleChar(curChar); + advance(); + return tem; + } + + private CharClass parseProp() throws RegexSyntaxException { + expect('{'); + int start = pos; + for (;;) { + advance(); + if (curChar == '}') + break; + if (!isAsciiAlnum(curChar) && curChar != '-') + expect('}'); + } + String propertyName = regExp.substring(start, pos - 1); + advance(); + switch (propertyName.length()) { + case 0: + throw makeException("empty_property_name"); + case 2: + int sci = subCategories.indexOf(propertyName); + if (sci < 0 || sci % 2 == 1) + throw makeException("bad_category"); + return getSubCategoryCharClass(sci / 2); + case 1: + int ci = categories.indexOf(propertyName.charAt(0)); + if (ci < 0) + throw makeException("bad_category", propertyName); + return getCategoryCharClass(ci); + default: + if (!propertyName.startsWith("Is")) + break; + String blockName = propertyName.substring(2); + for (int i = 0; i < specialBlockNames.length; i++) + if (blockName.equals(specialBlockNames[i])) + return specialBlockCharClasses[i]; + if (!isBlock(blockName)) + throw makeException("bad_block_name", blockName); + return new Property( "In" + blockName); + } + throw makeException("bad_property_name", propertyName); + } + + static private boolean isBlock(String name) { + for (int i = 0; i < blockNames.length; i++) + if (name.equals(blockNames[i])) + return true; + return false; + } + + static private boolean isAsciiAlnum(char c) { + if ('a' <= c && c <= 'z') + return true; + if ('A' <= c && c <= 'Z') + return true; + if ('0' <= c && c <= '9') + return true; + return false; + } + + private void expect(char c) throws RegexSyntaxException { + if (curChar != c) + throw makeException("expected", new String(new char[]{c})); + } + + private CharClass parseCharClassExpr() throws RegexSyntaxException { + boolean compl; + if (curChar == '^') { + advance(); + compl = true; + } + else + compl = false; + List members = new Vector(); + do { + CharClass lower = parseCharClassEscOrXmlChar(); + members.add(lower); + if (curChar == '-') { + advance(); + if (curChar == '[') + break; + CharClass upper = parseCharClassEscOrXmlChar(); + if (lower.singleChar() < 0 || upper.singleChar() < 0) + throw makeException("multi_range"); + if (lower.singleChar() > upper.singleChar()) + throw makeException("invalid_range"); + members.set(members.size() - 1, + new CharRange(lower.singleChar(), upper.singleChar())); + if (curChar == '-') { + advance(); + expect('['); + break; + } + } + } while (curChar != ']'); + CharClass result; + if (members.size() == 1) + result = (CharClass)members.get(0); + else + result = new Union(members); + if (compl) + result = new Complement(result); + if (curChar == '[') { + advance(); + result = new Subtraction(result, parseCharClassExpr()); + expect(']'); + } + advance(); + return result; + } + + private CharClass parseCharClassEscOrXmlChar() throws RegexSyntaxException { + switch (curChar) { + case EOS: + if (eos) + expect(']'); + break; + case '\\': + advance(); + return parseEsc(); + case '[': + case ']': + case '-': + throw makeException("should_quote", new String(new char[]{curChar})); + } + CharClass tem; + if (Utf16.isSurrogate(curChar)) { + if (!Utf16.isSurrogate1(curChar)) + throw makeException("invalid_surrogate"); + char c1 = curChar; + advance(); + if (!Utf16.isSurrogate2(curChar)) + throw makeException("invalid_surrogate"); + tem = new WideSingleChar(Utf16.scalarValue(c1, curChar)); + } + else + tem = new SingleChar(curChar); + advance(); + return tem; + } + + private RegexSyntaxException makeException(String key) { + return new RegexSyntaxException(localizer.message(key), pos - 1); + } + + private RegexSyntaxException makeException(String key, String arg) { + return new RegexSyntaxException(localizer.message(key, arg), pos - 1); + } + + static private boolean isJavaMetaChar(char c) { + switch (c) { + case '\\': + case '^': + case '?': + case '*': + case '+': + case '(': + case ')': + case '{': + case '}': + case '|': + case '[': + case ']': + case '-': + case '&': + case '$': + case '.': + return true; + } + return false; + } + + static private synchronized CharClass getCategoryCharClass(int ci) { + if (categoryCharClasses[ci] == null) + categoryCharClasses[ci] = computeCategoryCharClass(categories.charAt(ci)); + return categoryCharClasses[ci]; + } + + static private synchronized CharClass getSubCategoryCharClass(int sci) { + if (subCategoryCharClasses[sci] == null) + subCategoryCharClasses[sci] = computeSubCategoryCharClass(subCategories.substring(sci * 2, (sci + 1) * 2)); + return subCategoryCharClasses[sci]; + } + + static private final char UNICODE_3_1_ADD_Lu = '\u03F4'; // added in 3.1 + static private final char UNICODE_3_1_ADD_Ll = '\u03F5'; // added in 3.1 + // 3 characters changed from No to Nl between 3.0 and 3.1 + static private final char UNICODE_3_1_CHANGE_No_to_Nl_MIN = '\u16EE'; + static private final char UNICODE_3_1_CHANGE_No_to_Nl_MAX = '\u16F0'; + static private final String CATEGORY_Pi = "\u00AB\u2018\u201B\u201C\u201F\u2039"; // Java doesn't know about category Pi + static private final String CATEGORY_Pf = "\u00BB\u2019\u201D\u203A"; // Java doesn't know about category Pf + + static private CharClass computeCategoryCharClass(char code) { + List classes = new Vector(); + classes.add(new Property(new String(new char[] { code }))); + for (int ci = Categories.CATEGORY_NAMES.indexOf(code); ci >= 0; ci = Categories.CATEGORY_NAMES.indexOf(code, ci + 1)) { + int[] addRanges = Categories.CATEGORY_RANGES[ci/2]; + for (int i = 0; i < addRanges.length; i += 2) + classes.add(new CharRange(addRanges[i], addRanges[i + 1])); + } + if (code == 'P') + classes.add(makeCharClass(CATEGORY_Pi + CATEGORY_Pf)); + if (code == 'L') { + classes.add(new SingleChar(UNICODE_3_1_ADD_Ll)); + classes.add(new SingleChar(UNICODE_3_1_ADD_Lu)); + } + if (code == 'C') { + // JDK 1.4 leaves Cn out of C? + classes.add(new Subtraction(new Property("Cn"), + new Union(new CharClass[] { new SingleChar(UNICODE_3_1_ADD_Lu), + new SingleChar(UNICODE_3_1_ADD_Ll) }))); + List assignedRanges = new Vector(); + for (int i = 0; i < Categories.CATEGORY_RANGES.length; i++) + for (int j = 0; j < Categories.CATEGORY_RANGES[i].length; j += 2) + assignedRanges.add(new CharRange(Categories.CATEGORY_RANGES[i][j], + Categories.CATEGORY_RANGES[i][j + 1])); + classes.add(new Subtraction(new CharRange(NONBMP_MIN, NONBMP_MAX), + new Union(assignedRanges))); + } + if (classes.size() == 1) + return (CharClass)classes.get(0); + return new Union(classes); + } + + static private CharClass computeSubCategoryCharClass(String name) { + CharClass base = new Property(name); + int sci = Categories.CATEGORY_NAMES.indexOf(name); + if (sci < 0) { + if (name.equals("Cn")) { + // Unassigned + List assignedRanges = new Vector(); + assignedRanges.add(new SingleChar(UNICODE_3_1_ADD_Lu)); + assignedRanges.add(new SingleChar(UNICODE_3_1_ADD_Ll)); + for (int i = 0; i < Categories.CATEGORY_RANGES.length; i++) + for (int j = 0; j < Categories.CATEGORY_RANGES[i].length; j += 2) + assignedRanges.add(new CharRange(Categories.CATEGORY_RANGES[i][j], + Categories.CATEGORY_RANGES[i][j + 1])); + return new Subtraction(new Union(new CharClass[] { base, new CharRange(NONBMP_MIN, NONBMP_MAX) }), + new Union(assignedRanges)); + } + if (name.equals("Pi")) + return makeCharClass(CATEGORY_Pi); + if (name.equals("Pf")) + return makeCharClass(CATEGORY_Pf); + return base; + } + List classes = new Vector(); + classes.add(base); + int[] addRanges = Categories.CATEGORY_RANGES[sci/2]; + for (int i = 0; i < addRanges.length; i += 2) + classes.add(new CharRange(addRanges[i], addRanges[i + 1])); + if (name.equals("Lu")) + classes.add(new SingleChar(UNICODE_3_1_ADD_Lu)); + else if (name.equals("Ll")) + classes.add(new SingleChar(UNICODE_3_1_ADD_Ll)); + else if (name.equals("Nl")) + classes.add(new CharRange(UNICODE_3_1_CHANGE_No_to_Nl_MIN, UNICODE_3_1_CHANGE_No_to_Nl_MAX)); + else if (name.equals("No")) + return new Subtraction(new Union(classes), + new CharRange(UNICODE_3_1_CHANGE_No_to_Nl_MIN, + UNICODE_3_1_CHANGE_No_to_Nl_MAX)); + return new Union(classes); + } + + private static CharClass makeCharClass(String members) { + List list = new Vector(); + for (int i = 0, len = members.length(); i < len; i++) + list.add(new SingleChar(members.charAt(i))); + return new Union(list); + } + + public static void main(String[] args) throws RegexSyntaxException { + String s = translate(args[0]); + for (int i = 0, len = s.length(); i < len; i++) { + char c = s.charAt(i); + if (c >= 0x20 && c <= 0x7e) + System.err.print(c); + else { + System.err.print("\\u"); + for (int shift = 12; shift >= 0; shift -= 4) + System.err.print("0123456789ABCDEF".charAt((c >> shift) & 0xF)); + } + } + System.err.println(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.java new file mode 100644 index 0000000..3daf661 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/CategoriesGen.java @@ -0,0 +1,161 @@ +package com.thaiopensource.datatype.xsd.regex.jdk1_4.gen; + +import java.io.File; +import java.io.OutputStream; +import java.io.FileOutputStream; +import java.io.Writer; +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; +import java.util.List; +import java.util.Vector; +import java.util.Iterator; +import java.util.Set; + +public class CategoriesGen { + static public void main(String[] args) throws IOException { + if (args.length != 3) { + System.err.println("usage: " + CategoriesGen.class.getName() + " className srcDir UnicodeData.txt"); + System.exit(2); + } + BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[2]))); + CategoriesGen g = new CategoriesGen(); + g.load(r); + String className = args[0]; + String srcDir = args[1]; + int lastDot = className.lastIndexOf('.'); + String pkg; + if (lastDot < 0) + pkg = null; + else { + pkg = className.substring(0, lastDot); + className = className.substring(lastDot + 1); + srcDir = srcDir + File.separator + pkg.replace('.', File.separatorChar); + } + String srcFile = srcDir + File.separator + className + ".java"; + OutputStream stm = new FileOutputStream(srcFile); + Writer w = new BufferedWriter(new OutputStreamWriter(stm)); + String lineSep = System.getProperty("line.separator"); + w.write("// This file was automatically generated by "); + w.write(CategoriesGen.class.getName()); + w.write(lineSep); + if (pkg != null) + w.write("package " + pkg + ";" + lineSep + lineSep); + w.write("class " + className + " {" + lineSep); + g.save(w, lineSep); + w.write("}" + lineSep); + w.close(); + } + + void load(BufferedReader r) throws IOException { + String lastCategory = null; + int lastCode = 0; + int firstCode = 0; + for (;;) { + String line = r.readLine(); + if (line == null) + break; + int semi = line.indexOf(';'); + if (semi != 5 && semi != 6) + continue; + int code = Integer.parseInt(line.substring(0, semi), 16); + int semi2 = line.indexOf(';', semi + 1); + String name = line.substring(semi, semi2); + String category = line.substring(semi2 + 1, semi2 + 3); + if (!category.equals(lastCategory) || + !(lastCode + 1 == code || name.endsWith(", Last>"))) { + if (lastCategory != null) + add(firstCode, lastCode, lastCategory); + lastCategory = category; + firstCode = code; + } + lastCode = code; + } + if (lastCategory != null) + add(firstCode, lastCode, lastCategory); + } + + private final Map map = new HashMap(); + + static class Range { + private final int lower; + private final int upper; + + public Range(int lower, int upper) { + this.lower = lower; + this.upper = upper; + } + } + + void add(int firstCode, int lastCode, String category) { + List list = (List)map.get(category); + if (list == null) { + list = new Vector(); + map.put(category, list); + } + list.add(new Range(firstCode, lastCode)); + } + + static private final String INDENT = " "; + + void save(Writer w, String lineSep) throws IOException { + Set set = map.entrySet(); + w.write(lineSep); + w.write(INDENT); + w.write("static final String CATEGORY_NAMES = \""); + for (Iterator iter = set.iterator(); iter.hasNext();) { + Map.Entry entry = (Map.Entry)iter.next(); + w.write((String)entry.getKey()); + } + w.write("\";"); + w.write(lineSep); + w.write(lineSep); + w.write(INDENT); + w.write("static final int[][] CATEGORY_RANGES = {"); + w.write(lineSep); + + for (Iterator iter = set.iterator(); iter.hasNext();) { + Map.Entry entry = (Map.Entry)iter.next(); + w.write(INDENT); + w.write(INDENT); + w.write('{'); + w.write(lineSep); + w.write(INDENT); + w.write(INDENT); + w.write(INDENT); + w.write("// "); + w.write((String)entry.getKey()); + w.write(lineSep); + List list = (List)entry.getValue(); + for (int i = 0, len = list.size(); i < len; i++) { + Range r = (Range)list.get(i); + w.write(INDENT); + w.write(INDENT); + w.write(INDENT); + w.write("0x"); + w.write(Integer.toHexString(r.lower)); + w.write(", "); + w.write("0x"); + w.write(Integer.toHexString(r.upper)); + if (i + 1 != len) + w.write(","); + w.write(lineSep); + } + w.write(INDENT); + w.write(INDENT); + w.write('}'); + if (iter.hasNext()) + w.write(','); + w.write(lineSep); + } + w.write(INDENT); + w.write("};"); + w.write(lineSep); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.java new file mode 100644 index 0000000..69b68d3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/gen/NamingExceptionsGen.java @@ -0,0 +1,152 @@ +package com.thaiopensource.datatype.xsd.regex.jdk1_4.gen; + +import com.thaiopensource.xml.util.Naming; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.List; +import java.util.Vector; + +public class NamingExceptionsGen { + static public void main(String[] args) throws IOException { + if (args.length != 2) { + System.err.println("Usage: " + NamingExceptionsGen.class.toString() + " className srcDir"); + System.exit(1); + } + String className = args[0]; + String srcDir = args[1]; + int lastDot = className.lastIndexOf('.'); + String pkg; + if (lastDot < 0) + pkg = null; + else { + pkg = className.substring(0, lastDot); + className = className.substring(lastDot + 1); + srcDir = srcDir + File.separator + pkg.replace('.', File.separatorChar); + } + String srcFile = srcDir + File.separator + className + ".java"; + OutputStream stm = new FileOutputStream(srcFile); + Writer w = new BufferedWriter(new OutputStreamWriter(stm)); + String lineSep = System.getProperty("line.separator"); + w.write("// This file was automatically generated by "); + w.write(NamingExceptionsGen.class.getName()); + w.write(lineSep); + if (pkg != null) + w.write("package " + pkg + ";" + lineSep + lineSep); + w.write("class " + className + " {" + lineSep); + gen(true, w, lineSep); + gen(false, w, lineSep); + w.write("}" + lineSep); + w.close(); + } + + static private void gen(boolean isStart, Writer w, String lineSep) throws IOException { + char[] buf = new char[1]; + boolean excluding = false; + char excludeMin = 0; + char excludeMax = 0; + List includeList = new Vector(); + List excludeRangeList = new Vector(); + for (int i = 0; i < 65536; i++) { + char ch = (char)i; + buf[0] = ch; + String s = new String(buf); + boolean isName = isStart ? Naming.isName(s) : Naming.isNmtoken(s); + if (isName && excluding) { + excludeRangeList.add(new Character(excludeMin)); + excludeRangeList.add(new Character(excludeMax)); + excluding = false; + } + if (isName != isApproxName(ch, isStart)) { + if (isName) + includeList.add(new Character(ch)); + else { + if (!excluding) { + excluding = true; + excludeMin = ch; + } + excludeMax = ch; + } + } + } + if (excluding) { + excludeRangeList.add(new Character(excludeMin)); + excludeRangeList.add(new Character(excludeMax)); + } + String prefix = isStart ? "NMSTRT" : "NMCHAR"; + genList(prefix + "_INCLUDES", includeList, w, lineSep); + genList(prefix + "_EXCLUDE_RANGES", excludeRangeList, w, lineSep); + w.write(INDENT); + w.write("static final String "); + w.write(prefix); + w.write("_CATEGORIES = \""); + w.write(isStart ? NMSTRT_CATEGORIES : NMCHAR_CATEGORIES); + w.write("\";"); + w.write(lineSep); + } + + static private final int CHARS_PER_LINE = 10; + static private final String INDENT = " "; + + static private void genList(String varName, List includeList, Writer w, String lineSep) throws IOException { + w.write(INDENT); + w.write("static final String "); + w.write(varName); + w.write(" ="); + w.write(lineSep); + w.write(INDENT); + w.write(INDENT); + w.write('"'); + for (int i = 0, len = includeList.size(); i < len; i++) { + w.write("\\u"); + w.write(hex(((Character)includeList.get(i)).charValue())); + if (i % CHARS_PER_LINE == CHARS_PER_LINE - 1 && i + 1 != len) { + w.write("\" +"); + w.write(lineSep); + w.write(INDENT); + w.write(INDENT); + w.write('"'); + } + } + w.write("\";"); + w.write(lineSep); + } + + static private final String HEX_DIGITS = "0123456789ABCDEF"; + + static String hex(char c) { + char[] buf = new char[4]; + buf[0] = HEX_DIGITS.charAt((c >> 12) & 0xF); + buf[1] = HEX_DIGITS.charAt((c >> 8) & 0xF); + buf[2] = HEX_DIGITS.charAt((c >> 4) & 0xF); + buf[3] = HEX_DIGITS.charAt(c & 0xF); + return new String(buf); + } + + static private final String NMSTRT_CATEGORIES = "LlLuLoLtNl"; + static private final String NMCHAR_CATEGORIES = NMSTRT_CATEGORIES + "McMeMnLmNd"; + + static private boolean isApproxName(char c, boolean isStart) { + switch (Character.getType(c)) { + case Character.LOWERCASE_LETTER: // Ll + case Character.UPPERCASE_LETTER: // Lu + case Character.OTHER_LETTER: // Lo + case Character.TITLECASE_LETTER: // Lt + case Character.LETTER_NUMBER: // Nl + return true; + case Character.COMBINING_SPACING_MARK: // Mc + case Character.ENCLOSING_MARK: // Me + case Character.NON_SPACING_MARK: // Mn + case Character.MODIFIER_LETTER: // Lm + case Character.DECIMAL_DIGIT_NUMBER: // Nd + return !isStart; + } + return false; + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/resources/Messages.properties new file mode 100644 index 0000000..817f31b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/jdk1_4/resources/Messages.properties @@ -0,0 +1,13 @@ +bad_block_name=unrecognized Unicode block name \"{0}\" +bad_category=unrecognized Unicode category \"{0}\" +bad_escape=illegal escape +bad_property_name=bad property name \"{0}\" +empty_property_name=property name must not be empty +expected=expected \"{0}\" +expected_digit=expected a digit +expected_eos=character is not allowed in this context +invalid_range=lower bound of range must not have Unicode code point greater than upper bound +invalid_surrogate=illegal surrogate pair +multi_range=bounds of range must be single characters +should_quote=character \"{0}\" must be escaped with \"\\\" in ths context +invalid_quantity_range=lower bound of quantifier must not be greater than upper bound diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/CategoryTest.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/CategoryTest.java new file mode 100644 index 0000000..1e4aafd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/CategoryTest.java @@ -0,0 +1,135 @@ +package com.thaiopensource.datatype.xsd.regex.test; + +import com.thaiopensource.datatype.xsd.regex.Regex; +import com.thaiopensource.datatype.xsd.regex.RegexEngine; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; +import com.thaiopensource.util.Utf16; +import com.thaiopensource.util.Service; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.Enumeration; + +public class CategoryTest { + static private final String categories = "LMNPZSC"; + static private final String subCategories = "LuLlLtLmLoMnMcMeNdNlNoPcPdPsPePiPfPoZsZlZpSmScSkSoCcCfCoCn"; + + private final Regex[] categoryPosRegexes = new Regex[categories.length()]; + private final Regex[] categoryNegRegexes = new Regex[categories.length()]; + private final Regex[] subCategoryPosRegexes = new Regex[subCategories.length()/2]; + private final Regex[] subCategoryNegRegexes = new Regex[subCategories.length()/2]; + + static public void main(String[] args) throws IOException, RegexSyntaxException { + if (args.length != 2) { + System.err.println("usage: " + CategoryTest.class.getName() + " engineClass UnicodeData"); + System.exit(2); + } + BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[1]))); + Enumeration e = new Service(RegexEngine.class).getProviders(); + RegexEngine engine; + for (;;) { + if (!e.hasMoreElements()) { + System.err.println("couldn't find regex engine"); + System.exit(2); + } + engine = (RegexEngine)e.nextElement(); + if (engine.getClass().getName().equals(args[0])) + break; + } + int nFail = new CategoryTest(engine).testAll(r); + System.err.println(nFail + " tests failed"); + System.exit(nFail > 0 ? 1 : 0); + } + + CategoryTest(RegexEngine engine) throws RegexSyntaxException { + for (int i = 0, len = categories.length(); i < len; i++) { + String ch = categories.substring(i, i + 1); + categoryPosRegexes[i] = engine.compile("\\p{" + ch + "}"); + categoryNegRegexes[i] = engine.compile("\\P{" + ch + "}"); + } + for (int i = 0, len = subCategories.length(); i < len; i += 2) { + String name = subCategories.substring(i, i + 2); + subCategoryPosRegexes[i/2] = engine.compile("\\p{" + name + "}"); + subCategoryNegRegexes[i/2] = engine.compile("\\P{" + name + "}"); + } + } + + int testAll(BufferedReader r) throws IOException { + int lastCode = -1; + for (;;) { + String line = r.readLine(); + if (line == null) + break; + int semi = line.indexOf(';'); + if (semi < 0) + continue; + int code = Integer.parseInt(line.substring(0, semi), 16); + int semi2 = line.indexOf(';', semi + 1); + String name = line.substring(semi, semi2); + String category = line.substring(semi2 + 1, semi2 + 3); + if (lastCode + 1 != code) { + String missingCategory = name.endsWith(", Last>") ? category : "Cn"; + for (int i = lastCode + 1; i < code; i++) + test(i, missingCategory); + } + test(code, category); + lastCode = code; + } + for (++lastCode; lastCode < 0x110000; lastCode++) + test(lastCode, "Cn"); + return nFail; + } + + void test(int ch, String category) { + if (!isXmlChar(ch)) + return; + if (subCategories.indexOf(category) < 0) { + System.err.println("Missing category: " + category); + System.exit(2); + } + for (int i = 0, len = categories.length(); i < len; i++) + check(ch, categoryPosRegexes[i], categoryNegRegexes[i], + category.charAt(0) == categories.charAt(i), + categories.substring(i, i + 1)); + for (int i = 0, len = subCategories.length(); i < len; i += 2) + check(ch, subCategoryPosRegexes[i/2], subCategoryNegRegexes[i/2], + category.equals(subCategories.substring(i, i + 2)), + subCategories.substring(i, i + 2)); + } + + void check(int ch, Regex pos, Regex neg, boolean inPos, String cat) { + String str; + if (ch > 0xFFFF) + str = new String(new char[]{ Utf16.surrogate1(ch), Utf16.surrogate2(ch) }); + else + str = new String(new char[]{ (char)ch }); + if (pos.matches(str) != inPos ) + fail(ch, cat); + if (neg.matches(str) != !inPos) + fail(ch, "-" + cat); + } + + int nFail = 0; + + void fail(int ch, String cat) { + nFail++; + System.err.println("Failed: " + Integer.toHexString(ch) + "/" + cat); + } + + static boolean isXmlChar(int code) { + switch (code) { + case '\r': case '\n': case '\t': + return true; + case 0xFFFE: case 0xFFFF: + return false; + default: + if (code < 0x20) + return false; + if (code >= 0xD800 && code < 0xE000) + return false; + return true; + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/TestDriver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/TestDriver.java new file mode 100644 index 0000000..ad403a1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/regex/test/TestDriver.java @@ -0,0 +1,165 @@ +package com.thaiopensource.datatype.xsd.regex.test; + +import com.thaiopensource.datatype.xsd.regex.Regex; +import com.thaiopensource.datatype.xsd.regex.RegexEngine; +import com.thaiopensource.datatype.xsd.regex.RegexSyntaxException; +import com.thaiopensource.util.Service; +import com.thaiopensource.util.UriOrFile; +import com.thaiopensource.util.Utf16; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.SAXParserFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.Enumeration; + +public class TestDriver extends DefaultHandler { + private final StringBuffer buf = new StringBuffer(); + private Regex regex; + private int nFail = 0; + private int nTests = 0; + private Locator loc; + private final RegexEngine engine; + + static public void main(String[] args) throws SAXException, IOException, ParserConfigurationException { + if (args.length != 2) { + System.err.println("usage: TestDriver class testfile"); + System.exit(2); + } + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setValidating(false); + XMLReader xr = factory.newSAXParser().getXMLReader(); + + Enumeration e = new Service(RegexEngine.class).getProviders(); + RegexEngine engine; + for (;;) { + if (!e.hasMoreElements()) { + System.err.println("couldn't find regex engine"); + System.exit(2); + } + engine = (RegexEngine)e.nextElement(); + if (engine.getClass().getName().equals(args[0])) + break; + } + TestDriver tester = new TestDriver(engine); + xr.setContentHandler(tester); + InputSource in = new InputSource(UriOrFile.fileToUri(args[1])); + xr.parse(in); + System.err.println(tester.nTests + " tests performed"); + System.err.println(tester.nFail + " failures"); + if (tester.nFail > 0) + System.exit(1); + } + + public TestDriver(RegexEngine engine) { + this.engine = engine; + } + + public void setDocumentLocator(Locator locator) { + this.loc = locator; + } + + public void characters(char ch[], int start, int length) + throws SAXException { + buf.append(ch, start, length); + } + + public void ignorableWhitespace(char ch[], int start, int length) + throws SAXException { + buf.append(ch, start, length); + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + buf.setLength(0); + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + if (localName.equals("valid")) + valid(buf.toString()); + else if (localName.equals("invalid")) + invalid(buf.toString()); + else if (localName.equals("correct")) + correct(buf.toString()); + else if (localName.equals("incorrect")) + incorrect(buf.toString()); + } + + private void correct(String str) { + nTests++; + regex = null; + try { + regex = engine.compile(str); + } + catch (RegexSyntaxException e) { + error("unexpected error: " + e.getMessage() + ": " + display(str, e.getPosition())); + } + } + + private void incorrect(String str) { + nTests++; + regex = null; + try { + engine.compile(str); + error("failed to detect error in regex: " + display(str, -1)); + } + catch (RegexSyntaxException e) { } + } + + private void valid(String str) { + if (regex == null) + return; + nTests++; + if (!regex.matches(str)) + error("match failed for string: " + display(str, -1)); + } + + private void invalid(String str) { + if (regex == null) + return; + nTests++; + if (regex.matches(str)) + error("match incorrectly succeeded for string: " + display(str, -1)); + } + + private void error(String str) { + int line = -1; + if (loc != null) + line = loc.getLineNumber(); + if (line >= 0) + System.err.print("Line " + line + ": "); + System.err.println(str); + nFail++; + } + + static final private String ERROR_MARKER = ">>>>"; + + static String display(String str, int pos) { + StringBuffer buf = new StringBuffer(); + for (int i = 0, len = str.length(); i < len; i++) { + if (i == pos) + buf.append(ERROR_MARKER); + char c = str.charAt(i); + if (Utf16.isSurrogate1(c)) + buf.append("&#x" + Integer.toHexString(Utf16.scalarValue(c, str.charAt(++i))) + ";"); + else if (c < ' ' || c >= 0x7F) + buf.append("&#x" + Integer.toHexString(c) + ";"); + else if (c == '&') + buf.append("&"); + else + buf.append(c); + } + if (str.length() == pos) + buf.append(ERROR_MARKER); + return buf.toString(); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/resources/Messages.properties new file mode 100644 index 0000000..716fdb0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/datatype/xsd/resources/Messages.properties @@ -0,0 +1,14 @@ +# Properties file specifying messages +enumeration_param=\"enumeration\" facet is not allowed as a parameter: use \"value\" element instead +whiteSpace_param=\"whiteSpace\" facet is not allowed as a parameter +unrecognized_param=unrecognized parameter \"{0}\" +invalid_regex=invalid regular expression: {0} +not_ordered=parameter can only be applied to ordered datatype +invalid_limit=\"{0}\" is not allowed by the base type +no_length=base datatype does not define a units of length +scale_not_derived_from_decimal=\"scale\" parameter can only be applied to datatype derived from \"decimal\" +value_not_non_negative_integer=\"value\" parameter must be non negative integer +precision_not_derived_from_decimal=\"precision\" parameter can only be applied to datatype derived from \"decimal\" +value_not_positive_integer=\"value\" parameter must be positive integer +regex_impl_not_found=cannot find regular expression implementation; use JDK 1.4 or add Xerces 1 or 2 to your classpath +regex_internal_error=internal error in regular expression for datatype {0} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/SchemaFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/SchemaFactory.java new file mode 100644 index 0000000..991c614 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/SchemaFactory.java @@ -0,0 +1,210 @@ +package com.thaiopensource.relaxng; + +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.Flag; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.RngProperty; +import org.relaxng.datatype.DatatypeLibraryFactory; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/** + * A factory for RELAX NG schemas. The factory creates Schema objects from their + * XML representation. + * + * A single SchemaFactory is not safe for concurrent + * access by multiple threads; it must be accessed by at most one thread at a time. + * Schemas can be created concurrently by using a distinct SchemaFactory for each + * thread. However, the Schema objects created are safe for concurrent + * access by multiple threads. + * + * @author James Clark + */ +public class SchemaFactory { + private PropertyMapBuilder properties = new PropertyMapBuilder(); + private boolean compactSyntax = false; + private SchemaReader autoSchemaLanguage = new AutoSchemaReader(); + + /** + * Constructs a schema factory. + */ + public SchemaFactory() { + } + + /** + * Creates a schema by parsing an XML document. A non-null XMLReaderCreator must be specified + * with setXMLReaderCreator before calling createSchema. The ErrorHandler + * is allowed to be null. The DatatypeLibraryFactory is allowed to be null. + * + *

Normally, if a schema cannot be created, createSchema will throw + * a IncorrectSchemaException; however, + * before doing so, one or more errors will be reported using the ErrorHandler if it is non-null. If the + * ErrorHandler throws a SAXException, then createSchema will pass this + * through rather than throwing a IncorrectSchemaException. Similarly, if XMLReader.parse + * throws a SAXException or IOException, then createSchema will pass + * this through rather than throwing a IncorrectSchemaException. Thus, if an error handler + * is specified that reports errors to the user, there is no need to report any additional message to the + * user if createSchema throws IncorrectSchemaException. + * + * @param in the InputSource containing the XML document to be parsed; + * must not be null + * @return the Schema constructed from the XML document; + * never null. + * + * @throws IOException if an I/O error occurs + * @throws SAXException if there is an XML parsing error and the XMLReader or ErrorHandler + * throws a SAXException + * @throws com.thaiopensource.validate.IncorrectSchemaException if the XML document was not a correct RELAX NG schema + * @throws NullPointerException if the current XMLReaderCreator is null + */ + public Schema createSchema(InputSource in) throws IOException, SAXException, IncorrectSchemaException { + SchemaReader r = compactSyntax ? CompactSchemaReader.getInstance() : autoSchemaLanguage; + return r.createSchema(in, properties.toPropertyMap()); + } + + /** + * Specifies the XMLReaderCreator to be used for creating XMLReaders for parsing + * the XML document. Because of include and externalRef elements, + * parsing a single RELAX NG may require the creation of multiple more than one XMLReader. + * A non-null XMLReaderCreator must be specified before calling createSchema. + * + * @param xrc the XMLReaderCreator to be used for parsing the XML document containing + * the schema; may be null + * @see #getXMLReaderCreator + */ + public void setXMLReaderCreator(XMLReaderCreator xrc) { + properties.put(ValidateProperty.XML_READER_CREATOR, xrc); + } + + /** + * Returns the current XMLReaderCreator as specified by setXMLReaderCreator. + * If XMLReaderCreator has never been called, then getXMLReaderCreator + * returns null. + * + * @return the XMLReaderCreator that will be used for parsing the XML document containing + * the schema; may be null + * + * @see #setXMLReaderCreator + */ + public XMLReaderCreator getXMLReaderCreator() { + return (XMLReaderCreator)properties.get(ValidateProperty.XML_READER_CREATOR); + } + + /** + * Specifies the ErrorHandler to be used for reporting errors while creating the schema. + * This does not affect the error handler used for validation. + * + * @param eh the ErrorHandler to be used for reporting errors while creating the schema; + * may be null. + * @see #getErrorHandler + */ + public void setErrorHandler(ErrorHandler eh) { + properties.put(ValidateProperty.ERROR_HANDLER, eh); + } + + /** + * Returns the ErrorHandler that will be used for reporting errors while creating the + * schema. If setErrorHandler has not been called for this SchemaFactory, + * then getErrorHandler returns null. + * + * @return the ErrorHandler to be used for reporting errors while creating the schema; + * may be null. + * @see #setErrorHandler + */ + public ErrorHandler getErrorHandler() { + return (ErrorHandler)properties.get(ValidateProperty.ERROR_HANDLER); + } + + /** + * Specifies the DatatypeLibraryFactory to be used for handling datatypes in the schema. + * This also determines how datatypes are handled during validation. If null is + * specified then only the builtin datatypes will be supported. + * + * @param dlf the DatatypeLibraryFactory to be used for handling datatypes in the schema + * @see #getDatatypeLibraryFactory + */ + public void setDatatypeLibraryFactory(DatatypeLibraryFactory dlf) { + properties.put(RngProperty.DATATYPE_LIBRARY_FACTORY, dlf); + } + + /** + * Returns the DatatypeLibraryFactory that will be used for handling datatypes in the + * schema. If setDatatypeLibraryFactory has not been called for this SchemaFactory, + * then getDatatypeLibraryFactory returns null. + * + * @return the DatatypeLibraryFactory to be used for handling datatypes in the schema; + * may be null. + * @see #setDatatypeLibraryFactory + */ + public DatatypeLibraryFactory getDatatypeLibraryFactory() { + return (DatatypeLibraryFactory)properties.get(RngProperty.DATATYPE_LIBRARY_FACTORY); + } + + /** + * Specifies whether to perform checking of ID/IDREF/IDREFS attributes in accordance with + * RELAX NG DTD Compatibility. + * + * @param checkIdIdref true if ID/IDREF/IDREFS checking should be performed; + * false otherwise + * + * @see #getCheckIdIdref + * @see RELAX NG DTD Compatibility + */ + public void setCheckIdIdref(boolean checkIdIdref) { + properties.put(RngProperty.CHECK_ID_IDREF, checkIdIdref ? Flag.PRESENT : null); + } + + /** + * Indicates whether ID/IDREF/IDREFS attributes will be checked in accordance RELAX NG DTD + * Compatibility. If setCheckIdIdref has not been called for this SchemaFactory, + * then getCheckIdref will return false. + * + * @return true if ID/IDREF/IDREFS attributes will be checked; + * false otherwise. + * + * @see #setCheckIdIdref + * @see RELAX NG DTD Compatibility + */ + public boolean getCheckIdIdref() { + return properties.contains(RngProperty.CHECK_ID_IDREF); + } + + /** + * Specifies whether to use the compact syntax to parse the RELAX NG schema rather than the normal XML syntax. + * + * @param compactSyntax true if the compact syntax should be used; false + * if the XML syntax should be used + * @see #getCompactSyntax + */ + public void setCompactSyntax(boolean compactSyntax) { + this.compactSyntax = compactSyntax; + } + + /** + * Indicates whether the compact syntax will be used to parse the RELAX NG schema rather than + * the normal XML syntax. + * + * @return true if the compact syntax will be used; false if the XML + * syntax will be used + */ + public boolean getCompactSyntax() { + return compactSyntax; + } + + public void setFeasible(boolean feasible) { + properties.put(RngProperty.FEASIBLE, feasible ? Flag.PRESENT : null); + } + + public boolean getFeasible() { + return properties.contains(RngProperty.FEASIBLE); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AbstractPatternFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AbstractPatternFunction.java new file mode 100644 index 0000000..3b11847 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AbstractPatternFunction.java @@ -0,0 +1,69 @@ +package com.thaiopensource.relaxng.impl; + +abstract class AbstractPatternFunction implements PatternFunction { + public Object caseEmpty(EmptyPattern p) { + return caseOther(p); + } + + public Object caseNotAllowed(NotAllowedPattern p) { + return caseOther(p); + } + + public Object caseError(ErrorPattern p) { + return caseOther(p); + } + + public Object caseGroup(GroupPattern p) { + return caseOther(p); + } + + public Object caseInterleave(InterleavePattern p) { + return caseOther(p); + } + + public Object caseChoice(ChoicePattern p) { + return caseOther(p); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + return caseOther(p); + } + + public Object caseElement(ElementPattern p) { + return caseOther(p); + } + + public Object caseAttribute(AttributePattern p) { + return caseOther(p); + } + + public Object caseData(DataPattern p) { + return caseOther(p); + } + + public Object caseDataExcept(DataExceptPattern p) { + return caseOther(p); + } + + public Object caseValue(ValuePattern p) { + return caseOther(p); + } + + public Object caseText(TextPattern p) { + return caseOther(p); + } + + public Object caseList(ListPattern p) { + return caseOther(p); + } + + public Object caseAfter(AfterPattern p) { + return caseOther(p); + } + + public Object caseRef(RefPattern p) { + return caseOther(p); + } + + public abstract Object caseOther(Pattern p); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AfterPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AfterPattern.java new file mode 100644 index 0000000..eb4ef2c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AfterPattern.java @@ -0,0 +1,22 @@ +package com.thaiopensource.relaxng.impl; + + +class AfterPattern extends BinaryPattern { + AfterPattern(Pattern p1, Pattern p2) { + super(false, + combineHashCode(AFTER_HASH_CODE, p1.hashCode(), p2.hashCode()), + p1, + p2); + } + + boolean isNotAllowed() { + return p1.isNotAllowed(); + } + + Object apply(PatternFunction f) { + return f.caseAfter(this); + } + void accept(PatternVisitor visitor) { + // XXX visitor.visitAfter(p1, p2); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Alphabet.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Alphabet.java new file mode 100644 index 0000000..ffd728a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Alphabet.java @@ -0,0 +1,27 @@ +package com.thaiopensource.relaxng.impl; + +class Alphabet { + private NameClass nameClass; + + boolean isEmpty() { + return nameClass == null; + } + + void addElement(NameClass nc) { + if (nameClass == null) + nameClass = nc; + else if (nc != null) + nameClass = new ChoiceNameClass(nameClass, nc); + } + + void addAlphabet(Alphabet a) { + addElement(a.nameClass); + } + + void checkOverlap(Alphabet a) throws RestrictionViolationException { + if (nameClass != null + && a.nameClass != null + && OverlapDetector.overlap(nameClass, a.nameClass)) + throw new RestrictionViolationException("interleave_element_overlap"); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameClass.java new file mode 100644 index 0000000..b2c3a9a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameClass.java @@ -0,0 +1,30 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class AnyNameClass implements NameClass { + + public boolean contains(Name name) { + return true; + } + + public int containsSpecificity(Name name) { + return SPECIFICITY_ANY_NAME; + } + + public boolean equals(Object obj) { + return obj != null && obj instanceof AnyNameClass; + } + + public int hashCode() { + return AnyNameClass.class.hashCode(); + } + + public void accept(NameClassVisitor visitor) { + visitor.visitAnyName(); + } + + public boolean isOpen() { + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.java new file mode 100644 index 0000000..c64897d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AnyNameExceptNameClass.java @@ -0,0 +1,38 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class AnyNameExceptNameClass implements NameClass { + + private final NameClass nameClass; + + AnyNameExceptNameClass(NameClass nameClass) { + this.nameClass = nameClass; + } + + public boolean contains(Name name) { + return !nameClass.contains(name); + } + + public int containsSpecificity(Name name) { + return contains(name) ? SPECIFICITY_ANY_NAME : SPECIFICITY_NONE; + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof AnyNameExceptNameClass)) + return false; + return nameClass.equals(((AnyNameExceptNameClass)obj).nameClass); + } + + public int hashCode() { + return ~nameClass.hashCode(); + } + + public void accept(NameClassVisitor visitor) { + visitor.visitAnyNameExcept(nameClass); + } + + public boolean isOpen() { + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ApplyAfterFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ApplyAfterFunction.java new file mode 100644 index 0000000..605207f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ApplyAfterFunction.java @@ -0,0 +1,28 @@ +package com.thaiopensource.relaxng.impl; + +abstract class ApplyAfterFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + + ApplyAfterFunction(ValidatorPatternBuilder builder) { + this.builder = builder; + } + + public Object caseAfter(AfterPattern p) { + return builder.makeAfter(p.getOperand1(), apply(p.getOperand2())); + } + + public Object caseChoice(ChoicePattern p) { + return builder.makeChoice(p.getOperand1().applyForPattern(this), + p.getOperand2().applyForPattern(this)); + } + + public Object caseNotAllowed(NotAllowedPattern p) { + return p; + } + + public Object caseOther(Pattern p) { + throw new RuntimeException("apply after botch"); + } + + abstract Pattern apply(Pattern p); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.java new file mode 100644 index 0000000..d0f6ec8 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributeNameClassChecker.java @@ -0,0 +1,45 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.WellKnownNamespaces; +import com.thaiopensource.xml.util.Name; + +class AttributeNameClassChecker implements NameClassVisitor { + private String errorMessageId = null; + + public void visitChoice(NameClass nc1, NameClass nc2) { + nc1.accept(this); + nc2.accept(this); + } + + public void visitNsName(String ns) { + if (ns.equals(WellKnownNamespaces.XMLNS)) + errorMessageId = "xmlns_uri_attribute"; + } + + public void visitNsNameExcept(String ns, NameClass nc) { + visitNsName(ns); + nc.accept(this); + } + + public void visitAnyName() { } + + public void visitAnyNameExcept(NameClass nc) { + nc.accept(this); + } + + public void visitName(Name name) { + visitNsName(name.getNamespaceUri()); + if (name.equals(new Name("", "xmlns"))) + errorMessageId = "xmlns_attribute"; + } + + public void visitNull() { } + + public void visitError() { } + + String checkNameClass(NameClass nc) { + errorMessageId = null; + nc.accept(this); + return errorMessageId; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributePattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributePattern.java new file mode 100644 index 0000000..a0bb719 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/AttributePattern.java @@ -0,0 +1,95 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +class AttributePattern extends Pattern { + private final NameClass nameClass; + private final Pattern p; + private final Locator loc; + + AttributePattern(NameClass nameClass, Pattern value, Locator loc) { + super(false, + EMPTY_CONTENT_TYPE, + combineHashCode(ATTRIBUTE_HASH_CODE, + nameClass.hashCode(), + value.hashCode())); + this.nameClass = nameClass; + this.p = value; + this.loc = loc; + } + + Pattern expand(SchemaPatternBuilder b) { + Pattern ep = p.expand(b); + if (ep != p) + return b.makeAttribute(nameClass, ep, loc); + else + return this; + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_attribute"); + case ELEMENT_CONTEXT: + if (nameClass.isOpen()) + throw new RestrictionViolationException("open_name_class_not_repeated"); + break; + case ELEMENT_REPEAT_GROUP_CONTEXT: + throw new RestrictionViolationException("one_or_more_contains_group_contains_attribute"); + case ELEMENT_REPEAT_INTERLEAVE_CONTEXT: + throw new RestrictionViolationException("one_or_more_contains_interleave_contains_attribute"); + case LIST_CONTEXT: + throw new RestrictionViolationException("list_contains_attribute"); + case ATTRIBUTE_CONTEXT: + throw new RestrictionViolationException("attribute_contains_attribute"); + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_attribute"); + } + if (!dad.addAttribute(nameClass)) { + if (nameClass instanceof SimpleNameClass) + throw new RestrictionViolationException("duplicate_attribute_detail", ((SimpleNameClass)nameClass).getName()); + else + throw new RestrictionViolationException("duplicate_attribute"); + } + try { + p.checkRestrictions(ATTRIBUTE_CONTEXT, null, null); + } + catch (RestrictionViolationException e) { + e.maybeSetLocator(loc); + throw e; + } + } + + boolean samePattern(Pattern other) { + if (!(other instanceof AttributePattern)) + return false; + AttributePattern ap = (AttributePattern)other; + return nameClass.equals(ap.nameClass)&& p == ap.p; + } + + void checkRecursion(int depth) throws SAXException { + p.checkRecursion(depth); + } + + void accept(PatternVisitor visitor) { + visitor.visitAttribute(nameClass, p); + } + + Object apply(PatternFunction f) { + return f.caseAttribute(this); + } + + Pattern getContent() { + return p; + } + + NameClass getNameClass() { + return nameClass; + } + + Locator getLocator() { + return loc; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BinaryPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BinaryPattern.java new file mode 100644 index 0000000..3caea04 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BinaryPattern.java @@ -0,0 +1,40 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.SAXException; + +abstract class BinaryPattern extends Pattern { + final Pattern p1; + final Pattern p2; + + BinaryPattern(boolean nullable, int hc, Pattern p1, Pattern p2) { + super(nullable, Math.max(p1.getContentType(), p2.getContentType()), hc); + this.p1 = p1; + this.p2 = p2; + } + + void checkRecursion(int depth) throws SAXException { + p1.checkRecursion(depth); + p2.checkRecursion(depth); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + p1.checkRestrictions(context, dad, alpha); + p2.checkRestrictions(context, dad, alpha); + } + + boolean samePattern(Pattern other) { + if (getClass() != other.getClass()) + return false; + BinaryPattern b = (BinaryPattern)other; + return p1 == b.p1 && p2 == b.p2; + } + + Pattern getOperand1() { + return p1; + } + + Pattern getOperand2() { + return p2; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BlankDataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BlankDataDerivType.java new file mode 100644 index 0000000..36fe7c9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BlankDataDerivType.java @@ -0,0 +1,33 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.ValidationContext; + +class BlankDataDerivType extends DataDerivType { + private PatternMemo blankMemo; + private PatternMemo nonBlankMemo; + + BlankDataDerivType() { } + + PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) { + if (DataDerivFunction.isBlank(str)) { + if (blankMemo == null) + blankMemo = super.dataDeriv(builder, p, str, vc); + return blankMemo; + } + else { + if (nonBlankMemo == null) + nonBlankMemo = super.dataDeriv(builder, p, str, vc); + return nonBlankMemo; + } + } + + DataDerivType copy() { + return new BlankDataDerivType(); + } + + DataDerivType combine(DataDerivType ddt) { + if (ddt instanceof BlankDataDerivType || ddt instanceof SingleDataDerivType) + return this; + return InconsistentDataDerivType.getInstance(); + } +} \ No newline at end of file diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.java new file mode 100644 index 0000000..f4f1386 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeBuilder.java @@ -0,0 +1,24 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeBuilder; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.ValidationContext; + +class BuiltinDatatypeBuilder implements DatatypeBuilder { + private final Datatype dt; + + BuiltinDatatypeBuilder(Datatype dt) { + this.dt = dt; + } + + public void addParameter(String name, + String value, + ValidationContext context) throws DatatypeException { + throw new DatatypeException(SchemaBuilderImpl.localizer.message("builtin_param")); + } + + public Datatype createDatatype() { + return dt; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.java new file mode 100644 index 0000000..020ed42 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibrary.java @@ -0,0 +1,24 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeBuilder; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.DatatypeLibrary; + +public class BuiltinDatatypeLibrary implements DatatypeLibrary { + private final DatatypeBuilder tokenDatatypeBuilder + = new BuiltinDatatypeBuilder(new TokenDatatype()); + private final DatatypeBuilder stringDatatypeBuilder + = new BuiltinDatatypeBuilder(new StringDatatype()); + public DatatypeBuilder createDatatypeBuilder(String type) + throws DatatypeException { + if (type.equals("token")) + return tokenDatatypeBuilder; + else if (type.equals("string")) + return stringDatatypeBuilder; + throw new DatatypeException(); + } + public Datatype createDatatype(String type) throws DatatypeException { + return createDatatypeBuilder(type).createDatatype(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibraryFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibraryFactory.java new file mode 100644 index 0000000..0b0891c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/BuiltinDatatypeLibraryFactory.java @@ -0,0 +1,41 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.DatatypeLibrary; +import org.relaxng.datatype.DatatypeLibraryFactory; + +import java.util.Hashtable; + +import com.thaiopensource.xml.util.WellKnownNamespaces; + +class BuiltinDatatypeLibraryFactory implements DatatypeLibraryFactory { + private final Hashtable cache = new Hashtable(); + private final DatatypeLibraryFactory factory; + private final DatatypeLibrary builtinDatatypeLibrary + = new BuiltinDatatypeLibrary(); + private DatatypeLibrary lastDatatypeLibrary = null; + private String lastDatatypeLibraryUri = null; + + BuiltinDatatypeLibraryFactory(DatatypeLibraryFactory factory) { + this.factory = factory; + cache.put(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_DATATYPES, + new CompatibilityDatatypeLibrary(this)); + } + + public DatatypeLibrary createDatatypeLibrary(String uri) { + if (uri.equals("")) + return builtinDatatypeLibrary; + if (uri.equals(lastDatatypeLibraryUri)) + return lastDatatypeLibrary; + DatatypeLibrary library = (DatatypeLibrary)cache.get(uri); + if (library == null) { + if (factory == null) + return null; + library = factory.createDatatypeLibrary(uri); + if (library == null) + return null; + cache.put(uri, library); + } + lastDatatypeLibraryUri = uri; + return lastDatatypeLibrary = library; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoiceNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoiceNameClass.java new file mode 100644 index 0000000..3c1576b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoiceNameClass.java @@ -0,0 +1,44 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class ChoiceNameClass implements NameClass { + + private final NameClass nameClass1; + private final NameClass nameClass2; + + ChoiceNameClass(NameClass nameClass1, NameClass nameClass2) { + this.nameClass1 = nameClass1; + this.nameClass2 = nameClass2; + } + + public boolean contains(Name name) { + return (nameClass1.contains(name) + || nameClass2.contains(name)); + } + + public int containsSpecificity(Name name) { + return Math.max(nameClass1.containsSpecificity(name), + nameClass2.containsSpecificity(name)); + } + + public int hashCode() { + return nameClass1.hashCode() ^ nameClass2.hashCode(); + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof ChoiceNameClass)) + return false; + ChoiceNameClass other = (ChoiceNameClass)obj; + return (nameClass1.equals(other.nameClass1) + && nameClass2.equals(other.nameClass2)); + } + + public void accept(NameClassVisitor visitor) { + visitor.visitChoice(nameClass1, nameClass2); + } + + public boolean isOpen() { + return nameClass1.isOpen() || nameClass2.isOpen(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoicePattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoicePattern.java new file mode 100644 index 0000000..570ff60 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ChoicePattern.java @@ -0,0 +1,44 @@ +package com.thaiopensource.relaxng.impl; + +class ChoicePattern extends BinaryPattern { + ChoicePattern(Pattern p1, Pattern p2) { + super(p1.isNullable() || p2.isNullable(), + combineHashCode(CHOICE_HASH_CODE, p1.hashCode(), p2.hashCode()), + p1, + p2); + } + Pattern expand(SchemaPatternBuilder b) { + Pattern ep1 = p1.expand(b); + Pattern ep2 = p2.expand(b); + if (ep1 != p1 || ep2 != p2) + return b.makeChoice(ep1, ep2); + else + return this; + } + + boolean containsChoice(Pattern p) { + return p1.containsChoice(p) || p2.containsChoice(p); + } + + void accept(PatternVisitor visitor) { + visitor.visitChoice(p1, p2); + } + + Object apply(PatternFunction f) { + return f.caseChoice(this); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + if (dad != null) + dad.startChoice(); + p1.checkRestrictions(context, dad, alpha); + if (dad != null) + dad.alternative(); + p2.checkRestrictions(context, dad, alpha); + if (dad != null) + dad.endChoice(); + } + +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineSchema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineSchema.java new file mode 100644 index 0000000..978424a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineSchema.java @@ -0,0 +1,22 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.Validator; + +public class CombineSchema extends AbstractSchema { + private final Schema schema1; + private final Schema schema2; + + public CombineSchema(Schema schema1, Schema schema2, PropertyMap properties) { + super(properties); + this.schema1 = schema1; + this.schema2 = schema2; + } + + public Validator createValidator(PropertyMap properties) { + return new CombineValidator(schema1.createValidator(properties), + schema2.createValidator(properties)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineValidator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineValidator.java new file mode 100644 index 0000000..d0751b8 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CombineValidator.java @@ -0,0 +1,49 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.xml.sax.ForkContentHandler; +import com.thaiopensource.xml.sax.ForkDTDHandler; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; + +public class CombineValidator implements Validator { + private final Validator v1; + private final Validator v2; + private ContentHandler contentHandler; + private DTDHandler dtdHandler; + + public CombineValidator(Validator v1, Validator v2) { + this.v1 = v1; + this.v2 = v2; + createHandlers(); + } + + public void reset() { + v1.reset(); + v2.reset(); + createHandlers(); + } + + public ContentHandler getContentHandler() { + return contentHandler; + } + + public DTDHandler getDTDHandler() { + return dtdHandler; + } + + private void createHandlers() { + contentHandler = new ForkContentHandler(v1.getContentHandler(), + v2.getContentHandler()); + DTDHandler d1 = v1.getDTDHandler(); + DTDHandler d2 = v2.getDTDHandler(); + if (d1 != null && d2 != null) + dtdHandler = new ForkDTDHandler(d1, d2); + else if (d1 != null) + dtdHandler = d1; + else if (d2 != null) + dtdHandler = d2; + else + dtdHandler = null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.java new file mode 100644 index 0000000..eb44294 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/CompatibilityDatatypeLibrary.java @@ -0,0 +1,34 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeBuilder; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.DatatypeLibrary; +import org.relaxng.datatype.DatatypeLibraryFactory; +import com.thaiopensource.xml.util.WellKnownNamespaces; + +class CompatibilityDatatypeLibrary implements DatatypeLibrary { + private final DatatypeLibraryFactory factory; + private DatatypeLibrary xsdDatatypeLibrary = null; + + CompatibilityDatatypeLibrary(DatatypeLibraryFactory factory) { + this.factory = factory; + } + + public DatatypeBuilder createDatatypeBuilder(String type) + throws DatatypeException { + if (type.equals("ID") || type.equals("IDREF") || type.equals("IDREFS")) { + if (xsdDatatypeLibrary == null) { + xsdDatatypeLibrary = factory.createDatatypeLibrary(WellKnownNamespaces.XML_SCHEMA_DATATYPES); + if (xsdDatatypeLibrary == null) + throw new DatatypeException(); + } + return xsdDatatypeLibrary.createDatatypeBuilder(type); + } + throw new DatatypeException(); + } + + public Datatype createDatatype(String type) throws DatatypeException { + return createDatatypeBuilder(type).createDatatype(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDataDerivType.java new file mode 100644 index 0000000..a010e96 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDataDerivType.java @@ -0,0 +1,45 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.ValidationContext; + +class DataDataDerivType extends DataDerivType { + private final Datatype dt; + private PatternMemo validMemo; + private PatternMemo invalidMemo; + + DataDataDerivType(Datatype dt) { + this.dt = dt; + } + + PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) { + if (dt.isValid(str, vc)) { + if (validMemo == null) + validMemo = super.dataDeriv(builder, p, str, vc); + return validMemo; + } + else { + if (invalidMemo == null) + invalidMemo = super.dataDeriv(builder, p, str, vc); + return invalidMemo; + } + } + + DataDerivType copy() { + return new DataDataDerivType(dt); + } + + DataDerivType combine(DataDerivType ddt) { + if (ddt instanceof DataDataDerivType) { + if (((DataDataDerivType)ddt).dt == dt) + return this; + return InconsistentDataDerivType.getInstance(); + } + if (ddt instanceof ValueDataDerivType) { + if (((ValueDataDerivType)ddt).getDatatype() == dt) + return ddt; + return InconsistentDataDerivType.getInstance(); + } + return ddt.combine(this); + } +} \ No newline at end of file diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivFunction.java new file mode 100644 index 0000000..eb9c541 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivFunction.java @@ -0,0 +1,135 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.ValidationContext; + +class DataDerivFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + private final ValidationContext vc; + private final String str; + + DataDerivFunction(String str, ValidationContext vc, ValidatorPatternBuilder builder) { + this.str = str; + this.vc = vc; + this.builder = builder; + } + + static boolean isBlank(String str) { + int len = str.length(); + for (int i = 0; i < len; i++) { + switch (str.charAt(i)) { + case '\r': + case '\n': + case ' ': + case '\t': + break; + default: + return false; + } + } + return true; + } + + public Object caseText(TextPattern p) { + return p; + } + + public Object caseList(ListPattern p) { + int len = str.length(); + int tokenStart = -1; + PatternMemo memo = builder.getPatternMemo(p.getOperand()); + for (int i = 0; i < len; i++) { + switch (str.charAt(i)) { + case '\r': + case '\n': + case ' ': + case '\t': + if (tokenStart >= 0) { + memo = tokenDeriv(memo, tokenStart, i); + tokenStart = -1; + } + break; + default: + if (tokenStart < 0) + tokenStart = i; + break; + } + } + if (tokenStart >= 0) + memo = tokenDeriv(memo, tokenStart, len); + if (memo.getPattern().isNullable()) + return builder.makeEmpty(); + else + return builder.makeNotAllowed(); + } + + private PatternMemo tokenDeriv(PatternMemo p, int i, int j) { + return p.dataDeriv(str.substring(i, j), vc); + } + + public Object caseValue(ValuePattern p) { + Datatype dt = p.getDatatype(); + Object value = dt.createValue(str, vc); + if (value != null && dt.sameValue(p.getValue(), value)) + return builder.makeEmpty(); + else + return builder.makeNotAllowed(); + } + + public Object caseData(DataPattern p) { + if (p.allowsAnyString()) + return builder.makeEmpty(); + if (p.getDatatype().isValid(str, vc)) + return builder.makeEmpty(); + else + return builder.makeNotAllowed(); + } + + public Object caseDataExcept(DataExceptPattern p) { + Pattern tem = (Pattern)caseData(p); + if (tem.isNullable() && memoApply(p.getExcept()).isNullable()) + return builder.makeNotAllowed(); + return tem; + } + + public Object caseAfter(AfterPattern p) { + Pattern p1 = p.getOperand1(); + if (memoApply(p1).isNullable() || (p1.isNullable() && isBlank(str))) + return p.getOperand2(); + return builder.makeNotAllowed(); + } + + public Object caseChoice(ChoicePattern p) { + return builder.makeChoice(memoApply(p.getOperand1()), + memoApply(p.getOperand2())); + } + + public Object caseGroup(GroupPattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + Pattern tem = builder.makeGroup(memoApply(p1), p2); + if (!p1.isNullable()) + return tem; + return builder.makeChoice(tem, memoApply(p2)); + } + + public Object caseInterleave(InterleavePattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + return builder.makeChoice(builder.makeInterleave(memoApply(p1), p2), + builder.makeInterleave(p1, memoApply(p2))); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + return builder.makeGroup(memoApply(p.getOperand()), + builder.makeOptional(p)); + } + + public Object caseOther(Pattern p) { + return builder.makeNotAllowed(); + } + + private Pattern memoApply(Pattern p) { + return builder.getPatternMemo(p).dataDeriv(str, vc).getPattern(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivType.java new file mode 100644 index 0000000..573f86b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivType.java @@ -0,0 +1,11 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.ValidationContext; + +abstract class DataDerivType { + abstract DataDerivType copy(); + abstract DataDerivType combine(DataDerivType ddt); + PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) { + return builder.getPatternMemo(p.applyForPattern(new DataDerivFunction(str, vc, builder))); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.java new file mode 100644 index 0000000..5597088 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataDerivTypeFunction.java @@ -0,0 +1,69 @@ +package com.thaiopensource.relaxng.impl; + +class DataDerivTypeFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + + DataDerivTypeFunction(ValidatorPatternBuilder builder) { + this.builder = builder; + } + + static DataDerivType dataDerivType(ValidatorPatternBuilder builder, Pattern pattern) { + return (DataDerivType)pattern.apply(builder.getDataDerivTypeFunction()); + } + + public Object caseOther(Pattern p) { + return new SingleDataDerivType(); + } + + public Object caseAfter(AfterPattern p) { + Pattern p1 = p.getOperand1(); + DataDerivType ddt = apply(p.getOperand1()); + if (!p1.isNullable()) + return ddt; + return ddt.combine(new BlankDataDerivType()); + } + + private Object caseBinary(BinaryPattern p) { + return apply(p.getOperand1()).combine(apply(p.getOperand2())); + } + + public Object caseChoice(ChoicePattern p) { + return caseBinary(p); + } + + public Object caseGroup(GroupPattern p) { + return caseBinary(p); + } + + public Object caseInterleave(InterleavePattern p) { + return caseBinary(p); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + return apply(p.getOperand()); + } + + public Object caseList(ListPattern p) { + return InconsistentDataDerivType.getInstance(); + } + + public Object caseValue(ValuePattern p) { + return new ValueDataDerivType(p.getDatatype()); + } + + public Object caseData(DataPattern p) { + if (p.allowsAnyString()) + return new SingleDataDerivType(); + return new DataDataDerivType(p.getDatatype()); + } + + public Object caseDataExcept(DataExceptPattern p) { + if (p.allowsAnyString()) + return apply(p.getExcept()); + return new DataDataDerivType(p.getDatatype()).combine(apply(p.getExcept())); + } + + private DataDerivType apply(Pattern p) { + return builder.getPatternMemo(p).dataDerivType(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataExceptPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataExceptPattern.java new file mode 100644 index 0000000..942278a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataExceptPattern.java @@ -0,0 +1,45 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.xml.sax.Locator; + +class DataExceptPattern extends DataPattern { + private final Pattern except; + private final Locator loc; + + DataExceptPattern(Datatype dt, Pattern except, Locator loc) { + super(dt); + this.except = except; + this.loc = loc; + } + + boolean samePattern(Pattern other) { + if (!super.samePattern(other)) + return false; + return except.samePattern(((DataExceptPattern)other).except); + } + + void accept(PatternVisitor visitor) { + visitor.visitDataExcept(getDatatype(), except); + } + + Object apply(PatternFunction f) { + return f.caseDataExcept(this); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + super.checkRestrictions(context, dad, alpha); + try { + except.checkRestrictions(DATA_EXCEPT_CONTEXT, null, null); + } + catch (RestrictionViolationException e) { + e.maybeSetLocator(loc); + throw e; + } + } + + Pattern getExcept() { + return except; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataPattern.java new file mode 100644 index 0000000..c43aef9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DataPattern.java @@ -0,0 +1,43 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.datatype.Datatype2; +import org.relaxng.datatype.Datatype; + +class DataPattern extends StringPattern { + private final Datatype dt; + + DataPattern(Datatype dt) { + super(combineHashCode(DATA_HASH_CODE, dt.hashCode())); + this.dt = dt; + } + + boolean samePattern(Pattern other) { + if (other.getClass() != this.getClass()) + return false; + return dt.equals(((DataPattern)other).dt); + } + + void accept(PatternVisitor visitor) { + visitor.visitData(dt); + } + + Object apply(PatternFunction f) { + return f.caseData(this); + } + + Datatype getDatatype() { + return dt; + } + + boolean allowsAnyString() { + return dt instanceof Datatype2 && ((Datatype2)dt).alwaysValid(); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_data"); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DatatypeValue.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DatatypeValue.java new file mode 100644 index 0000000..3f53ae3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DatatypeValue.java @@ -0,0 +1,26 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; + +class DatatypeValue { + private final Object value; + private final Datatype dt; + + DatatypeValue(Object value, Datatype dt) { + this.value = value; + this.dt = dt; + } + + public int hashCode() { + return dt.hashCode() ^ dt.valueHashCode(value); + } + + public boolean equals(Object obj) { + if (!(obj instanceof DatatypeValue)) + return false; + DatatypeValue other = (DatatypeValue)obj; + if (other.dt != dt) + return false; + return dt.sameValue(value, other.value); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.java new file mode 100644 index 0000000..010e293 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/DuplicateAttributeDetector.java @@ -0,0 +1,48 @@ +package com.thaiopensource.relaxng.impl; + +import java.util.Vector; + +class DuplicateAttributeDetector { + private final Vector nameClasses = new Vector(); + private Alternative alternatives = null; + + private static class Alternative { + private final int startIndex; + private int endIndex; + private final Alternative parent; + + private Alternative(int startIndex, Alternative parent) { + this.startIndex = startIndex; + this.endIndex = startIndex; + this.parent = parent; + } + } + + boolean addAttribute(NameClass nc) { + int lim = nameClasses.size(); + for (Alternative a = alternatives; a != null; a = a.parent) { + for (int i = a.endIndex; i < lim; i++) + if (OverlapDetector.overlap(nc, (NameClass)nameClasses.elementAt(i))) + return false; + lim = a.startIndex; + } + for (int i = 0; i < lim; i++) + if (OverlapDetector.overlap(nc, (NameClass)nameClasses.elementAt(i))) + return false; + nameClasses.addElement(nc); + return true; + } + + void startChoice() { + alternatives = new Alternative(nameClasses.size(), alternatives); + } + + void alternative() { + alternatives.endIndex = nameClasses.size(); + } + + void endChoice() { + alternatives = alternatives.parent; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ElementPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ElementPattern.java new file mode 100644 index 0000000..354c5a1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ElementPattern.java @@ -0,0 +1,95 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +class ElementPattern extends Pattern { + private Pattern p; + private final NameClass origNameClass; + private NameClass nameClass; + private boolean expanded = false; + private boolean checkedRestrictions = false; + private final Locator loc; + + ElementPattern(NameClass nameClass, Pattern p, Locator loc) { + super(false, + ELEMENT_CONTENT_TYPE, + combineHashCode(ELEMENT_HASH_CODE, + nameClass.hashCode(), + p.hashCode())); + this.nameClass = nameClass; + this.origNameClass = nameClass; + this.p = p; + this.loc = loc; + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + if (alpha != null) + alpha.addElement(origNameClass); + if (checkedRestrictions) + return; + switch (context) { + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_element"); + case LIST_CONTEXT: + throw new RestrictionViolationException("list_contains_element"); + case ATTRIBUTE_CONTEXT: + throw new RestrictionViolationException("attribute_contains_element"); + } + checkedRestrictions = true; + try { + p.checkRestrictions(ELEMENT_CONTEXT, new DuplicateAttributeDetector(), null); + } + catch (RestrictionViolationException e) { + checkedRestrictions = false; + e.maybeSetLocator(loc); + throw e; + } + } + + Pattern expand(SchemaPatternBuilder b) { + if (!expanded) { + expanded = true; + p = p.expand(b); + if (p.isNotAllowed()) + nameClass = new NullNameClass(); + } + return this; + } + + boolean samePattern(Pattern other) { + if (!(other instanceof ElementPattern)) + return false; + ElementPattern ep = (ElementPattern)other; + return nameClass.equals(ep.nameClass) && p == ep.p; + } + + void checkRecursion(int depth) throws SAXException { + p.checkRecursion(depth + 1); + } + + void accept(PatternVisitor visitor) { + visitor.visitElement(nameClass, p); + } + + Object apply(PatternFunction f) { + return f.caseElement(this); + } + + void setContent(Pattern p) { + this.p = p; + } + + Pattern getContent() { + return p; + } + + NameClass getNameClass() { + return nameClass; + } + + Locator getLocator() { + return loc; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EmptyPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EmptyPattern.java new file mode 100644 index 0000000..a54f65c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EmptyPattern.java @@ -0,0 +1,25 @@ +package com.thaiopensource.relaxng.impl; + +class EmptyPattern extends Pattern { + EmptyPattern() { + super(true, EMPTY_CONTENT_TYPE, EMPTY_HASH_CODE); + } + boolean samePattern(Pattern other) { + return other instanceof EmptyPattern; + } + void accept(PatternVisitor visitor) { + visitor.visitEmpty(); + } + Object apply(PatternFunction f) { + return f.caseEmpty(this); + } + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_empty"); + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_empty"); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndAttributesFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndAttributesFunction.java new file mode 100644 index 0000000..5bb5912 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndAttributesFunction.java @@ -0,0 +1,75 @@ +package com.thaiopensource.relaxng.impl; + +class EndAttributesFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + + EndAttributesFunction(ValidatorPatternBuilder builder) { + this.builder = builder; + } + + public Object caseOther(Pattern p) { + return p; + } + + public Object caseGroup(GroupPattern p) { + Pattern p1 = p.getOperand1(); + Pattern p2 = p.getOperand2(); + Pattern q1 = memoApply(p1); + Pattern q2 = memoApply(p2); + if (p1 == q1 && p2 == q2) + return p; + return builder.makeGroup(q1, q2); + } + + public Object caseInterleave(InterleavePattern p) { + Pattern p1 = p.getOperand1(); + Pattern p2 = p.getOperand2(); + Pattern q1 = memoApply(p1); + Pattern q2 = memoApply(p2); + if (p1 == q1 && p2 == q2) + return p; + return builder.makeInterleave(q1, q2); + } + + public Object caseChoice(ChoicePattern p) { + Pattern p1 = p.getOperand1(); + Pattern p2 = p.getOperand2(); + Pattern q1 = memoApply(p1); + Pattern q2 = memoApply(p2); + if (p1 == q1 && p2 == q2) + return p; + return builder.makeChoice(q1, q2); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + Pattern p1 = p.getOperand(); + Pattern q1 = memoApply(p1); + if (p1 == q1) + return p; + return builder.makeOneOrMore(p1); + } + + public Object caseAfter(AfterPattern p) { + Pattern p1 = p.getOperand1(); + Pattern q1 = memoApply(p1); + if (p1 == q1) + return p; + return builder.makeAfter(q1, p.getOperand2()); + } + + public Object caseAttribute(AttributePattern p) { + return builder.makeNotAllowed(); + } + + final Pattern memoApply(Pattern p) { + return apply(builder.getPatternMemo(p)).getPattern(); + } + + PatternMemo apply(PatternMemo memo) { + return memo.endAttributes(this); + } + + ValidatorPatternBuilder getPatternBuilder() { + return builder; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndTagDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndTagDerivFunction.java new file mode 100644 index 0000000..21898ff --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/EndTagDerivFunction.java @@ -0,0 +1,33 @@ +package com.thaiopensource.relaxng.impl; + +class EndTagDerivFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + + EndTagDerivFunction(ValidatorPatternBuilder builder) { + this.builder = builder; + } + + public Object caseOther(Pattern p) { + return builder.makeNotAllowed(); + } + + public Object caseChoice(ChoicePattern p) { + return builder.makeChoice(memoApply(p.getOperand1()), + memoApply(p.getOperand2())); + } + + public Object caseAfter(AfterPattern p) { + if (p.getOperand1().isNullable()) + return p.getOperand2(); + else + return builder.makeNotAllowed(); + } + + final private Pattern memoApply(Pattern p) { + return apply(builder.getPatternMemo(p)).getPattern(); + } + + private PatternMemo apply(PatternMemo memo) { + return memo.endTagDeriv(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorNameClass.java new file mode 100644 index 0000000..6c046fa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorNameClass.java @@ -0,0 +1,21 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class ErrorNameClass implements NameClass { + public boolean contains(Name name) { + return false; + } + + public int containsSpecificity(Name name) { + return SPECIFICITY_NONE; + } + + public void accept(NameClassVisitor visitor) { + visitor.visitError(); + } + + public boolean isOpen() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorPattern.java new file mode 100644 index 0000000..2dec229 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ErrorPattern.java @@ -0,0 +1,16 @@ +package com.thaiopensource.relaxng.impl; + +class ErrorPattern extends Pattern { + ErrorPattern() { + super(false, EMPTY_CONTENT_TYPE, ERROR_HASH_CODE); + } + boolean samePattern(Pattern other) { + return other instanceof ErrorPattern; + } + void accept(PatternVisitor visitor) { + visitor.visitError(); + } + Object apply(PatternFunction f) { + return f.caseError(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.java new file mode 100644 index 0000000..a909a44 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdSoundnessChecker.java @@ -0,0 +1,14 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; + +public class FeasibleIdSoundnessChecker extends IdSoundnessChecker { + public FeasibleIdSoundnessChecker(IdTypeMap idTypeMap, ErrorHandler eh) { + super(idTypeMap, eh); + } + + public void endDocument() { + setComplete(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdTypeMapSchema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdTypeMapSchema.java new file mode 100644 index 0000000..6a9c15e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleIdTypeMapSchema.java @@ -0,0 +1,21 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import org.xml.sax.ErrorHandler; + +public class FeasibleIdTypeMapSchema extends AbstractSchema { + private final IdTypeMap idTypeMap; + + public FeasibleIdTypeMapSchema(IdTypeMap idTypeMap, PropertyMap properties) { + super(properties); + this.idTypeMap = idTypeMap; + } + + public Validator createValidator(PropertyMap properties) { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + return new FeasibleIdSoundnessChecker(idTypeMap, eh); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleTransform.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleTransform.java new file mode 100644 index 0000000..2d366fb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FeasibleTransform.java @@ -0,0 +1,46 @@ +package com.thaiopensource.relaxng.impl; + +import java.util.Hashtable; + +public class FeasibleTransform { + private static class FeasiblePatternFunction extends AbstractPatternFunction { + private final SchemaPatternBuilder spb; + private final Hashtable elementTable = new Hashtable(); + + FeasiblePatternFunction(SchemaPatternBuilder spb) { + this.spb = spb; + } + + public Object caseChoice(ChoicePattern p) { + return spb.makeChoice(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this)); + } + + public Object caseGroup(GroupPattern p) { + return spb.makeGroup(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this)); + } + + public Object caseInterleave(InterleavePattern p) { + return spb.makeInterleave(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this)); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + return spb.makeOneOrMore(p.getOperand().applyForPattern(this)); + } + + public Object caseElement(ElementPattern p) { + if (elementTable.get(p) == null) { + elementTable.put(p, p); + p.setContent(p.getContent().applyForPattern(this)); + } + return spb.makeOptional(p); + } + + public Object caseOther(Pattern p) { + return spb.makeOptional(p); + } + } + + public static Pattern transform(SchemaPatternBuilder spb, Pattern p) { + return p.applyForPattern(new FeasiblePatternFunction(spb)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FindElementFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FindElementFunction.java new file mode 100644 index 0000000..2f7ba4a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/FindElementFunction.java @@ -0,0 +1,78 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +import java.util.Hashtable; + +class FindElementFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + private final Name name; + private final Hashtable processed = new Hashtable(); + private int specificity = NameClass.SPECIFICITY_NONE; + private Pattern pattern = null; + + static public Pattern findElement(ValidatorPatternBuilder builder, Name name, Pattern start) { + FindElementFunction f = new FindElementFunction(builder, name); + start.apply(f); + if (f.pattern == null) + return builder.makeNotAllowed(); + return f.pattern; + } + + private FindElementFunction(ValidatorPatternBuilder builder, Name name) { + this.builder = builder; + this.name = name; + } + + private boolean haveProcessed(Pattern p) { + if (processed.get(p) != null) + return true; + processed.put(p, p); + return false; + } + + private Object caseBinary(BinaryPattern p) { + if (!haveProcessed(p)) { + p.getOperand1().apply(this); + p.getOperand2().apply(this); + } + return null; + + } + + public Object caseGroup(GroupPattern p) { + return caseBinary(p); + } + + public Object caseInterleave(InterleavePattern p) { + return caseBinary(p); + } + + public Object caseChoice(ChoicePattern p) { + return caseBinary(p); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + if (!haveProcessed(p)) + p.getOperand().apply(this); + return null; + } + + public Object caseElement(ElementPattern p) { + if (!haveProcessed(p)) { + int s = p.getNameClass().containsSpecificity(name); + if (s > specificity) { + specificity = s; + pattern = p.getContent(); + } + else if (s == specificity && s != NameClass.SPECIFICITY_NONE) + pattern = builder.makeChoice(pattern, p.getContent()); + p.getContent().apply(this); + } + return null; + } + + public Object caseOther(Pattern p) { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/GroupPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/GroupPattern.java new file mode 100644 index 0000000..cccfe93 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/GroupPattern.java @@ -0,0 +1,43 @@ +package com.thaiopensource.relaxng.impl; + +class GroupPattern extends BinaryPattern { + GroupPattern(Pattern p1, Pattern p2) { + super(p1.isNullable() && p2.isNullable(), + combineHashCode(GROUP_HASH_CODE, p1.hashCode(), p2.hashCode()), + p1, + p2); + } + + Pattern expand(SchemaPatternBuilder b) { + Pattern ep1 = p1.expand(b); + Pattern ep2 = p2.expand(b); + if (ep1 != p1 || ep2 != p2) + return b.makeGroup(ep1, ep2); + else + return this; + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_group"); + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_group"); + } + super.checkRestrictions(context == ELEMENT_REPEAT_CONTEXT + ? ELEMENT_REPEAT_GROUP_CONTEXT + : context, + dad, + alpha); + if (context != LIST_CONTEXT + && !contentTypeGroupable(p1.getContentType(), p2.getContentType())) + throw new RestrictionViolationException("group_string"); + } + + void accept(PatternVisitor visitor) { + visitor.visitGroup(p1, p2); + } + Object apply(PatternFunction f) { + return f.caseGroup(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdSoundnessChecker.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdSoundnessChecker.java new file mode 100644 index 0000000..0cfc594 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdSoundnessChecker.java @@ -0,0 +1,185 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.xml.util.StringSplitter; +import com.thaiopensource.xml.util.Name; +import org.relaxng.datatype.Datatype; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.helpers.LocatorImpl; + +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +public class IdSoundnessChecker implements Validator, ContentHandler { + private final IdTypeMap idTypeMap; + private final ErrorHandler eh; + private Locator locator; + private final Hashtable table = new Hashtable(); + + private static class Entry { + Locator idLoc; + Vector idrefLocs; + boolean hadId; + } + + public IdSoundnessChecker(IdTypeMap idTypeMap, ErrorHandler eh) { + this.idTypeMap = idTypeMap; + this.eh = eh; + } + + public void reset() { + table.clear(); + locator = null; + } + + public ContentHandler getContentHandler() { + return this; + } + + public DTDHandler getDTDHandler() { + return null; + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + public void startDocument() throws SAXException { + } + + void setComplete() { + } + + public void endDocument() throws SAXException { + for (Enumeration e = table.keys(); e.hasMoreElements();) { + String token = (String)e.nextElement(); + Entry entry = (Entry)table.get(token); + if (!entry.hadId) { + for (Enumeration f = entry.idrefLocs.elements(); f.hasMoreElements();) + error("missing_id", token, (Locator)f.nextElement()); + } + } + setComplete(); + } + + public void startPrefixMapping(String s, String s1) throws SAXException { + } + + public void endPrefixMapping(String s) throws SAXException { + } + + public void startElement(String namespaceUri, String localName, String qName, Attributes attributes) + throws SAXException { + Name elementName = new Name(namespaceUri, localName); + int len = attributes.getLength(); + for (int i = 0; i < len; i++) { + Name attributeName = new Name(attributes.getURI(i), attributes.getLocalName(i)); + int idType = idTypeMap.getIdType(elementName, attributeName); + if (idType != Datatype.ID_TYPE_NULL) { + String[] tokens = StringSplitter.split(attributes.getValue(i)); + switch (idType) { + case Datatype.ID_TYPE_ID: + if (tokens.length == 1) + id(tokens[0]); + else if (tokens.length == 0) + error("id_no_tokens"); + else + error("id_multiple_tokens"); + break; + case Datatype.ID_TYPE_IDREF: + if (tokens.length == 1) + idref(tokens[0]); + else if (tokens.length == 0) + error("idref_no_tokens"); + else + error("idref_multiple_tokens"); + break; + case Datatype.ID_TYPE_IDREFS: + if (tokens.length > 0) { + for (int j = 0; j < tokens.length; j++) + idref(tokens[j]); + } + else + error("idrefs_no_tokens"); + break; + } + } + } + } + + private void id(String token) throws SAXException { + Entry entry = (Entry)table.get(token); + if (entry == null) { + entry = new Entry(); + table.put(token, entry); + } + else if (entry.hadId) { + error("duplicate_id", token); + error("first_id", token, entry.idLoc); + return; + } + entry.idLoc = new LocatorImpl(locator); + entry.hadId = true; + } + + private void idref(String token) { + Entry entry = (Entry)table.get(token); + if (entry == null) { + entry = new Entry(); + table.put(token, entry); + } + if (entry.hadId) + return; + if (entry.idrefLocs == null) + entry.idrefLocs = new Vector(); + entry.idrefLocs.addElement(new LocatorImpl(locator)); + } + + public void endElement(String s, String s1, String s2) throws SAXException { + } + + public void characters(char[] chars, int i, int i1) throws SAXException { + } + + public void ignorableWhitespace(char[] chars, int i, int i1) throws SAXException { + } + + public void processingInstruction(String s, String s1) throws SAXException { + } + + public void skippedEntity(String s) throws SAXException { + } + + public void notationDecl(String name, + String publicId, + String systemId) + throws SAXException { + } + + public void unparsedEntityDecl(String name, + String publicId, + String systemId, + String notationName) + throws SAXException { + } + + private void error(String key) throws SAXException { + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key), locator)); + } + + private void error(String key, String arg) throws SAXException { + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key, arg), locator)); + } + + private void error(String key, String arg, Locator loc) throws SAXException { + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key, arg), + loc)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMap.java new file mode 100644 index 0000000..bdac7bf --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMap.java @@ -0,0 +1,7 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +public interface IdTypeMap { + int getIdType(Name elementName, Name attributeName); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.java new file mode 100644 index 0000000..f2d619e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapBuilder.java @@ -0,0 +1,315 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import com.thaiopensource.xml.util.Name; + +public class IdTypeMapBuilder { + private boolean hadError; + private final ErrorHandler eh; + private final PatternFunction idTypeFunction = new IdTypeFunction(); + private final IdTypeMapImpl idTypeMap = new IdTypeMapImpl(); + private final Hashtable elementProcessed = new Hashtable(); + private final Vector possibleConflicts = new Vector(); + + private void notePossibleConflict(NameClass elementNameClass, NameClass attributeNameClass, Locator loc) { + possibleConflicts.addElement(new PossibleConflict(elementNameClass, attributeNameClass, loc)); + } + + private static class WrappedSAXException extends RuntimeException { + private final SAXException cause; + WrappedSAXException(SAXException cause) { + this.cause = cause; + } + } + + private static class PossibleConflict { + private final NameClass elementNameClass; + private final NameClass attributeNameClass; + private final Locator locator; + + private PossibleConflict(NameClass elementNameClass, NameClass attributeNameClass, Locator locator) { + this.elementNameClass = elementNameClass; + this.attributeNameClass = attributeNameClass; + this.locator = locator; + } + } + + private static class ScopedName { + private final Name elementName; + private final Name attributeName; + + private ScopedName(Name elementName, Name attributeName) { + this.elementName = elementName; + this.attributeName = attributeName; + } + + public int hashCode() { + return elementName.hashCode() ^ attributeName.hashCode(); + } + + public boolean equals(Object obj) { + if (!(obj instanceof ScopedName)) + return false; + ScopedName other = (ScopedName)obj; + return elementName.equals(other.elementName) && attributeName.equals(other.attributeName); + } + } + + private static class IdTypeMapImpl implements IdTypeMap { + private final Hashtable table = new Hashtable(); + public int getIdType(Name elementName, Name attributeName) { + Integer n = (Integer)table.get(new ScopedName(elementName, attributeName)); + if (n == null) + return Datatype.ID_TYPE_NULL; + return n.intValue(); + } + private void add(Name elementName, Name attributeName, int idType) { + table.put(new ScopedName(elementName, attributeName), new Integer(idType)); + } + } + + private class IdTypeFunction extends AbstractPatternFunction { + public Object caseOther(Pattern p) { + return new Integer(Datatype.ID_TYPE_NULL); + } + + public Object caseData(DataPattern p) { + return new Integer(p.getDatatype().getIdType()); + } + + public Object caseDataExcept(DataExceptPattern p) { + return new Integer(p.getDatatype().getIdType()); + } + + public Object caseValue(ValuePattern p) { + return new Integer(p.getDatatype().getIdType()); + } + } + + private class BuildFunction extends AbstractPatternFunction { + private final NameClass elementNameClass; + private final Locator locator; + private final boolean attributeIsParent; + + BuildFunction(NameClass elementNameClass, Locator locator) { + this.elementNameClass = elementNameClass; + this.locator = locator; + this.attributeIsParent = false; + } + + BuildFunction(NameClass elementNameClass, Locator locator, boolean attributeIsParent) { + this.elementNameClass = elementNameClass; + this.locator = locator; + this.attributeIsParent = attributeIsParent; + } + + private BuildFunction down() { + if (!attributeIsParent) + return this; + return new BuildFunction(elementNameClass, locator, false); + } + + public Object caseChoice(ChoicePattern p) { + BuildFunction f = down(); + p.getOperand1().apply(f); + p.getOperand2().apply(f); + return null; + } + + public Object caseInterleave(InterleavePattern p) { + BuildFunction f = down(); + p.getOperand1().apply(f); + p.getOperand2().apply(f); + return null; + } + + public Object caseGroup(GroupPattern p) { + BuildFunction f = down(); + p.getOperand1().apply(f); + p.getOperand2().apply(f); + return null; + } + + public Object caseOneOrMore(OneOrMorePattern p) { + p.getOperand().apply(down()); + return null; + } + + public Object caseElement(ElementPattern p) { + if (elementProcessed.get(p) != null) + return null; + elementProcessed.put(p, p); + p.getContent().apply(new BuildFunction(p.getNameClass(), p.getLocator())); + return null; + } + + public Object caseAttribute(AttributePattern p) { + int idType = ((Integer)p.getContent().apply(idTypeFunction)).intValue(); + if (idType != Datatype.ID_TYPE_NULL) { + NameClass attributeNameClass = p.getNameClass(); + if (!(attributeNameClass instanceof SimpleNameClass)) { + error("id_attribute_name_class", p.getLocator()); + return null; + } + elementNameClass.accept(new ElementNameClassVisitor(((SimpleNameClass)attributeNameClass).getName(), + locator, + idType)); + } + else + notePossibleConflict(elementNameClass, p.getNameClass(), locator); + p.getContent().apply(new BuildFunction(null, p.getLocator(), true)); + return null; + } + + private void datatype(Datatype dt) { + if (dt.getIdType() != Datatype.ID_TYPE_NULL && !attributeIsParent) + error("id_parent", locator); + } + + public Object caseData(DataPattern p) { + datatype(p.getDatatype()); + return null; + } + + public Object caseDataExcept(DataExceptPattern p) { + datatype(p.getDatatype()); + p.getExcept().apply(down()); + return null; + } + + public Object caseValue(ValuePattern p) { + datatype(p.getDatatype()); + return null; + } + + public Object caseList(ListPattern p) { + p.getOperand().apply(down()); + return null; + } + + public Object caseOther(Pattern p) { + return null; + } + } + + private class ElementNameClassVisitor implements NameClassVisitor { + private final Name attributeName; + private final Locator locator; + private final int idType; + + ElementNameClassVisitor(Name attributeName, Locator locator, int idType) { + this.attributeName = attributeName; + this.locator = locator; + this.idType = idType; + } + + public void visitChoice(NameClass nc1, NameClass nc2) { + nc1.accept(this); + nc2.accept(this); + } + + public void visitName(Name elementName) { + int tem = idTypeMap.getIdType(elementName, attributeName); + if (tem != Datatype.ID_TYPE_NULL && tem != idType) + error("id_type_conflict", elementName, attributeName, locator); + idTypeMap.add(elementName, attributeName, idType); + } + + public void visitNsName(String ns) { + visitOther(); + } + + public void visitNsNameExcept(String ns, NameClass nc) { + visitOther(); + } + + public void visitAnyName() { + visitOther(); + } + + public void visitAnyNameExcept(NameClass nc) { + visitOther(); + } + + public void visitNull() { + } + + public void visitError() { + } + + private void visitOther() { + error("id_element_name_class", locator); + } + } + + private void error(String key, Locator locator) { + hadError = true; + if (eh != null) + try { + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key), locator)); + } + catch (SAXException e) { + throw new WrappedSAXException(e); + } + } + + private void error(String key, Name arg1, Name arg2, Locator locator) { + hadError = true; + if (eh != null) + try { + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key, NameFormatter.format(arg1), NameFormatter.format(arg2)), + locator)); + } + catch (SAXException e) { + throw new WrappedSAXException(e); + } + } + + public IdTypeMapBuilder(ErrorHandler eh, Pattern pattern) throws SAXException { + this.eh = eh; + try { + pattern.apply(new BuildFunction(null, null)); + for (Enumeration e = possibleConflicts.elements(); + e.hasMoreElements();) { + PossibleConflict pc = (PossibleConflict)e.nextElement(); + if (pc.elementNameClass instanceof SimpleNameClass + && pc.attributeNameClass instanceof SimpleNameClass) { + Name elementName = ((SimpleNameClass)pc.elementNameClass).getName(); + Name attributeName = ((SimpleNameClass)pc.attributeNameClass).getName(); + int idType = idTypeMap.getIdType(elementName, + attributeName); + if (idType != Datatype.ID_TYPE_NULL) + error("id_type_conflict", elementName, attributeName, pc.locator); + } + else { + for (Enumeration f = idTypeMap.table.keys(); f.hasMoreElements();) { + ScopedName sn = (ScopedName)f.nextElement(); + if (pc.elementNameClass.contains(sn.elementName) + && pc.attributeNameClass.contains(sn.attributeName)) { + error("id_type_conflict", sn.elementName, sn.attributeName, pc.locator); + break; + } + } + } + } + } + catch (WrappedSAXException e) { + throw e.cause; + } + } + + public IdTypeMap getIdTypeMap() { + if (hadError) + return null; + return idTypeMap; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapSchema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapSchema.java new file mode 100644 index 0000000..4390cdb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IdTypeMapSchema.java @@ -0,0 +1,22 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.AbstractSchema; +import org.xml.sax.ErrorHandler; + +public class IdTypeMapSchema extends AbstractSchema { + private final IdTypeMap idTypeMap; + + public IdTypeMapSchema(IdTypeMap idTypeMap, PropertyMap properties) { + super(properties); + this.idTypeMap = idTypeMap; + } + + public Validator createValidator(PropertyMap properties) { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + return new IdSoundnessChecker(idTypeMap, eh); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IgnoreMissingAttributesFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IgnoreMissingAttributesFunction.java new file mode 100644 index 0000000..80ac964 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/IgnoreMissingAttributesFunction.java @@ -0,0 +1,15 @@ +package com.thaiopensource.relaxng.impl; + +class IgnoreMissingAttributesFunction extends EndAttributesFunction { + IgnoreMissingAttributesFunction(ValidatorPatternBuilder builder) { + super(builder); + } + + public Object caseAttribute(AttributePattern p) { + return getPatternBuilder().makeEmpty(); + } + + PatternMemo apply(PatternMemo memo) { + return memo.ignoreMissingAttributes(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.java new file mode 100644 index 0000000..304ee03 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InconsistentDataDerivType.java @@ -0,0 +1,19 @@ +package com.thaiopensource.relaxng.impl; + +class InconsistentDataDerivType extends DataDerivType { + static private final InconsistentDataDerivType instance = new InconsistentDataDerivType(); + + static InconsistentDataDerivType getInstance() { + return instance; + } + + private InconsistentDataDerivType() { } + + DataDerivType combine(DataDerivType ddt) { + return this; + } + + DataDerivType copy() { + return this; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InterleavePattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InterleavePattern.java new file mode 100644 index 0000000..97cceab --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/InterleavePattern.java @@ -0,0 +1,61 @@ +package com.thaiopensource.relaxng.impl; + +class InterleavePattern extends BinaryPattern { + InterleavePattern(Pattern p1, Pattern p2) { + super(p1.isNullable() && p2.isNullable(), + combineHashCode(INTERLEAVE_HASH_CODE, p1.hashCode(), p2.hashCode()), + p1, + p2); + } + Pattern expand(SchemaPatternBuilder b) { + Pattern ep1 = p1.expand(b); + Pattern ep2 = p2.expand(b); + if (ep1 != p1 || ep2 != p2) + return b.makeInterleave(ep1, ep2); + else + return this; + } + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_interleave"); + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_interleave"); + case LIST_CONTEXT: + throw new RestrictionViolationException("list_contains_interleave"); + } + if (context == ELEMENT_REPEAT_CONTEXT) + context = ELEMENT_REPEAT_INTERLEAVE_CONTEXT; + Alphabet a1; + if (alpha != null && alpha.isEmpty()) + a1 = alpha; + else + a1 = new Alphabet(); + p1.checkRestrictions(context, dad, a1); + if (a1.isEmpty()) + p2.checkRestrictions(context, dad, a1); + else { + Alphabet a2 = new Alphabet(); + p2.checkRestrictions(context, dad, a2); + a1.checkOverlap(a2); + if (alpha != null) { + if (alpha != a1) + alpha.addAlphabet(a1); + alpha.addAlphabet(a2); + } + } + if (!contentTypeGroupable(p1.getContentType(), p2.getContentType())) + throw new RestrictionViolationException("interleave_string"); + if (p1.getContentType() == MIXED_CONTENT_TYPE + && p2.getContentType() == MIXED_CONTENT_TYPE) + throw new RestrictionViolationException("interleave_text_overlap"); + } + + void accept(PatternVisitor visitor) { + visitor.visitInterleave(p1, p2); + } + Object apply(PatternFunction f) { + return f.caseInterleave(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ListPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ListPattern.java new file mode 100644 index 0000000..8528a80 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ListPattern.java @@ -0,0 +1,65 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +class ListPattern extends Pattern { + private final Pattern p; + private final Locator locator; + + ListPattern(Pattern p, Locator locator) { + super(false, + DATA_CONTENT_TYPE, + combineHashCode(LIST_HASH_CODE, p.hashCode())); + this.p = p; + this.locator = locator; + } + + Pattern expand(SchemaPatternBuilder b) { + Pattern ep = p.expand(b); + if (ep != p) + return b.makeList(ep, locator); + else + return this; + } + + void checkRecursion(int depth) throws SAXException { + p.checkRecursion(depth); + } + + boolean samePattern(Pattern other) { + return (other instanceof ListPattern + && p == ((ListPattern)other).p); + } + + void accept(PatternVisitor visitor) { + visitor.visitList(p); + } + + Object apply(PatternFunction f) { + return f.caseList(this); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_list"); + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_list"); + case LIST_CONTEXT: + throw new RestrictionViolationException("list_contains_list"); + } + try { + p.checkRestrictions(LIST_CONTEXT, dad, null); + } + catch (RestrictionViolationException e) { + e.maybeSetLocator(locator); + throw e; + } + } + + Pattern getOperand() { + return p; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/MixedTextDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/MixedTextDerivFunction.java new file mode 100644 index 0000000..dca4f66 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/MixedTextDerivFunction.java @@ -0,0 +1,45 @@ +package com.thaiopensource.relaxng.impl; + +class MixedTextDerivFunction extends EndAttributesFunction { + + MixedTextDerivFunction(ValidatorPatternBuilder builder) { + super(builder); + } + + public Object caseText(TextPattern p) { + return p; + } + + public Object caseGroup(GroupPattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + final Pattern q1 = memoApply(p1); + Pattern tem = (q1 == p1) ? p : getPatternBuilder().makeGroup(q1, p2); + if (!p1.isNullable()) + return tem; + return getPatternBuilder().makeChoice(tem, memoApply(p2)); + } + + public Object caseInterleave(InterleavePattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + final Pattern q1 = memoApply(p1); + final Pattern q2 = memoApply(p2); + final Pattern i1 = (q1 == p1) ? p : getPatternBuilder().makeInterleave(q1, p2); + final Pattern i2 = (q2 == p2) ? p : getPatternBuilder().makeInterleave(p1, q2); + return getPatternBuilder().makeChoice(i1, i2); + } + + public Object caseOneOrMore(OneOrMorePattern p) { + return getPatternBuilder().makeGroup(memoApply(p.getOperand()), + getPatternBuilder().makeOptional(p)); + } + + public Object caseOther(Pattern p) { + return getPatternBuilder().makeNotAllowed(); + } + + PatternMemo apply(PatternMemo memo) { + return memo.mixedTextDeriv(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClass.java new file mode 100644 index 0000000..c60f46e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClass.java @@ -0,0 +1,15 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.xml.util.Name; + +public interface NameClass extends ParsedNameClass { + static final int SPECIFICITY_NONE = -1; + static final int SPECIFICITY_ANY_NAME = 0; + static final int SPECIFICITY_NS_NAME = 1; + static final int SPECIFICITY_NAME = 2; + boolean contains(Name name); + int containsSpecificity(Name name); + void accept(NameClassVisitor visitor); + boolean isOpen(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClassVisitor.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClassVisitor.java new file mode 100644 index 0000000..1f265fd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameClassVisitor.java @@ -0,0 +1,14 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +public interface NameClassVisitor { + void visitChoice(NameClass nc1, NameClass nc2); + void visitNsName(String ns); + void visitNsNameExcept(String ns, NameClass nc); + void visitAnyName(); + void visitAnyNameExcept(NameClass nc); + void visitName(Name name); + void visitNull(); + void visitError(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameFormatter.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameFormatter.java new file mode 100644 index 0000000..d7b95dd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NameFormatter.java @@ -0,0 +1,15 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + + +class NameFormatter { + static String format(Name name) { + String localName = name.getLocalName(); + String namespaceUri = name.getNamespaceUri(); + if (namespaceUri.equals("")) + return SchemaBuilderImpl.localizer.message("name_absent_namespace", localName); + else + return SchemaBuilderImpl.localizer.message("name_with_namespace", namespaceUri, localName); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NotAllowedPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NotAllowedPattern.java new file mode 100644 index 0000000..b2af65d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NotAllowedPattern.java @@ -0,0 +1,20 @@ +package com.thaiopensource.relaxng.impl; + +class NotAllowedPattern extends Pattern { + NotAllowedPattern() { + super(false, EMPTY_CONTENT_TYPE, NOT_ALLOWED_HASH_CODE); + } + boolean isNotAllowed() { + return true; + } + boolean samePattern(Pattern other) { + // needs to work for UnexpandedNotAllowedPattern + return other.getClass() == this.getClass(); + } + void accept(PatternVisitor visitor) { + visitor.visitNotAllowed(); + } + Object apply(PatternFunction f) { + return f.caseNotAllowed(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameClass.java new file mode 100644 index 0000000..7e69822 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameClass.java @@ -0,0 +1,38 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class NsNameClass implements NameClass { + + private final String namespaceUri; + + NsNameClass(String namespaceUri) { + this.namespaceUri = namespaceUri; + } + + public boolean contains(Name name) { + return this.namespaceUri.equals(name.getNamespaceUri()); + } + + public int containsSpecificity(Name name) { + return contains(name) ? SPECIFICITY_NS_NAME : SPECIFICITY_NONE; + } + + public int hashCode() { + return namespaceUri.hashCode(); + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof NsNameClass)) + return false; + return namespaceUri.equals(((NsNameClass)obj).namespaceUri); + } + + public void accept(NameClassVisitor visitor) { + visitor.visitNsName(namespaceUri); + } + + public boolean isOpen() { + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameExceptNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameExceptNameClass.java new file mode 100644 index 0000000..9ac0631 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NsNameExceptNameClass.java @@ -0,0 +1,44 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class NsNameExceptNameClass implements NameClass { + + private final NameClass nameClass; + private final String namespaceURI; + + NsNameExceptNameClass(String namespaceURI, NameClass nameClass) { + this.namespaceURI = namespaceURI; + this.nameClass = nameClass; + } + + public boolean contains(Name name) { + return (this.namespaceURI.equals(name.getNamespaceUri()) + && !nameClass.contains(name)); + } + + public int containsSpecificity(Name name) { + return contains(name) ? SPECIFICITY_NS_NAME : SPECIFICITY_NONE; + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof NsNameExceptNameClass)) + return false; + NsNameExceptNameClass other = (NsNameExceptNameClass)obj; + return (namespaceURI.equals(other.namespaceURI) + && nameClass.equals(other.nameClass)); + } + + public int hashCode() { + return namespaceURI.hashCode() ^ nameClass.hashCode(); + } + + public void accept(NameClassVisitor visitor) { + visitor.visitNsNameExcept(namespaceURI, nameClass); + } + + public boolean isOpen() { + return true; + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NullNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NullNameClass.java new file mode 100644 index 0000000..6b4611c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/NullNameClass.java @@ -0,0 +1,31 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class NullNameClass implements NameClass { + public boolean contains(Name name) { + return false; + } + + public int containsSpecificity(Name name) { + return SPECIFICITY_NONE; + } + + public int hashCode() { + return NullNameClass.class.hashCode(); + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof NullNameClass)) + return false; + return true; + } + + public void accept(NameClassVisitor visitor) { + visitor.visitNull(); + } + + public boolean isOpen() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OneOrMorePattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OneOrMorePattern.java new file mode 100644 index 0000000..3c29276 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OneOrMorePattern.java @@ -0,0 +1,62 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.SAXException; + +class OneOrMorePattern extends Pattern { + private final Pattern p; + + OneOrMorePattern(Pattern p) { + super(p.isNullable(), + p.getContentType(), + combineHashCode(ONE_OR_MORE_HASH_CODE, p.hashCode())); + this.p = p; + } + + Pattern expand(SchemaPatternBuilder b) { + Pattern ep = p.expand(b); + if (ep != p) + return b.makeOneOrMore(ep); + else + return this; + } + + void checkRecursion(int depth) throws SAXException { + p.checkRecursion(depth); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_one_or_more"); + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_one_or_more"); + } + + p.checkRestrictions(context == ELEMENT_CONTEXT + ? ELEMENT_REPEAT_CONTEXT + : context, + dad, + alpha); + if (context != LIST_CONTEXT + && !contentTypeGroupable(p.getContentType(), p.getContentType())) + throw new RestrictionViolationException("one_or_more_string"); + } + + boolean samePattern(Pattern other) { + return (other instanceof OneOrMorePattern + && p == ((OneOrMorePattern)other).p); + } + + void accept(PatternVisitor visitor) { + visitor.visitOneOrMore(p); + } + + Object apply(PatternFunction f) { + return f.caseOneOrMore(this); + } + + Pattern getOperand() { + return p; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OverlapDetector.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OverlapDetector.java new file mode 100644 index 0000000..c6925bb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/OverlapDetector.java @@ -0,0 +1,68 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class OverlapDetector implements NameClassVisitor { + private final NameClass nc1; + private final NameClass nc2; + private boolean overlaps = false; + + private static final String IMPOSSIBLE = "\u0000"; + + private OverlapDetector(NameClass nc1, NameClass nc2) { + this.nc1 = nc1; + this.nc2 = nc2; + nc1.accept(this); + nc2.accept(this); + } + + private void probe(Name name) { + if (nc1.contains(name) && nc2.contains(name)) + overlaps = true; + } + + public void visitChoice(NameClass nc1, NameClass nc2) { + nc1.accept(this); + nc2.accept(this); + } + + public void visitNsName(String ns) { + probe(new Name(ns, IMPOSSIBLE)); + } + + public void visitNsNameExcept(String ns, NameClass ex) { + probe(new Name(ns, IMPOSSIBLE)); + ex.accept(this); + } + + public void visitAnyName() { + probe(new Name(IMPOSSIBLE, IMPOSSIBLE)); + } + + public void visitAnyNameExcept(NameClass ex) { + probe(new Name(IMPOSSIBLE, IMPOSSIBLE)); + ex.accept(this); + } + + public void visitName(Name name) { + probe(name); + } + + public void visitNull() { + } + + public void visitError() { + } + + static boolean overlap(NameClass nc1, NameClass nc2) { + if (nc2 instanceof SimpleNameClass) { + SimpleNameClass snc = (SimpleNameClass)nc2; + return nc1.contains(snc.getName()); + } + if (nc1 instanceof SimpleNameClass) { + SimpleNameClass snc = (SimpleNameClass)nc1; + return nc2.contains(snc.getName()); + } + return new OverlapDetector(nc1, nc2).overlaps; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Pattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Pattern.java new file mode 100644 index 0000000..cfd342e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/Pattern.java @@ -0,0 +1,108 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.SAXException; +import com.thaiopensource.relaxng.parse.ParsedPattern; + +public abstract class Pattern implements ParsedPattern { + private final boolean nullable; + private final int hc; + private final int contentType; + + static final int TEXT_HASH_CODE = 1; + static final int ERROR_HASH_CODE = 3; + static final int EMPTY_HASH_CODE = 5; + static final int NOT_ALLOWED_HASH_CODE = 7; + static final int CHOICE_HASH_CODE = 11; + static final int GROUP_HASH_CODE = 13; + static final int INTERLEAVE_HASH_CODE = 17; + static final int ONE_OR_MORE_HASH_CODE = 19; + static final int ELEMENT_HASH_CODE = 23; + static final int VALUE_HASH_CODE = 27; + static final int ATTRIBUTE_HASH_CODE = 29; + static final int DATA_HASH_CODE = 31; + static final int LIST_HASH_CODE = 37; + static final int AFTER_HASH_CODE = 41; + + static int combineHashCode(int hc1, int hc2, int hc3) { + return hc1 * hc2 * hc3; + } + + static int combineHashCode(int hc1, int hc2) { + return hc1 * hc2; + } + + static final int EMPTY_CONTENT_TYPE = 0; + static final int ELEMENT_CONTENT_TYPE = 1; + static final int MIXED_CONTENT_TYPE = 2; + static final int DATA_CONTENT_TYPE = 3; + + Pattern(boolean nullable, int contentType, int hc) { + this.nullable = nullable; + this.contentType = contentType; + this.hc = hc; + } + + Pattern() { + this.nullable = false; + this.hc = hashCode(); + this.contentType = EMPTY_CONTENT_TYPE; + } + + void checkRecursion(int depth) throws SAXException { } + + Pattern expand(SchemaPatternBuilder b) { + return this; + } + + final boolean isNullable() { + return nullable; + } + + boolean isNotAllowed() { + return false; + } + + static final int START_CONTEXT = 0; + static final int ELEMENT_CONTEXT = 1; + static final int ELEMENT_REPEAT_CONTEXT = 2; + static final int ELEMENT_REPEAT_GROUP_CONTEXT = 3; + static final int ELEMENT_REPEAT_INTERLEAVE_CONTEXT = 4; + static final int ATTRIBUTE_CONTEXT = 5; + static final int LIST_CONTEXT = 6; + static final int DATA_EXCEPT_CONTEXT = 7; + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + } + + // Know that other is not null + abstract boolean samePattern(Pattern other); + + final int patternHashCode() { + return hc; + } + + final int getContentType() { + return contentType; + } + + boolean containsChoice(Pattern p) { + return this == p; + } + + abstract void accept(PatternVisitor visitor); + abstract Object apply(PatternFunction f); + + Pattern applyForPattern(PatternFunction f) { + return (Pattern)apply(f); + } + + static boolean contentTypeGroupable(int ct1, int ct2) { + if (ct1 == EMPTY_CONTENT_TYPE || ct2 == EMPTY_CONTENT_TYPE) + return true; + if (ct1 == DATA_CONTENT_TYPE || ct2 == DATA_CONTENT_TYPE) + return false; + return true; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternBuilder.java new file mode 100644 index 0000000..359423f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternBuilder.java @@ -0,0 +1,92 @@ +package com.thaiopensource.relaxng.impl; + +public class PatternBuilder { + private final EmptyPattern empty; + protected final NotAllowedPattern notAllowed; + protected final PatternInterner interner; + + public PatternBuilder() { + empty = new EmptyPattern(); + notAllowed = new NotAllowedPattern(); + interner = new PatternInterner(); + } + + public PatternBuilder(PatternBuilder parent) { + empty = parent.empty; + notAllowed = parent.notAllowed; + interner = new PatternInterner(parent.interner); + } + + Pattern makeEmpty() { + return empty; + } + + Pattern makeNotAllowed() { + return notAllowed; + } + + Pattern makeGroup(Pattern p1, Pattern p2) { + if (p1 == empty) + return p2; + if (p2 == empty) + return p1; + if (p1 == notAllowed || p2 == notAllowed) + return notAllowed; + if (false && p1 instanceof GroupPattern) { + GroupPattern sp = (GroupPattern)p1; + return makeGroup(sp.p1, makeGroup(sp.p2, p2)); + } + Pattern p = new GroupPattern(p1, p2); + return interner.intern(p); + } + + Pattern makeInterleave(Pattern p1, Pattern p2) { + if (p1 == empty) + return p2; + if (p2 == empty) + return p1; + if (p1 == notAllowed || p2 == notAllowed) + return notAllowed; + if (false && p1 instanceof InterleavePattern) { + InterleavePattern ip = (InterleavePattern)p1; + return makeInterleave(ip.p1, makeInterleave(ip.p2, p2)); + } + if (false) { + if (p2 instanceof InterleavePattern) { + InterleavePattern ip = (InterleavePattern)p2; + if (p1.hashCode() > ip.p1.hashCode()) + return makeInterleave(ip.p1, makeInterleave(p1, ip.p2)); + } + else if (p1.hashCode() > p2.hashCode()) + return makeInterleave(p2, p1); + } + Pattern p = new InterleavePattern(p1, p2); + return interner.intern(p); + } + + Pattern makeChoice(Pattern p1, Pattern p2) { + if (p1 == empty && p2.isNullable()) + return p2; + if (p2 == empty && p1.isNullable()) + return p1; + Pattern p = new ChoicePattern(p1, p2); + return interner.intern(p); + } + + Pattern makeOneOrMore(Pattern p) { + if (p == empty + || p == notAllowed + || p instanceof OneOrMorePattern) + return p; + Pattern p1 = new OneOrMorePattern(p); + return interner.intern(p1); + } + + Pattern makeOptional(Pattern p) { + return makeChoice(p, empty); + } + + Pattern makeZeroOrMore(Pattern p) { + return makeOptional(makeOneOrMore(p)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternDumper.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternDumper.java new file mode 100644 index 0000000..f218dde --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternDumper.java @@ -0,0 +1,341 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; + +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Hashtable; +import java.util.Vector; + +import com.thaiopensource.xml.util.WellKnownNamespaces; +import com.thaiopensource.xml.util.Name; + +public class PatternDumper { + private boolean startTagOpen = false; + private final Vector tagStack = new Vector(); + private final PrintWriter writer; + private int level = 0; + private boolean suppressIndent = false; + private final Vector patternList = new Vector(); + private final Hashtable patternTable = new Hashtable(); + + private final PatternVisitor patternVisitor = new DumpPatternVisitor(); + private final PatternVisitor groupPatternVisitor = new GroupDumpPatternVisitor(); + private final PatternVisitor choicePatternVisitor = new ChoiceDumpPatternVisitor(); + private final PatternVisitor interleavePatternVisitor = new InterleaveDumpPatternVisitor(); + private final NameClassVisitor nameClassVisitor = new DumpNameClassVisitor(); + private final NameClassVisitor choiceNameClassVisitor = new ChoiceDumpNameClassVisitor(); + + static public void dump(PrintWriter writer, Pattern p) { + new PatternDumper(writer).dump(p); + } + + static public void dump(OutputStream out, Pattern p) { + new PatternDumper(new PrintWriter(out)).dump(p); + } + + private PatternDumper(PrintWriter writer) { + this.writer = writer; + } + + private void dump(Pattern p) { + write(""); + startElement("grammar"); + attribute("xmlns", WellKnownNamespaces.RELAX_NG); + startElement("start"); + p.accept(groupPatternVisitor); + endElement(); + for (int i = 0; i < patternList.size(); i++) { + startElement("define"); + Pattern tem = (Pattern)patternList.elementAt(i); + attribute("name", getName(tem)); + tem.accept(groupPatternVisitor); + endElement(); + } + endElement(); + writer.println(); + writer.flush(); + } + + private String getName(Pattern p) { + String name = (String)patternTable.get(p); + if (name == null) { + name = "p" + patternList.size(); + patternList.addElement(p); + patternTable.put(p, name); + } + return name; + } + + private void startElement(String name) { + closeStartTag(); + indent(level); + write('<'); + write(name); + push(name); + startTagOpen = true; + level++; + } + + private void closeStartTag() { + if (startTagOpen) { + startTagOpen = false; + write('>'); + } + } + + private void attribute(String name, String value) { + write(' '); + write(name); + write('='); + write('"'); + chars(value, true); + write('"'); + } + + private void data(String str) { + if (str.length() > 0) { + closeStartTag(); + chars(str, false); + suppressIndent = true; + } + } + + private void chars(String str, boolean isAttribute) { + int len = str.length(); + for (int i = 0; i < len; i++) { + char c = str.charAt(i); + switch (c) { + case '&': + write("&"); + break; + case '<': + write("<"); + break; + case '>': + write(">"); + break; + case '"': + if (isAttribute) { + write("""); + break; + } + // fall through + default: + write(c); + break; + } + } + } + + private void endElement() { + --level; + if (startTagOpen) { + startTagOpen = false; + write("/>"); + pop(); + } + else { + if (!suppressIndent) + indent(level); + write(""); + } + suppressIndent = false; + } + + private void indent(int level) { + writer.println(); + for (int i = 0; i < level; i++) + write(" "); + } + + private void write(String str) { + writer.print(str); + } + + private void write(char c) { + writer.print(c); + } + + private void push(String s) { + tagStack.addElement(s); + } + + private String pop() { + String s = (String)tagStack.lastElement(); + tagStack.setSize(tagStack.size() - 1); + return s; + } + + class DumpPatternVisitor implements PatternVisitor { + public void visitEmpty() { + startElement("empty"); + endElement(); + } + + public void visitNotAllowed() { + startElement("notAllowed"); + endElement(); + } + + public void visitError() { + startElement("error"); + endElement(); + } + + public void visitGroup(Pattern p1, Pattern p2) { + startElement("group"); + p1.accept(groupPatternVisitor); + p2.accept(groupPatternVisitor); + endElement(); + } + + public void visitInterleave(Pattern p1, Pattern p2) { + startElement("interleave"); + p1.accept(interleavePatternVisitor); + p2.accept(interleavePatternVisitor); + endElement(); + } + + public void visitChoice(Pattern p1, Pattern p2) { + startElement("choice"); + p1.accept(choicePatternVisitor); + p2.accept(choicePatternVisitor); + endElement(); + } + + public void visitOneOrMore(Pattern p) { + startElement("oneOrMore"); + p.accept(groupPatternVisitor); + endElement(); + } + + public void visitElement(NameClass nc, Pattern content) { + startElement("element"); + nc.accept(nameClassVisitor); + startElement("ref"); + attribute("name", getName(content)); + endElement(); + endElement(); + } + + public void visitAttribute(NameClass nc, Pattern value) { + startElement("attribute"); + nc.accept(nameClassVisitor); + value.accept(patternVisitor); + endElement(); + } + + public void visitData(Datatype dt) { + startElement("text"); // XXX + endElement(); + } + + public void visitDataExcept(Datatype dt, Pattern except) { + startElement("text"); // XXX + endElement(); + } + + public void visitValue(Datatype dt, Object obj) { + startElement("value"); + // XXX dump dt + // XXX toString will not handle QName + data(obj.toString()); + endElement(); + } + + public void visitText() { + startElement("text"); + endElement(); + } + + public void visitList(Pattern p) { + startElement("list"); + p.accept(groupPatternVisitor); + endElement(); + } + } + + class GroupDumpPatternVisitor extends DumpPatternVisitor { + public void visitGroup(Pattern p1, Pattern p2) { + p1.accept(this); + p2.accept(this); + } + } + + class ChoiceDumpPatternVisitor extends DumpPatternVisitor { + public void visitChoice(Pattern p1, Pattern p2) { + p1.accept(this); + p2.accept(this); + } + } + + class InterleaveDumpPatternVisitor extends DumpPatternVisitor { + public void visitInterleave(Pattern p1, Pattern p2) { + p1.accept(this); + p2.accept(this); + } + } + + + class DumpNameClassVisitor implements NameClassVisitor { + public void visitChoice(NameClass nc1, NameClass nc2) { + startElement("choice"); + nc1.accept(choiceNameClassVisitor); + nc2.accept(choiceNameClassVisitor); + endElement(); + } + + public void visitNsName(String ns) { + startElement("nsName"); + attribute("ns", ns); + endElement(); + } + + public void visitNsNameExcept(String ns, NameClass nc) { + startElement("nsName"); + startElement("except"); + nc.accept(choiceNameClassVisitor); + endElement(); + endElement(); + } + + public void visitAnyName() { + startElement("anyName"); + endElement(); + } + + public void visitAnyNameExcept(NameClass nc) { + startElement("anyName"); + startElement("except"); + nc.accept(choiceNameClassVisitor); + endElement(); + endElement(); + } + + public void visitName(Name name) { + startElement("name"); + attribute("ns", name.getNamespaceUri()); + data(name.getLocalName()); + endElement(); + } + + public void visitError() { + startElement("error"); + endElement(); + } + + public void visitNull() { + visitAnyName(); + } + } + + class ChoiceDumpNameClassVisitor extends DumpNameClassVisitor { + public void visitChoice(NameClass nc1, NameClass nc2) { + nc1.accept(this); + nc2.accept(this); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFunction.java new file mode 100644 index 0000000..92ea93a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFunction.java @@ -0,0 +1,20 @@ +package com.thaiopensource.relaxng.impl; + +interface PatternFunction { + Object caseEmpty(EmptyPattern p); + Object caseNotAllowed(NotAllowedPattern p); + Object caseError(ErrorPattern p); + Object caseGroup(GroupPattern p); + Object caseInterleave(InterleavePattern p); + Object caseChoice(ChoicePattern p); + Object caseOneOrMore(OneOrMorePattern p); + Object caseElement(ElementPattern p); + Object caseAttribute(AttributePattern p); + Object caseData(DataPattern p); + Object caseDataExcept(DataExceptPattern p); + Object caseValue(ValuePattern p); + Object caseText(TextPattern p); + Object caseList(ListPattern p); + Object caseRef(RefPattern p); + Object caseAfter(AfterPattern p); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFuture.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFuture.java new file mode 100644 index 0000000..5e6fadc --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternFuture.java @@ -0,0 +1,10 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.SAXException; +import com.thaiopensource.validate.IncorrectSchemaException; + +import java.io.IOException; + +public interface PatternFuture { + Pattern getPattern(boolean isAttributesPattern) throws IncorrectSchemaException, SAXException, IOException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternInterner.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternInterner.java new file mode 100644 index 0000000..bfa8c6d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternInterner.java @@ -0,0 +1,68 @@ +package com.thaiopensource.relaxng.impl; + + +final class PatternInterner { + private static final int INIT_SIZE = 256; + private static final float LOAD_FACTOR = 0.3f; + private Pattern[] table; + private int used; + private int usedLimit; + + PatternInterner() { + table = null; + used = 0; + usedLimit = 0; + } + + PatternInterner(PatternInterner parent) { + table = parent.table; + if (table != null) + table = (Pattern[])table.clone(); + used = parent.used; + usedLimit = parent.usedLimit; + } + + Pattern intern(Pattern p) { + int h; + + if (table == null) { + table = new Pattern[INIT_SIZE]; + usedLimit = (int)(INIT_SIZE * LOAD_FACTOR); + h = firstIndex(p); + } + else { + for (h = firstIndex(p); table[h] != null; h = nextIndex(h)) { + if (p.samePattern(table[h])) + return table[h]; + } + } + if (used >= usedLimit) { + // rehash + Pattern[] oldTable = table; + table = new Pattern[table.length << 1]; + for (int i = oldTable.length; i > 0;) { + --i; + if (oldTable[i] != null) { + int j; + for (j = firstIndex(oldTable[i]); table[j] != null; j = nextIndex(j)) + ; + table[j] = oldTable[i]; + } + } + for (h = firstIndex(p); table[h] != null; h = nextIndex(h)) + ; + usedLimit = (int)(table.length * LOAD_FACTOR); + } + used++; + table[h] = p; + return p; + } + + private int firstIndex(Pattern p) { + return p.patternHashCode() & (table.length - 1); + } + + private int nextIndex(int i) { + return i == 0 ? table.length - 1 : i - 1; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternMemo.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternMemo.java new file mode 100644 index 0000000..236bdb3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternMemo.java @@ -0,0 +1,193 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.ValidationContext; + +import java.util.Hashtable; + +import com.thaiopensource.xml.util.Name; + +final class PatternMemo { + private final Pattern pattern; + private final ValidatorPatternBuilder builder; + private final boolean notAllowed; + private PatternMemo memoEndAttributes; + private PatternMemo memoTextOnly; + private PatternMemo memoEndTagDeriv; + private PatternMemo memoMixedTextDeriv; + private PatternMemo memoIgnoreMissingAttributes; + private Hashtable startTagOpenDerivMap; + private Hashtable startTagOpenRecoverDerivMap; + private Hashtable startAttributeDerivMap; + private DataDerivType memoDataDerivType; + + PatternMemo(Pattern pattern, ValidatorPatternBuilder builder) { + this.pattern = pattern; + this.builder = builder; + this.notAllowed = pattern.isNotAllowed(); + } + + Pattern getPattern() { + return pattern; + } + + ValidatorPatternBuilder getPatternBuilder() { + return builder; + } + + boolean isNotAllowed() { + return notAllowed; + } + + PatternMemo endAttributes() { + if (memoEndAttributes == null) + memoEndAttributes = applyForPatternMemo(builder.getEndAttributesFunction()); + return memoEndAttributes; + } + + PatternMemo endAttributes(PatternFunction f) { + if (memoEndAttributes == null) + memoEndAttributes = applyForPatternMemo(f); + return memoEndAttributes; + } + + PatternMemo ignoreMissingAttributes() { + if (memoIgnoreMissingAttributes == null) + memoIgnoreMissingAttributes + = applyForPatternMemo(builder.getIgnoreMissingAttributesFunction()); + return memoIgnoreMissingAttributes; + } + + PatternMemo ignoreMissingAttributes(PatternFunction f) { + if (memoIgnoreMissingAttributes == null) + memoIgnoreMissingAttributes = applyForPatternMemo(f); + return memoIgnoreMissingAttributes; + } + + PatternMemo textOnly() { + if (memoTextOnly == null) + memoTextOnly = applyForPatternMemo(builder.getTextOnlyFunction()); + return memoTextOnly; + } + + PatternMemo textOnly(PatternFunction f) { + if (memoTextOnly == null) + memoTextOnly = applyForPatternMemo(f); + return memoTextOnly; + } + + PatternMemo endTagDeriv() { + if (memoEndTagDeriv == null) + memoEndTagDeriv = applyForPatternMemo(builder.getEndTagDerivFunction()); + return memoEndTagDeriv; + } + + PatternMemo endTagDeriv(PatternFunction f) { + if (memoEndTagDeriv == null) + memoEndTagDeriv = applyForPatternMemo(f); + return memoEndTagDeriv; + } + + + PatternMemo mixedTextDeriv() { + if (memoMixedTextDeriv == null) + memoMixedTextDeriv = applyForPatternMemo(builder.getMixedTextDerivFunction()); + return memoMixedTextDeriv; + } + + PatternMemo mixedTextDeriv(PatternFunction f) { + if (memoMixedTextDeriv == null) + memoMixedTextDeriv = applyForPatternMemo(f); + return memoMixedTextDeriv; + } + + PatternMemo startTagOpenDeriv(Name name) { + return startTagOpenDeriv(name, null); + } + + PatternMemo startTagOpenDeriv(StartTagOpenDerivFunction f) { + return startTagOpenDeriv(f.getName(), f); + } + + private PatternMemo startTagOpenDeriv(Name name, StartTagOpenDerivFunction f) { + PatternMemo tem; + if (startTagOpenDerivMap == null) + startTagOpenDerivMap = new Hashtable(); + else { + tem = (PatternMemo)startTagOpenDerivMap.get(name); + if (tem != null) + return tem; + } + if (f == null) + f = new StartTagOpenDerivFunction(name, builder); + tem = applyForPatternMemo(f); + startTagOpenDerivMap.put(name, tem); + return tem; + } + + PatternMemo startTagOpenRecoverDeriv(Name name) { + return startTagOpenRecoverDeriv(name, null); + } + + PatternMemo startTagOpenRecoverDeriv(StartTagOpenRecoverDerivFunction f) { + return startTagOpenRecoverDeriv(f.getName(), f); + } + + private PatternMemo startTagOpenRecoverDeriv(Name name, StartTagOpenRecoverDerivFunction f) { + PatternMemo tem; + if (startTagOpenRecoverDerivMap == null) + startTagOpenRecoverDerivMap = new Hashtable(); + else { + tem = (PatternMemo)startTagOpenRecoverDerivMap.get(name); + if (tem != null) + return tem; + } + if (f == null) + f = new StartTagOpenRecoverDerivFunction(name, builder); + tem = applyForPatternMemo(f); + startTagOpenRecoverDerivMap.put(name, tem); + return tem; + } + + PatternMemo startAttributeDeriv(Name name) { + return startAttributeDeriv(name, null); + } + + PatternMemo startAttributeDeriv(StartAttributeDerivFunction f) { + return startAttributeDeriv(f.getName(), f); + } + + private PatternMemo startAttributeDeriv(Name name, StartAttributeDerivFunction f) { + PatternMemo tem; + if (startAttributeDerivMap == null) + startAttributeDerivMap = new Hashtable(); + else { + tem = (PatternMemo)startAttributeDerivMap.get(name); + if (tem != null) + return tem; + } + if (f == null) + f = new StartAttributeDerivFunction(name, builder); + tem = applyForPatternMemo(f); + startAttributeDerivMap.put(name, tem); + return tem; + } + + DataDerivType dataDerivType() { + if (memoDataDerivType == null) + memoDataDerivType = DataDerivTypeFunction.dataDerivType(builder, pattern).copy(); + return memoDataDerivType; + } + + PatternMemo dataDeriv(String str, ValidationContext vc) { + return dataDerivType().dataDeriv(builder, pattern, str, vc); + } + + PatternMemo recoverAfter() { + // XXX memoize + return applyForPatternMemo(builder.getRecoverAfterFunction()); + } + + private PatternMemo applyForPatternMemo(PatternFunction f) { + return builder.getPatternMemo(pattern.applyForPattern(f)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternSchema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternSchema.java new file mode 100644 index 0000000..3ae8b56 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternSchema.java @@ -0,0 +1,23 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import org.xml.sax.ErrorHandler; + +public class PatternSchema extends AbstractSchema { + private final SchemaPatternBuilder spb; + private final Pattern start; + + public PatternSchema(SchemaPatternBuilder spb, Pattern start, PropertyMap properties) { + super(properties); + this.spb = spb; + this.start = start; + } + + public Validator createValidator(PropertyMap properties) { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + return new PatternValidator(start, new ValidatorPatternBuilder(spb), eh); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternValidator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternValidator.java new file mode 100644 index 0000000..62a144b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternValidator.java @@ -0,0 +1,271 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.relaxng.parse.sax.DtdContext; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import com.thaiopensource.xml.util.Name; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.DTDHandler; +import org.xml.sax.ContentHandler; + +import java.util.Hashtable; + +public class PatternValidator extends DtdContext implements Validator, ContentHandler, DTDHandler { + private final ValidatorPatternBuilder builder; + private final Pattern start; + private final ErrorHandler eh; + private Hashtable recoverPatternTable; + private PatternMemo memo; + private boolean hadError; + private boolean collectingCharacters; + private final StringBuffer charBuf = new StringBuffer(); + private PrefixMapping prefixMapping = new PrefixMapping("xml", WellKnownNamespaces.XML, null); + private Locator locator; + + private static final class PrefixMapping { + private final String prefix; + private final String namespaceURI; + private final PrefixMapping previous; + + PrefixMapping(String prefix, String namespaceURI, PrefixMapping prev) { + this.prefix = prefix; + this.namespaceURI = namespaceURI; + this.previous = prev; + } + + PrefixMapping getPrevious() { + return previous; + } + } + + private void startCollectingCharacters() { + if (!collectingCharacters) { + collectingCharacters = true; + charBuf.setLength(0); + } + } + + private void flushCharacters() throws SAXException { + collectingCharacters = false; + int len = charBuf.length(); + for (int i = 0; i < len; i++) { + switch (charBuf.charAt(i)) { + case ' ': + case '\r': + case '\t': + case '\n': + break; + default: + text(); + return; + } + } + } + + public void startElement(String namespaceURI, + String localName, + String qName, + Attributes atts) throws SAXException { + if (collectingCharacters) + flushCharacters(); + + Name name = new Name(namespaceURI, localName); + if (!setMemo(memo.startTagOpenDeriv(name))) { + PatternMemo next = memo.startTagOpenRecoverDeriv(name); + if (!next.isNotAllowed()) + error("required_elements_missing"); + else { + next = builder.getPatternMemo(builder.makeAfter(findElement(name), memo.getPattern())); + error(next.isNotAllowed() ? "unknown_element" : "out_of_context_element", name); + } + memo = next; + } + int len = atts.getLength(); + for (int i = 0; i < len; i++) { + Name attName = new Name(atts.getURI(i), atts.getLocalName(i)); + + if (!setMemo(memo.startAttributeDeriv(attName))) + error("impossible_attribute_ignored", attName); + else if (!setMemo(memo.dataDeriv(atts.getValue(i), this))) { + error("bad_attribute_value", attName); + memo = memo.recoverAfter(); + } + } + if (!setMemo(memo.endAttributes())) { + // XXX should specify which attributes + error("required_attributes_missing"); + memo = memo.ignoreMissingAttributes(); + } + if (memo.getPattern().getContentType() == Pattern.DATA_CONTENT_TYPE) + startCollectingCharacters(); + } + + private PatternMemo fixAfter(PatternMemo p) { + return builder.getPatternMemo(p.getPattern().applyForPattern(new ApplyAfterFunction(builder) { + Pattern apply(Pattern p) { + return builder.makeEmpty(); + } + })); + } + + public void endElement(String namespaceURI, + String localName, + String qName) throws SAXException { + // The tricky thing here is that the derivative that we compute may be notAllowed simply because the parent + // is notAllowed; we don't want to give an error in this case. + if (collectingCharacters) { + collectingCharacters = false; + if (!setMemo(memo.textOnly())) { + error("only_text_not_allowed"); + memo = memo.recoverAfter(); + return; + } + final String data = charBuf.toString(); + if (!setMemo(memo.dataDeriv(data, this))) { + PatternMemo next = memo.recoverAfter(); + if (!memo.isNotAllowed()) { + if (!next.isNotAllowed() + || fixAfter(memo).dataDeriv(data, this).isNotAllowed()) + error("string_not_allowed"); + } + memo = next; + } + } + else if (!setMemo(memo.endTagDeriv())) { + PatternMemo next = memo.recoverAfter(); + if (!memo.isNotAllowed()) { + if (!next.isNotAllowed() + || fixAfter(memo).endTagDeriv().isNotAllowed()) + error("unfinished_element"); + } + memo = next; + } + } + + public void characters(char ch[], int start, int length) throws SAXException { + if (collectingCharacters) { + charBuf.append(ch, start, length); + return; + } + for (int i = 0; i < length; i++) { + switch (ch[start + i]) { + case ' ': + case '\r': + case '\t': + case '\n': + break; + default: + text(); + return; + } + } + } + + private void text() throws SAXException { + if (!setMemo(memo.mixedTextDeriv())) + error("text_not_allowed"); + } + + public void endDocument() { + // XXX maybe check that memo.isNullable if !hadError + } + + public void setDocumentLocator(Locator loc) { + locator = loc; + } + + public void startDocument() throws SAXException { + if (memo.isNotAllowed()) + error("schema_allows_nothing"); + } + public void processingInstruction(String target, String date) { } + public void skippedEntity(String name) { } + public void ignorableWhitespace(char[] ch, int start, int len) { } + public void startPrefixMapping(String prefix, String uri) { + prefixMapping = new PrefixMapping(prefix, uri, prefixMapping); + } + public void endPrefixMapping(String prefix) { + prefixMapping = prefixMapping.getPrevious(); + } + + public PatternValidator(Pattern pattern, ValidatorPatternBuilder builder, ErrorHandler eh) { + this.start = pattern; + this.builder = builder; + this.eh = eh; + reset(); + } + + public void reset() { + hadError = false; + collectingCharacters = false; + locator = null; + memo = builder.getPatternMemo(start); + prefixMapping = new PrefixMapping("xml", WellKnownNamespaces.XML, null); + clearDtdContext(); + } + + public ContentHandler getContentHandler() { + return this; + } + + public DTDHandler getDTDHandler() { + return this; + } + + private void error(String key) throws SAXException { + if (hadError && memo.isNotAllowed()) + return; + hadError = true; + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key), locator)); + } + + private void error(String key, Name arg) throws SAXException { + error(key, NameFormatter.format(arg)); + } + + private void error(String key, String arg) throws SAXException { + if (hadError && memo.isNotAllowed()) + return; + hadError = true; + eh.error(new SAXParseException(SchemaBuilderImpl.localizer.message(key, arg), locator)); + } + + /* Return false if m is notAllowed. */ + private boolean setMemo(PatternMemo m) { + if (m.isNotAllowed()) + return false; + else { + memo = m; + return true; + } + } + + private Pattern findElement(Name name) { + if (recoverPatternTable == null) + recoverPatternTable = new Hashtable(); + Pattern p = (Pattern)recoverPatternTable.get(name); + if (p == null) { + p = FindElementFunction.findElement(builder, name, start); + recoverPatternTable.put(name, p); + } + return p; + } + + public String resolveNamespacePrefix(String prefix) { + PrefixMapping tem = prefixMapping; + do { + if (tem.prefix.equals(prefix)) + return tem.namespaceURI; + tem = tem.previous; + } while (tem != null); + return null; + } + + public String getBaseUri() { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternVisitor.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternVisitor.java new file mode 100644 index 0000000..d590b35 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/PatternVisitor.java @@ -0,0 +1,20 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; + +public interface PatternVisitor { + void visitEmpty(); + void visitNotAllowed(); + void visitError(); + void visitGroup(Pattern p1, Pattern p2); + void visitInterleave(Pattern p1, Pattern p2); + void visitChoice(Pattern p1, Pattern p2); + void visitOneOrMore(Pattern p); + void visitElement(NameClass nc, Pattern content); + void visitAttribute(NameClass ns, Pattern value); + void visitData(Datatype dt); + void visitDataExcept(Datatype dt, Pattern except); + void visitValue(Datatype dt, Object obj); + void visitText(); + void visitList(Pattern p); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RecoverAfterFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RecoverAfterFunction.java new file mode 100644 index 0000000..765e009 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RecoverAfterFunction.java @@ -0,0 +1,22 @@ +package com.thaiopensource.relaxng.impl; + +class RecoverAfterFunction extends AbstractPatternFunction { + private final ValidatorPatternBuilder builder; + + RecoverAfterFunction(ValidatorPatternBuilder builder) { + this.builder = builder; + } + + public Object caseOther(Pattern p) { + throw new RuntimeException("recover after botch"); + } + + public Object caseChoice(ChoicePattern p) { + return builder.makeChoice(p.getOperand1().applyForPattern(this), + p.getOperand2().applyForPattern(this)); + } + + public Object caseAfter(AfterPattern p) { + return p.getOperand2(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RefPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RefPattern.java new file mode 100644 index 0000000..0a7de03 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RefPattern.java @@ -0,0 +1,105 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +class RefPattern extends Pattern { + private Pattern p; + private Locator refLoc; + private final String name; + private int checkRecursionDepth = -1; + private boolean combineImplicit = false; + private byte combineType = COMBINE_NONE; + private byte replacementStatus = REPLACEMENT_KEEP; + private boolean expanded = false; + + static final byte REPLACEMENT_KEEP = 0; + static final byte REPLACEMENT_REQUIRE = 1; + static final byte REPLACEMENT_IGNORE = 2; + + static final byte COMBINE_NONE = 0; + static final byte COMBINE_CHOICE = 1; + static final byte COMBINE_INTERLEAVE = 2; + + RefPattern(String name) { + this.name = name; + } + + Pattern getPattern() { + return p; + } + + void setPattern(Pattern p) { + this.p = p; + } + + Locator getRefLocator() { + return refLoc; + } + + void setRefLocator(Locator loc) { + this.refLoc = loc; + } + + void checkRecursion(int depth) throws SAXException { + if (checkRecursionDepth == -1) { + checkRecursionDepth = depth; + p.checkRecursion(depth); + checkRecursionDepth = -2; + } + else if (depth == checkRecursionDepth) + // XXX try to recover from this? + throw new SAXParseException(SchemaBuilderImpl.localizer.message("recursive_reference", name), + refLoc); + } + + Pattern expand(SchemaPatternBuilder b) { + if (!expanded) { + p = p.expand(b); + expanded = true; + } + return p; + } + + boolean samePattern(Pattern other) { + return false; + } + + void accept(PatternVisitor visitor) { + p.accept(visitor); + } + + Object apply(PatternFunction f) { + return f.caseRef(this); + } + + byte getReplacementStatus() { + return replacementStatus; + } + + void setReplacementStatus(byte replacementStatus) { + this.replacementStatus = replacementStatus; + } + + boolean isCombineImplicit() { + return combineImplicit; + } + + void setCombineImplicit() { + combineImplicit = true; + } + + byte getCombineType() { + return combineType; + } + + void setCombineType(byte combineType) { + this.combineType = combineType; + } + + String getName() { + return name; + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RestrictionViolationException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RestrictionViolationException.java new file mode 100644 index 0000000..223df74 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/RestrictionViolationException.java @@ -0,0 +1,37 @@ +package com.thaiopensource.relaxng.impl; + +import org.xml.sax.Locator; +import com.thaiopensource.xml.util.Name; + +class RestrictionViolationException extends Exception { + private final String messageId; + private Locator loc; + private Name name; + + RestrictionViolationException(String messageId) { + this.messageId = messageId; + } + + RestrictionViolationException(String messageId, Name name) { + this.messageId = messageId; + this.name = name; + } + + String getMessageId() { + return messageId; + } + + Locator getLocator() { + return loc; + } + + void maybeSetLocator(Locator loc) { + if (this.loc == null) + this.loc = loc; + } + + Name getName() { + return name; + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.java new file mode 100644 index 0000000..970c225 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaBuilderImpl.java @@ -0,0 +1,896 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.Context; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.SubParser; +import com.thaiopensource.relaxng.parse.ParseReceiver; +import com.thaiopensource.relaxng.parse.ParsedPatternFuture; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.xml.util.Name; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.DatatypeLibrary; +import org.relaxng.datatype.DatatypeLibraryFactory; +import org.relaxng.datatype.ValidationContext; +import org.relaxng.datatype.DatatypeBuilder; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; + +import java.util.Enumeration; +import java.util.Hashtable; +import java.io.IOException; + +public class SchemaBuilderImpl implements SchemaBuilder, ElementAnnotationBuilder, CommentList { + private final SchemaBuilderImpl parent; + private boolean hadError = false; + private final SubParser subParser; + private final SchemaPatternBuilder pb; + private final DatatypeLibraryFactory datatypeLibraryFactory; + private final String inheritNs; + private final ErrorHandler eh; + private final OpenIncludes openIncludes; + private final AttributeNameClassChecker attributeNameClassChecker = new AttributeNameClassChecker(); + static final Localizer localizer = new Localizer(SchemaBuilderImpl.class); + + static class OpenIncludes { + final String uri; + final OpenIncludes parent; + + OpenIncludes(String uri, OpenIncludes parent) { + this.uri = uri; + this.parent = parent; + } + } + + static public Pattern parse(Parseable parseable, + ErrorHandler eh, + DatatypeLibraryFactory datatypeLibraryFactory, + SchemaPatternBuilder pb, + boolean isAttributesPattern) + throws IncorrectSchemaException, IOException, SAXException { + try { + SchemaBuilderImpl sb = new SchemaBuilderImpl(parseable, + eh, + new BuiltinDatatypeLibraryFactory(datatypeLibraryFactory), + pb); + ParsedPattern pp = parseable.parse(sb, new RootScope(sb)); + if (isAttributesPattern) + pp = sb.wrapAttributesPattern(pp); + return sb.expandPattern((Pattern)pp); + } + catch (IllegalSchemaException e) { + throw new IncorrectSchemaException(); + } + catch (BuildException e) { + throw unwrapBuildException(e); + } + } + + + static public PatternFuture installHandlers(ParseReceiver parser, XMLReader xr, ErrorHandler eh, DatatypeLibraryFactory dlf, + SchemaPatternBuilder pb) + throws SAXException { + final SchemaBuilderImpl sb = new SchemaBuilderImpl(parser, + eh, + new BuiltinDatatypeLibraryFactory(dlf), + pb); + final ParsedPatternFuture pf = parser.installHandlers(xr, sb, new RootScope(sb)); + return new PatternFuture() { + public Pattern getPattern(boolean isAttributesPattern) throws IncorrectSchemaException, SAXException, IOException { + try { + ParsedPattern pp = pf.getParsedPattern(); + if (isAttributesPattern) + pp = sb.wrapAttributesPattern(pp); + return sb.expandPattern((Pattern)pp); + } + catch (IllegalSchemaException e) { + throw new IncorrectSchemaException(); + } + catch (BuildException e) { + throw unwrapBuildException(e); + } + } + }; + } + + static RuntimeException unwrapBuildException(BuildException e) throws SAXException, IncorrectSchemaException, IOException { + Throwable t = e.getCause(); + if (t instanceof IOException) + throw (IOException)t; + if (t instanceof RuntimeException) + return (RuntimeException)t; + if (t instanceof IllegalSchemaException) + throw new IncorrectSchemaException(); + if (t instanceof SAXException) + throw (SAXException)t; + if (t instanceof Exception) + throw new SAXException((Exception)t); + throw new SAXException(t.getClass().getName() + " thrown"); + } + + private ParsedPattern wrapAttributesPattern(ParsedPattern pattern) { + // XXX where can we get a locator from? + return makeElement(makeAnyName(null, null), pattern, null, null); + } + + private Pattern expandPattern(Pattern pattern) throws IllegalSchemaException, BuildException { + if (!hadError) { + try { + pattern.checkRecursion(0); + pattern = pattern.expand(pb); + pattern.checkRestrictions(Pattern.START_CONTEXT, null, null); + if (!hadError) + return pattern; + } + catch (SAXParseException e) { + error(e); + } + catch (SAXException e) { + throw new BuildException(e); + } + catch (RestrictionViolationException e) { + if (e.getName() != null) + error(e.getMessageId(), NameFormatter.format(e.getName()), e.getLocator()); + else + error(e.getMessageId(), e.getLocator()); + } + } + throw new IllegalSchemaException(); + } + + private SchemaBuilderImpl(SubParser subParser, + ErrorHandler eh, + DatatypeLibraryFactory datatypeLibraryFactory, + SchemaPatternBuilder pb) { + this.parent = null; + this.subParser = subParser; + this.eh = eh; + this.datatypeLibraryFactory = datatypeLibraryFactory; + this.pb = pb; + this.inheritNs = ""; + this.openIncludes = null; + } + + private SchemaBuilderImpl(String inheritNs, + String uri, + SchemaBuilderImpl parent) { + this.parent = parent; + this.subParser = parent.subParser; + this.eh = parent.eh; + this.datatypeLibraryFactory = parent.datatypeLibraryFactory; + this.pb = parent.pb; + this.inheritNs = parent.resolveInherit(inheritNs); + this.openIncludes = new OpenIncludes(uri, parent.openIncludes); + } + + public ParsedPattern makeChoice(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) + throws BuildException { + if (nPatterns <= 0) + throw new IllegalArgumentException(); + Pattern result = (Pattern)patterns[0]; + for (int i = 1; i < nPatterns; i++) + result = pb.makeChoice(result, (Pattern)patterns[i]); + return result; + } + + public ParsedPattern makeInterleave(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) + throws BuildException { + if (nPatterns <= 0) + throw new IllegalArgumentException(); + Pattern result = (Pattern)patterns[0]; + for (int i = 1; i < nPatterns; i++) + result = pb.makeInterleave(result, (Pattern)patterns[i]); + return result; + } + + public ParsedPattern makeGroup(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) + throws BuildException { + if (nPatterns <= 0) + throw new IllegalArgumentException(); + Pattern result = (Pattern)patterns[0]; + for (int i = 1; i < nPatterns; i++) + result = pb.makeGroup(result, (Pattern)patterns[i]); + return result; + } + + public ParsedPattern makeOneOrMore(ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeOneOrMore((Pattern)p); + } + + public ParsedPattern makeZeroOrMore(ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeZeroOrMore((Pattern)p); + } + + public ParsedPattern makeOptional(ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeOptional((Pattern)p); + } + + public ParsedPattern makeList(ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeList((Pattern)p, (Locator)loc); + } + + public ParsedPattern makeMixed(ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeMixed((Pattern)p); + } + + public ParsedPattern makeEmpty(Location loc, Annotations anno) { + return pb.makeEmpty(); + } + + public ParsedPattern makeNotAllowed(Location loc, Annotations anno) { + return pb.makeUnexpandedNotAllowed(); + } + + public ParsedPattern makeText(Location loc, Annotations anno) { + return pb.makeText(); + } + + public ParsedPattern makeErrorPattern() { + return pb.makeError(); + } + + public ParsedNameClass makeErrorNameClass() { + return new ErrorNameClass(); + } + + public ParsedPattern makeAttribute(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + String messageId = attributeNameClassChecker.checkNameClass((NameClass)nc); + if (messageId != null) + error(messageId, (Locator)loc); + return pb.makeAttribute((NameClass)nc, (Pattern)p, (Locator)loc); + } + + public ParsedPattern makeElement(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) + throws BuildException { + return pb.makeElement((NameClass)nc, (Pattern)p, (Locator)loc); + } + + private class DummyDataPatternBuilder implements DataPatternBuilder { + public void addParam(String name, String value, Context context, String ns, Location loc, Annotations anno) + throws BuildException { + } + + public void annotation(ParsedElementAnnotation ea) + throws BuildException { + } + + public ParsedPattern makePattern(Location loc, Annotations anno) + throws BuildException { + return pb.makeError(); + } + + public ParsedPattern makePattern(ParsedPattern except, Location loc, Annotations anno) + throws BuildException { + return pb.makeError(); + } + } + + private class ValidationContextImpl implements ValidationContext { + private final ValidationContext vc; + private final String ns; + + ValidationContextImpl(ValidationContext vc, String ns) { + this.vc = vc; + this.ns = ns.length() == 0 ? null : ns; + } + + public String resolveNamespacePrefix(String prefix) { + String result = prefix.length() == 0 ? ns : vc.resolveNamespacePrefix(prefix); + if (result == INHERIT_NS) { + if (inheritNs.length() == 0) + return null; + return inheritNs; + } + return result; + } + + public String getBaseUri() { + return vc.getBaseUri(); + } + + public boolean isUnparsedEntity(String entityName) { + return vc.isUnparsedEntity(entityName); + } + + public boolean isNotation(String notationName) { + return vc.isNotation(notationName); + } + } + + private class DataPatternBuilderImpl implements DataPatternBuilder { + private final DatatypeBuilder dtb; + DataPatternBuilderImpl(DatatypeBuilder dtb) { + this.dtb = dtb; + } + + public void addParam(String name, String value, Context context, String ns, Location loc, Annotations anno) + throws BuildException { + try { + dtb.addParameter(name, value, new ValidationContextImpl(context, ns)); + } + catch (DatatypeException e) { + String detail = e.getMessage(); + int pos = e.getIndex(); + String displayedParam; + if (pos == DatatypeException.UNKNOWN) + displayedParam = null; + else + displayedParam = displayParam(value, pos); + if (displayedParam != null) { + if (detail != null) + error("invalid_param_detail_display", detail, displayedParam, (Locator)loc); + else + error("invalid_param_display", displayedParam, (Locator)loc); + } + else if (detail != null) + error("invalid_param_detail", detail, (Locator)loc); + else + error("invalid_param", (Locator)loc); + } + } + + public void annotation(ParsedElementAnnotation ea) + throws BuildException { + } + + String displayParam(String value, int pos) { + if (pos < 0) + pos = 0; + else if (pos > value.length()) + pos = value.length(); + return localizer.message("display_param", value.substring(0, pos), value.substring(pos)); + } + + public ParsedPattern makePattern(Location loc, Annotations anno) + throws BuildException { + try { + return pb.makeData(dtb.createDatatype()); + } + catch (DatatypeException e) { + String detail = e.getMessage(); + if (detail != null) + error("invalid_params_detail", detail, (Locator)loc); + else + error("invalid_params", (Locator)loc); + return pb.makeError(); + } + } + + public ParsedPattern makePattern(ParsedPattern except, Location loc, Annotations anno) + throws BuildException { + try { + return pb.makeDataExcept(dtb.createDatatype(), (Pattern)except, (Locator)loc); + } + catch (DatatypeException e) { + String detail = e.getMessage(); + if (detail != null) + error("invalid_params_detail", detail, (Locator)loc); + else + error("invalid_params", (Locator)loc); + return pb.makeError(); + } + } + } + + public DataPatternBuilder makeDataPatternBuilder(String datatypeLibrary, String type, Location loc) + throws BuildException { + DatatypeLibrary dl = datatypeLibraryFactory.createDatatypeLibrary(datatypeLibrary); + if (dl == null) + error("unrecognized_datatype_library", datatypeLibrary, (Locator)loc); + else { + try { + return new DataPatternBuilderImpl(dl.createDatatypeBuilder(type)); + } + catch (DatatypeException e) { + String detail = e.getMessage(); + if (detail != null) + error("unsupported_datatype_detail", datatypeLibrary, type, detail, (Locator)loc); + else + error("unrecognized_datatype", datatypeLibrary, type, (Locator)loc); + } + } + return new DummyDataPatternBuilder(); + } + + public ParsedPattern makeValue(String datatypeLibrary, String type, String value, Context context, String ns, + Location loc, Annotations anno) throws BuildException { + DatatypeLibrary dl = datatypeLibraryFactory.createDatatypeLibrary(datatypeLibrary); + if (dl == null) + error("unrecognized_datatype_library", datatypeLibrary, (Locator)loc); + else { + try { + DatatypeBuilder dtb = dl.createDatatypeBuilder(type); + try { + Datatype dt = dtb.createDatatype(); + Object obj = dt.createValue(value, new ValidationContextImpl(context, ns)); + if (obj != null) + return pb.makeValue(dt, obj); + error("invalid_value", value, (Locator)loc); + } + catch (DatatypeException e) { + String detail = e.getMessage(); + if (detail != null) + error("datatype_requires_param_detail", detail, (Locator)loc); + else + error("datatype_requires_param", (Locator)loc); + } + } + catch (DatatypeException e) { + error("unrecognized_datatype", datatypeLibrary, type, (Locator)loc); + } + } + return pb.makeError(); + } + + static class GrammarImpl implements Grammar, Div, IncludedGrammar { + private final SchemaBuilderImpl sb; + private final Hashtable defines; + private final RefPattern startRef; + private final Scope parent; + + private GrammarImpl(SchemaBuilderImpl sb, Scope parent) { + this.sb = sb; + this.parent = parent; + this.defines = new Hashtable(); + this.startRef = new RefPattern(null); + } + + protected GrammarImpl(SchemaBuilderImpl sb, GrammarImpl g) { + this.sb = sb; + parent = g.parent; + startRef = g.startRef; + defines = g.defines; + } + + public ParsedPattern endGrammar(Location loc, Annotations anno) throws BuildException { + for (Enumeration enumList = defines.keys(); + enumList.hasMoreElements();) { + String name = (String)enumList.nextElement(); + RefPattern rp = (RefPattern)defines.get(name); + if (rp.getPattern() == null) { + sb.error("reference_to_undefined", name, rp.getRefLocator()); + rp.setPattern(sb.pb.makeError()); + } + } + Pattern start = startRef.getPattern(); + if (start == null) { + sb.error("missing_start_element", (Locator)loc); + start = sb.pb.makeError(); + } + return start; + } + + public void endDiv(Location loc, Annotations anno) throws BuildException { + // nothing to do + } + + public ParsedPattern endIncludedGrammar(Location loc, Annotations anno) throws BuildException { + return null; + } + + public void define(String name, GrammarSection.Combine combine, ParsedPattern pattern, Location loc, Annotations anno) + throws BuildException { + define(lookup(name), combine, pattern, loc); + } + + private void define(RefPattern rp, GrammarSection.Combine combine, ParsedPattern pattern, Location loc) + throws BuildException { + switch (rp.getReplacementStatus()) { + case RefPattern.REPLACEMENT_KEEP: + if (combine == null) { + if (rp.isCombineImplicit()) { + if (rp.getName() == null) + sb.error("duplicate_start", (Locator)loc); + else + sb.error("duplicate_define", rp.getName(), (Locator)loc); + } + else + rp.setCombineImplicit(); + } + else { + byte combineType = (combine == COMBINE_CHOICE ? RefPattern.COMBINE_CHOICE : RefPattern.COMBINE_INTERLEAVE); + if (rp.getCombineType() != RefPattern.COMBINE_NONE + && rp.getCombineType() != combineType) { + if (rp.getName() == null) + sb.error("conflict_combine_start", (Locator)loc); + else + sb.error("conflict_combine_define", rp.getName(), (Locator)loc); + } + rp.setCombineType(combineType); + } + Pattern p = (Pattern)pattern; + if (rp.getPattern() == null) + rp.setPattern(p); + else if (rp.getCombineType() == RefPattern.COMBINE_INTERLEAVE) + rp.setPattern(sb.pb.makeInterleave(rp.getPattern(), p)); + else + rp.setPattern(sb.pb.makeChoice(rp.getPattern(), p)); + break; + case RefPattern.REPLACEMENT_REQUIRE: + rp.setReplacementStatus(RefPattern.REPLACEMENT_IGNORE); + break; + case RefPattern.REPLACEMENT_IGNORE: + break; + } + } + + public void topLevelAnnotation(ParsedElementAnnotation ea) throws BuildException { + } + + public void topLevelComment(CommentList comments) throws BuildException { + } + + private RefPattern lookup(String name) { + if (name == START) + return startRef; + return lookup1(name); + } + + private RefPattern lookup1(String name) { + RefPattern p = (RefPattern)defines.get(name); + if (p == null) { + p = new RefPattern(name); + defines.put(name, p); + } + return p; + } + + public ParsedPattern makeRef(String name, Location loc, Annotations anno) throws BuildException { + RefPattern p = lookup1(name); + if (p.getRefLocator() == null && loc != null) + p.setRefLocator((Locator)loc); + return p; + } + + public ParsedPattern makeParentRef(String name, Location loc, Annotations anno) throws BuildException { + if (parent == null) { + sb.error("parent_ref_outside_grammar", (Locator)loc); + return sb.makeErrorPattern(); + } + return parent.makeRef(name, loc, anno); + } + + public Div makeDiv() { + return this; + } + + public Include makeInclude() { + return new IncludeImpl(sb, this); + } + + } + + static class RootScope implements Scope { + private final SchemaBuilderImpl sb; + RootScope(SchemaBuilderImpl sb) { + this.sb = sb; + } + + public ParsedPattern makeParentRef(String name, Location loc, Annotations anno) throws BuildException { + sb.error("parent_ref_outside_grammar", (Locator)loc); + return sb.makeErrorPattern(); + } + public ParsedPattern makeRef(String name, Location loc, Annotations anno) throws BuildException { + sb.error("ref_outside_grammar", (Locator)loc); + return sb.makeErrorPattern(); + } + + } + + static class Override { + Override(RefPattern prp, Override next) { + this.prp = prp; + this.next = next; + } + + final RefPattern prp; + final Override next; + byte replacementStatus; + } + + + private static class IncludeImpl implements Include, Div { + private final SchemaBuilderImpl sb; + private Override overrides; + private final GrammarImpl grammar; + + private IncludeImpl(SchemaBuilderImpl sb, GrammarImpl grammar) { + this.sb = sb; + this.grammar = grammar; + } + + public void define(String name, GrammarSection.Combine combine, ParsedPattern pattern, Location loc, Annotations anno) + throws BuildException { + RefPattern rp = grammar.lookup(name); + overrides = new Override(rp, overrides); + grammar.define(rp, combine, pattern, loc); + } + + public void endDiv(Location loc, Annotations anno) throws BuildException { + // nothing to do + } + + public void topLevelAnnotation(ParsedElementAnnotation ea) throws BuildException { + // nothing to do + } + + public void topLevelComment(CommentList comments) throws BuildException { + } + + public Div makeDiv() { + return this; + } + + public void endInclude(String uri, String ns, + Location loc, Annotations anno) throws BuildException { + for (OpenIncludes inc = sb.openIncludes; + inc != null; + inc = inc.parent) { + if (inc.uri.equals(uri)) { + sb.error("recursive_include", uri, (Locator)loc); + return; + } + } + + for (Override o = overrides; o != null; o = o.next) { + o.replacementStatus = o.prp.getReplacementStatus(); + o.prp.setReplacementStatus(RefPattern.REPLACEMENT_REQUIRE); + } + try { + SchemaBuilderImpl isb = new SchemaBuilderImpl(ns, uri, sb); + sb.subParser.parseInclude(uri, isb, new GrammarImpl(isb, grammar)); + for (Override o = overrides; o != null; o = o.next) { + if (o.prp.getReplacementStatus() == RefPattern.REPLACEMENT_REQUIRE) { + if (o.prp.getName() == null) + sb.error("missing_start_replacement", (Locator)loc); + else + sb.error("missing_define_replacement", o.prp.getName(), (Locator)loc); + } + } + } + catch (IllegalSchemaException e) { + sb.noteError(); + } + finally { + for (Override o = overrides; o != null; o = o.next) + o.prp.setReplacementStatus(o.replacementStatus); + } + } + + public Include makeInclude() { + return null; + } + } + + public Grammar makeGrammar(Scope parent) { + return new GrammarImpl(this, parent); + } + + public ParsedPattern annotate(ParsedPattern p, Annotations anno) throws BuildException { + return p; + } + + public ParsedNameClass annotate(ParsedNameClass nc, Annotations anno) throws BuildException { + return nc; + } + + public ParsedPattern annotateAfter(ParsedPattern p, ParsedElementAnnotation e) throws BuildException { + return p; + } + + public ParsedNameClass annotateAfter(ParsedNameClass nc, ParsedElementAnnotation e) throws BuildException { + return nc; + } + + public ParsedPattern commentAfter(ParsedPattern p, CommentList comments) throws BuildException { + return p; + } + + public ParsedNameClass commentAfter(ParsedNameClass nc, CommentList comments) throws BuildException { + return nc; + } + + public ParsedPattern makeExternalRef(String uri, String ns, Scope scope, + Location loc, Annotations anno) + throws BuildException { + for (OpenIncludes inc = openIncludes; + inc != null; + inc = inc.parent) { + if (inc.uri.equals(uri)) { + error("recursive_include", uri, (Locator)loc); + return pb.makeError(); + } + } + try { + return subParser.parseExternal(uri, new SchemaBuilderImpl(ns, uri, this), scope); + } + catch (IllegalSchemaException e) { + noteError(); + return pb.makeError(); + } + } + + public ParsedNameClass makeChoice(ParsedNameClass[] nameClasses, int nNameClasses, Location loc, Annotations anno) { + if (nNameClasses <= 0) + throw new IllegalArgumentException(); + NameClass result = (NameClass)nameClasses[0]; + for (int i = 1; i < nNameClasses; i++) + result = new ChoiceNameClass(result, (NameClass)nameClasses[i]); + return result; + } + + public ParsedNameClass makeName(String ns, String localName, String prefix, Location loc, Annotations anno) { + return new SimpleNameClass(new Name(resolveInherit(ns), localName)); + } + + public ParsedNameClass makeNsName(String ns, Location loc, Annotations anno) { + return new NsNameClass(resolveInherit(ns)); + } + + public ParsedNameClass makeNsName(String ns, ParsedNameClass except, Location loc, Annotations anno) { + return new NsNameExceptNameClass(resolveInherit(ns), (NameClass)except); + } + + public ParsedNameClass makeAnyName(Location loc, Annotations anno) { + return new AnyNameClass(); + } + + public ParsedNameClass makeAnyName(ParsedNameClass except, Location loc, Annotations anno) { + return new AnyNameExceptNameClass((NameClass)except); + } + + private final String resolveInherit(String ns) { + if (ns == INHERIT_NS) + return inheritNs; + return ns; + } + + private class LocatorImpl implements Locator, Location { + private final String systemId; + private final int lineNumber; + private final int columnNumber; + + private LocatorImpl(String systemId, int lineNumber, int columnNumber) { + this.systemId = systemId; + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + public String getPublicId() { + return null; + } + + public String getSystemId() { + return systemId; + } + + public int getLineNumber() { + return lineNumber; + } + + public int getColumnNumber() { + return columnNumber; + } + } + + public Location makeLocation(String systemId, int lineNumber, int columnNumber) { + return new LocatorImpl(systemId, lineNumber, columnNumber); + } + + public Annotations makeAnnotations(CommentList comments, Context context) { + return this; + } + + public ElementAnnotationBuilder makeElementAnnotationBuilder(String ns, String localName, String prefix, + Location loc, CommentList comments, Context context) { + return this; + } + + public CommentList makeCommentList() { + return this; + } + + public void addComment(String value, Location loc) throws BuildException { + } + + public void addAttribute(String ns, String localName, String prefix, String value, Location loc) { + // nothing needed + } + + public void addElement(ParsedElementAnnotation ea) { + // nothing needed + } + + public void addComment(CommentList comments) throws BuildException { + // nothing needed + } + + public void addLeadingComment(CommentList comments) throws BuildException { + // nothing needed + } + + public void addText(String value, Location loc, CommentList comments) { + // nothing needed + } + + public ParsedElementAnnotation makeElementAnnotation() { + return null; + } + + public boolean usesComments() { + return false; + } + + private void error(SAXParseException message) throws BuildException { + noteError(); + try { + if (eh != null) + eh.error(message); + } + catch (SAXException e) { + throw new BuildException(e); + } + } + + /* + private void warning(SAXParseException message) throws BuildException { + try { + if (eh != null) + eh.warning(message); + } + catch (SAXException e) { + throw new BuildException(e); + } + } + */ + + private void error(String key, Locator loc) throws BuildException { + error(new SAXParseException(localizer.message(key), loc)); + } + + private void error(String key, String arg, Locator loc) throws BuildException { + error(new SAXParseException(localizer.message(key, arg), loc)); + } + + private void error(String key, String arg1, String arg2, Locator loc) throws BuildException { + error(new SAXParseException(localizer.message(key, arg1, arg2), loc)); + } + + private void error(String key, String arg1, String arg2, String arg3, Locator loc) throws BuildException { + error(new SAXParseException(localizer.message(key, new Object[]{arg1, arg2, arg3}), loc)); + } + private void noteError() { + if (!hadError && parent != null) + parent.noteError(); + hadError = true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaPatternBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaPatternBuilder.java new file mode 100644 index 0000000..65a239a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaPatternBuilder.java @@ -0,0 +1,90 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.xml.sax.Locator; + +public class SchemaPatternBuilder extends PatternBuilder { + private boolean idTypes; + private final UnexpandedNotAllowedPattern unexpandedNotAllowed = new UnexpandedNotAllowedPattern(); + private final TextPattern text = new TextPattern(); + private final PatternInterner schemaInterner = new PatternInterner(); + + public SchemaPatternBuilder() { } + + public boolean hasIdTypes() { + return idTypes; + } + + Pattern makeElement(NameClass nameClass, Pattern content, Locator loc) { + Pattern p = new ElementPattern(nameClass, content, loc); + return schemaInterner.intern(p); + } + + Pattern makeAttribute(NameClass nameClass, Pattern value, Locator loc) { + if (value == notAllowed) + return value; + Pattern p = new AttributePattern(nameClass, value, loc); + return schemaInterner.intern(p); + } + + Pattern makeData(Datatype dt) { + noteDatatype(dt); + Pattern p = new DataPattern(dt); + return schemaInterner.intern(p); + } + + Pattern makeDataExcept(Datatype dt, Pattern except, Locator loc) { + noteDatatype(dt); + Pattern p = new DataExceptPattern(dt, except, loc); + return schemaInterner.intern(p); + } + + Pattern makeValue(Datatype dt, Object obj) { + noteDatatype(dt); + Pattern p = new ValuePattern(dt, obj); + return schemaInterner.intern(p); + } + + Pattern makeText() { + return text; + } + + Pattern makeOneOrMore(Pattern p) { + if (p == text) + return p; + return super.makeOneOrMore(p); + } + + Pattern makeUnexpandedNotAllowed() { + return unexpandedNotAllowed; + } + + Pattern makeError() { + Pattern p = new ErrorPattern(); + return schemaInterner.intern(p); + } + + Pattern makeChoice(Pattern p1, Pattern p2) { + if (p1 == notAllowed || p1 == p2) + return p2; + if (p2 == notAllowed) + return p1; + return super.makeChoice(p1, p2); + } + + Pattern makeList(Pattern p, Locator loc) { + if (p == notAllowed) + return p; + Pattern p1 = new ListPattern(p, loc); + return schemaInterner.intern(p1); + } + + Pattern makeMixed(Pattern p) { + return makeInterleave(text, p); + } + + private void noteDatatype(Datatype dt) { + if (dt.getIdType() != Datatype.ID_TYPE_NULL) + idTypes = true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReaderImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReaderImpl.java new file mode 100644 index 0000000..b0c3288 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReaderImpl.java @@ -0,0 +1,72 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.nrl.NrlSchemaReceiverFactory; +import com.thaiopensource.validate.nrl.NrlProperty; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.relaxng.datatype.DatatypeLibraryFactory; +import org.relaxng.datatype.helpers.DatatypeLibraryLoader; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; + +public abstract class SchemaReaderImpl implements SchemaReader { + private static final PropertyId[] supportedPropertyIds = { + ValidateProperty.XML_READER_CREATOR, + ValidateProperty.ERROR_HANDLER, + RngProperty.DATATYPE_LIBRARY_FACTORY, + RngProperty.CHECK_ID_IDREF, + RngProperty.FEASIBLE, + NrlProperty.ATTRIBUTES_SCHEMA, + }; + + public Schema createSchema(InputSource in, PropertyMap properties) + throws IOException, SAXException, IncorrectSchemaException { + SchemaPatternBuilder spb = new SchemaPatternBuilder(); + XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties); + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + DatatypeLibraryFactory dlf = RngProperty.DATATYPE_LIBRARY_FACTORY.get(properties); + if (dlf == null) + dlf = new DatatypeLibraryLoader(); + Pattern start = SchemaBuilderImpl.parse(createParseable(xrc, in, eh), eh, dlf, spb, + properties.contains(NrlProperty.ATTRIBUTES_SCHEMA)); + return wrapPattern(start, spb, properties); + } + + public Option getOption(String uri) { + return RngProperty.getOption(uri); + } + + static Schema wrapPattern(Pattern start, SchemaPatternBuilder spb, PropertyMap properties) throws SAXException, IncorrectSchemaException { + properties = AbstractSchema.filterProperties(properties, supportedPropertyIds); + if (properties.contains(RngProperty.FEASIBLE)) + start = FeasibleTransform.transform(spb, start); + Schema schema = new PatternSchema(spb, start, properties); + if (spb.hasIdTypes() && properties.contains(RngProperty.CHECK_ID_IDREF)) { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + IdTypeMap idTypeMap = new IdTypeMapBuilder(eh, start).getIdTypeMap(); + if (idTypeMap == null) + throw new IncorrectSchemaException(); + Schema idSchema; + if (properties.contains(RngProperty.FEASIBLE)) + idSchema = new FeasibleIdTypeMapSchema(idTypeMap, properties); + else + idSchema = new IdTypeMapSchema(idTypeMap, properties); + schema = new CombineSchema(schema, idSchema, properties); + } + return schema; + } + + protected abstract Parseable createParseable(XMLReaderCreator xrc, InputSource in, ErrorHandler eh); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.java new file mode 100644 index 0000000..47c1b3d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SchemaReceiverImpl.java @@ -0,0 +1,50 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.validate.nrl.NrlSchemaReceiverFactory; +import com.thaiopensource.validate.nrl.NrlProperty; +import com.thaiopensource.validate.auto.SchemaFuture; +import com.thaiopensource.relaxng.parse.ParseReceiver; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.util.PropertyMap; +import org.relaxng.datatype.DatatypeLibraryFactory; +import org.relaxng.datatype.helpers.DatatypeLibraryLoader; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; + +public class SchemaReceiverImpl implements SchemaReceiver { + private final ParseReceiver parser; + private final PropertyMap properties; + + public SchemaReceiverImpl(ParseReceiver parser, PropertyMap properties) { + this.parser = parser; + this.properties = properties; + } + + public SchemaFuture installHandlers(XMLReader xr) throws SAXException { + final SchemaPatternBuilder pb = new SchemaPatternBuilder(); + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + DatatypeLibraryFactory dlf = RngProperty.DATATYPE_LIBRARY_FACTORY.get(properties); + if (dlf == null) + dlf = new DatatypeLibraryLoader(); + final PatternFuture pf = SchemaBuilderImpl.installHandlers(parser, xr, eh, dlf, pb); + return new SchemaFuture() { + public Schema getSchema() throws IncorrectSchemaException, SAXException, IOException { + return SchemaReaderImpl.wrapPattern(pf.getPattern(properties.contains(NrlProperty.ATTRIBUTES_SCHEMA)), + pb, properties); + } + public RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException { + if (e instanceof BuildException) + return SchemaBuilderImpl.unwrapBuildException((BuildException)e); + return e; + } + }; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SimpleNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SimpleNameClass.java new file mode 100644 index 0000000..b0aca62 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SimpleNameClass.java @@ -0,0 +1,44 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + + +class SimpleNameClass implements NameClass { + + private final Name name; + + SimpleNameClass(Name name) { + this.name = name; + } + + public boolean contains(Name name) { + return this.name.equals(name); + } + + public int containsSpecificity(Name name) { + return contains(name) ? SPECIFICITY_NAME : SPECIFICITY_NONE; + } + + public int hashCode() { + return name.hashCode(); + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof SimpleNameClass)) + return false; + SimpleNameClass other = (SimpleNameClass)obj; + return name.equals(other.name); + } + + Name getName() { + return name; + } + + public void accept(NameClassVisitor visitor) { + visitor.visitName(name); + } + + public boolean isOpen() { + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SingleDataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SingleDataDerivType.java new file mode 100644 index 0000000..2b485b0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/SingleDataDerivType.java @@ -0,0 +1,26 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.ValidationContext; + +/** + * DerivType for a Pattern whose derivative wrt any data is always the same. + */ +class SingleDataDerivType extends DataDerivType { + private PatternMemo memo; + + SingleDataDerivType() { } + + PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) { + if (memo == null) + memo = super.dataDeriv(builder, p, str, vc); + return memo; + } + + DataDerivType copy() { + return new SingleDataDerivType(); + } + + DataDerivType combine(DataDerivType ddt) { + return ddt; + } +} \ No newline at end of file diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.java new file mode 100644 index 0000000..8c33f18 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartAttributeDerivFunction.java @@ -0,0 +1,40 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class StartAttributeDerivFunction extends StartTagOpenDerivFunction { + StartAttributeDerivFunction(Name name, ValidatorPatternBuilder builder) { + super(name, builder); + } + + public Object caseElement(ElementPattern p) { + return getPatternBuilder().makeNotAllowed(); + } + + public Object caseGroup(GroupPattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + return getPatternBuilder().makeChoice( + memoApply(p1).applyForPattern(new ApplyAfterFunction(getPatternBuilder()) { + Pattern apply(Pattern x) { + return getPatternBuilder().makeGroup(x, p2); + } + }), + memoApply(p2).applyForPattern(new ApplyAfterFunction(getPatternBuilder()) { + Pattern apply(Pattern x) { + return getPatternBuilder().makeGroup(p1, x); + } + })); + } + + public Object caseAttribute(AttributePattern p) { + if (!p.getNameClass().contains(getName())) + return getPatternBuilder().makeNotAllowed(); + return getPatternBuilder().makeAfter(p.getContent(), + getPatternBuilder().makeEmpty()); + } + + PatternMemo apply(PatternMemo memo) { + return memo.startAttributeDeriv(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.java new file mode 100644 index 0000000..8eebf44 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenDerivFunction.java @@ -0,0 +1,95 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class StartTagOpenDerivFunction extends AbstractPatternFunction { + private final Name name; + private final ValidatorPatternBuilder builder; + + StartTagOpenDerivFunction(Name name, ValidatorPatternBuilder builder) { + this.name = name; + this.builder = builder; + } + + public Object caseChoice(ChoicePattern p) { + return builder.makeChoice(memoApply(p.getOperand1()), + memoApply(p.getOperand2())); + } + + public Object caseGroup(GroupPattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + Pattern tem = memoApply(p1).applyForPattern( + new ApplyAfterFunction(builder) { + Pattern apply(Pattern x) { + return builder.makeGroup(x, p2); + } + }); + return p1.isNullable() ? builder.makeChoice(tem, memoApply(p2)) : tem; + } + + public Object caseInterleave(InterleavePattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + return builder.makeChoice( + memoApply(p1).applyForPattern(new ApplyAfterFunction(builder) { + Pattern apply(Pattern x) { + return builder.makeInterleave(x, p2); + } + }), + memoApply(p2).applyForPattern(new ApplyAfterFunction(builder) { + Pattern apply(Pattern x) { + return builder.makeInterleave(p1, x); + } + })); + } + + public Object caseAfter(AfterPattern p) { + final Pattern p1 = p.getOperand1(); + final Pattern p2 = p.getOperand2(); + return memoApply(p1).applyForPattern( + new ApplyAfterFunction(builder) { + Pattern apply(Pattern x) { + return builder.makeAfter(x, p2); + } + }); + } + + public Object caseOneOrMore(final OneOrMorePattern p) { + final Pattern p1 = p.getOperand(); + return memoApply(p1).applyForPattern( + new ApplyAfterFunction(builder) { + Pattern apply(Pattern x) { + return builder.makeGroup(x, + builder.makeOptional(p)); + } + }); + } + + + public Object caseElement(ElementPattern p) { + if (!p.getNameClass().contains(name)) + return builder.makeNotAllowed(); + return builder.makeAfter(p.getContent(), builder.makeEmpty()); + } + + public Object caseOther(Pattern p) { + return builder.makeNotAllowed(); + } + + final Pattern memoApply(Pattern p) { + return apply(builder.getPatternMemo(p)).getPattern(); + } + + PatternMemo apply(PatternMemo memo) { + return memo.startTagOpenDeriv(this); + } + + Name getName() { + return name; + } + + ValidatorPatternBuilder getPatternBuilder() { + return builder; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.java new file mode 100644 index 0000000..c74474d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StartTagOpenRecoverDerivFunction.java @@ -0,0 +1,20 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.xml.util.Name; + +class StartTagOpenRecoverDerivFunction extends StartTagOpenDerivFunction { + StartTagOpenRecoverDerivFunction(Name name, ValidatorPatternBuilder builder) { + super(name, builder); + } + + public Object caseGroup(GroupPattern p) { + Pattern tem = (Pattern)super.caseGroup(p); + if (p.getOperand1().isNullable()) + return tem; + return getPatternBuilder().makeChoice(tem, memoApply(p.getOperand2())); + } + + PatternMemo apply(PatternMemo memo) { + return memo.startTagOpenRecoverDeriv(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringDatatype.java new file mode 100644 index 0000000..36dd7d3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringDatatype.java @@ -0,0 +1,46 @@ +package com.thaiopensource.relaxng.impl; + +import com.thaiopensource.datatype.Datatype2; +import org.relaxng.datatype.DatatypeException; +import org.relaxng.datatype.DatatypeStreamingValidator; +import org.relaxng.datatype.ValidationContext; +import org.relaxng.datatype.helpers.StreamingValidatorImpl; + +class StringDatatype implements Datatype2 { + public boolean isValid(String str, ValidationContext vc) { + return true; + } + + public void checkValid(String str, ValidationContext vc) throws DatatypeException { + if (!isValid(str, vc)) + throw new DatatypeException(); + } + + public Object createValue(String str, ValidationContext vc) { + return str; + } + + public boolean isContextDependent() { + return false; + } + + public boolean alwaysValid() { + return true; + } + + public int getIdType() { + return ID_TYPE_NULL; + } + + public boolean sameValue(Object obj1, Object obj2) { + return obj1.equals(obj2); + } + + public int valueHashCode(Object obj) { + return obj.hashCode(); + } + + public DatatypeStreamingValidator createStreamingValidator(ValidationContext vc) { + return new StreamingValidatorImpl(this, vc); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringNormalizer.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringNormalizer.java new file mode 100644 index 0000000..88650c5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringNormalizer.java @@ -0,0 +1,15 @@ +package com.thaiopensource.relaxng.impl; + +import java.util.StringTokenizer; + +class StringNormalizer { + static String normalize(String s) { + StringBuffer buf = new StringBuffer(); + for (StringTokenizer e = new StringTokenizer(s); e.hasMoreElements();) { + if (buf.length() > 0) + buf.append(' '); + buf.append((String)e.nextElement()); + } + return buf.toString(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringPattern.java new file mode 100644 index 0000000..6bbc3d0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/StringPattern.java @@ -0,0 +1,7 @@ +package com.thaiopensource.relaxng.impl; + +abstract class StringPattern extends Pattern { + StringPattern(int hc) { + super(false, DATA_CONTENT_TYPE, hc); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextOnlyFunction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextOnlyFunction.java new file mode 100644 index 0000000..452d7a2 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextOnlyFunction.java @@ -0,0 +1,19 @@ +package com.thaiopensource.relaxng.impl; + +class TextOnlyFunction extends EndAttributesFunction { + TextOnlyFunction(ValidatorPatternBuilder builder) { + super(builder); + } + public Object caseAttribute(AttributePattern p) { + return p; + } + public Object caseElement(ElementPattern p) { + return getPatternBuilder().makeNotAllowed(); + } + + PatternMemo apply(PatternMemo memo) { + return memo.textOnly(this); + } + +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextPattern.java new file mode 100644 index 0000000..489c320 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TextPattern.java @@ -0,0 +1,32 @@ +package com.thaiopensource.relaxng.impl; + +class TextPattern extends Pattern { + TextPattern() { + super(true, MIXED_CONTENT_TYPE, TEXT_HASH_CODE); + } + + boolean samePattern(Pattern other) { + return other instanceof TextPattern; + } + + void accept(PatternVisitor visitor) { + visitor.visitText(); + } + + Object apply(PatternFunction f) { + return f.caseText(this); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case DATA_EXCEPT_CONTEXT: + throw new RestrictionViolationException("data_except_contains_text"); + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_text"); + case LIST_CONTEXT: + throw new RestrictionViolationException("list_contains_text"); + } + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TokenDatatype.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TokenDatatype.java new file mode 100644 index 0000000..7b8f04c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/TokenDatatype.java @@ -0,0 +1,9 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.ValidationContext; + +class TokenDatatype extends StringDatatype { + public Object createValue(String str, ValidationContext vc) { + return StringNormalizer.normalize(str); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.java new file mode 100644 index 0000000..e53deeb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/UnexpandedNotAllowedPattern.java @@ -0,0 +1,12 @@ +package com.thaiopensource.relaxng.impl; + +class UnexpandedNotAllowedPattern extends NotAllowedPattern { + UnexpandedNotAllowedPattern() { + } + boolean isNotAllowed() { + return false; + } + Pattern expand(SchemaPatternBuilder b) { + return b.makeNotAllowed(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder.java new file mode 100644 index 0000000..13c02fa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValidatorPatternBuilder.java @@ -0,0 +1,141 @@ +package com.thaiopensource.relaxng.impl; + +import java.util.Hashtable; + +public class ValidatorPatternBuilder extends PatternBuilder { + private final Hashtable patternMemoMap = new Hashtable(); + private final PatternFunction endAttributesFunction; + private final PatternFunction ignoreMissingAttributesFunction; + private final PatternFunction endTagDerivFunction; + private final PatternFunction mixedTextDerivFunction; + private final PatternFunction textOnlyFunction; + private final PatternFunction recoverAfterFunction; + private final PatternFunction dataDerivTypeFunction; + + private final Hashtable choiceMap = new Hashtable(); + private final PatternFunction removeChoicesFunction = new RemoveChoicesFunction(); + private final PatternFunction noteChoicesFunction = new NoteChoicesFunction(); + + private class NoteChoicesFunction extends AbstractPatternFunction { + public Object caseOther(Pattern p) { + choiceMap.put(p, p); + return null; + } + + public Object caseChoice(ChoicePattern p) { + p.getOperand1().apply(this); + p.getOperand2().apply(this); + return null; + } + } + + private class RemoveChoicesFunction extends AbstractPatternFunction { + public Object caseOther(Pattern p) { + if (choiceMap.get(p) != null) + return notAllowed; + return p; + } + + public Object caseChoice(ChoicePattern p) { + Pattern p1 = p.getOperand1().applyForPattern(this); + Pattern p2 = p.getOperand2().applyForPattern(this); + if (p1 == p.getOperand1() && p2 == p.getOperand2()) + return p; + if (p1 == notAllowed) + return p2; + if (p2 == notAllowed) + return p1; + Pattern p3 = new ChoicePattern(p1, p2); + return interner.intern(p3); + } + } + + public ValidatorPatternBuilder(PatternBuilder builder) { + super(builder); + endAttributesFunction = new EndAttributesFunction(this); + ignoreMissingAttributesFunction = new IgnoreMissingAttributesFunction(this); + endTagDerivFunction = new EndTagDerivFunction(this); + mixedTextDerivFunction = new MixedTextDerivFunction(this); + textOnlyFunction = new TextOnlyFunction(this); + recoverAfterFunction = new RecoverAfterFunction(this); + dataDerivTypeFunction = new DataDerivTypeFunction(this); + } + + PatternMemo getPatternMemo(Pattern p) { + PatternMemo memo = (PatternMemo)patternMemoMap.get(p); + if (memo == null) { + memo = new PatternMemo(p, this); + patternMemoMap.put(p, memo); + } + return memo; + } + + PatternFunction getEndAttributesFunction() { + return endAttributesFunction; + } + + PatternFunction getIgnoreMissingAttributesFunction() { + return ignoreMissingAttributesFunction; + } + + PatternFunction getEndTagDerivFunction() { + return endTagDerivFunction; + } + + PatternFunction getMixedTextDerivFunction() { + return mixedTextDerivFunction; + } + + PatternFunction getTextOnlyFunction() { + return textOnlyFunction; + } + + PatternFunction getRecoverAfterFunction() { + return recoverAfterFunction; + } + + PatternFunction getDataDerivTypeFunction() { + return dataDerivTypeFunction; + } + + Pattern makeAfter(Pattern p1, Pattern p2) { + Pattern p = new AfterPattern(p1, p2); + return interner.intern(p); + } + + Pattern makeChoice(Pattern p1, Pattern p2) { + if (p1 == p2) + return p1; + if (p1 == notAllowed) + return p2; + if (p2 == notAllowed) + return p1; + if (!(p1 instanceof ChoicePattern)) { + if (p2.containsChoice(p1)) + return p2; + } + else if (!(p2 instanceof ChoicePattern)) { + if (p1.containsChoice(p2)) + return p1; + } + else { + p1.apply(noteChoicesFunction); + p2 = p2.applyForPattern(removeChoicesFunction); + if (choiceMap.size() > 0) + choiceMap.clear(); + } + if (p1 instanceof AfterPattern && p2 instanceof AfterPattern) { + AfterPattern ap1 = (AfterPattern)p1; + AfterPattern ap2 = (AfterPattern)p2; + if (ap1.getOperand1() == ap2.getOperand1()) + return makeAfter(ap1.getOperand1(), makeChoice(ap1.getOperand2(), ap2.getOperand2())); + if (ap1.getOperand1() == notAllowed) + return ap2; + if (ap2.getOperand1() == notAllowed) + return ap1; + if (ap1.getOperand2() == ap2.getOperand2()) + return makeAfter(makeChoice(ap1.getOperand1(), ap2.getOperand1()), ap1.getOperand2()); + } + return super.makeChoice(p1, p2); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValueDataDerivType.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValueDataDerivType.java new file mode 100644 index 0000000..989bfaf --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValueDataDerivType.java @@ -0,0 +1,55 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; +import org.relaxng.datatype.ValidationContext; + +import java.util.Hashtable; + +class ValueDataDerivType extends DataDerivType { + private final Datatype dt; + private PatternMemo noValue; + private Hashtable valueTable; + + ValueDataDerivType(Datatype dt) { + this.dt = dt; + } + + DataDerivType copy() { + return new ValueDataDerivType(dt); + } + + PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) { + Object value = dt.createValue(str, vc); + if (value == null) { + if (noValue == null) + noValue = super.dataDeriv(builder, p, str, vc); + return noValue; + } + else { + DatatypeValue dtv = new DatatypeValue(value, dt); + if (valueTable == null) + valueTable = new Hashtable(); + PatternMemo tem = (PatternMemo)valueTable.get(dtv); + if (tem == null) { + tem = super.dataDeriv(builder, p, str, vc); + valueTable.put(dtv, tem); + } + return tem; + } + } + + DataDerivType combine(DataDerivType ddt) { + if (ddt instanceof ValueDataDerivType) { + if (((ValueDataDerivType)ddt).dt == this.dt) + return this; + else + return InconsistentDataDerivType.getInstance(); + } + else + return ddt.combine(this); + } + + Datatype getDatatype() { + return dt; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValuePattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValuePattern.java new file mode 100644 index 0000000..1e33d49 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/ValuePattern.java @@ -0,0 +1,48 @@ +package com.thaiopensource.relaxng.impl; + +import org.relaxng.datatype.Datatype; + +class ValuePattern extends StringPattern { + private final Object obj; + private final Datatype dt; + + ValuePattern(Datatype dt, Object obj) { + super(combineHashCode(VALUE_HASH_CODE, obj.hashCode())); + this.dt = dt; + this.obj = obj; + } + + boolean samePattern(Pattern other) { + if (getClass() != other.getClass()) + return false; + if (!(other instanceof ValuePattern)) + return false; + return (dt.equals(((ValuePattern)other).dt) + && dt.sameValue(obj, ((ValuePattern)other).obj)); + } + + void accept(PatternVisitor visitor) { + visitor.visitValue(dt, obj); + } + + Object apply(PatternFunction f) { + return f.caseValue(this); + } + + void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) + throws RestrictionViolationException { + switch (context) { + case START_CONTEXT: + throw new RestrictionViolationException("start_contains_value"); + } + } + + Datatype getDatatype() { + return dt; + } + + Object getValue() { + return obj; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/resources/Messages.properties new file mode 100644 index 0000000..0a30b04 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/impl/resources/Messages.properties @@ -0,0 +1,102 @@ +# Properties file specifying messages +illegal_href_attribute=illegal \"href\" attribute +ns_attribute_ignored=\"ns\" attribute ignored +reference_to_undefined=reference to undefined pattern \"{0}\" +missing_start_element=missing \"start\" element +recursive_reference=bad recursive reference to pattern \"{0}\" +recursive_include=recursive inclusion of URL \"{0}\" +duplicate_define=multiple definitions of \"{0}\" without \"combine\" attribute +duplicate_start=multiple definitions of start without \"combine\" attribute +conflict_combine_define=conflicting values of \"combine\" attribute for definition of \"{0}\" +conflict_combine_start=conflicting values of \"combine\" attribute for definition of start +missing_start_replacement=\"start\" in \"include\" does not override anything +missing_define_replacement=definition of \"{0}\" in \"include\" does not override anything +interleave_string=interleave of \"string\" or \"data\" element +group_string=group of \"string\" or \"data\" element +one_or_more_string=repeat of \"string\" or \"data\" element +unrecognized_datatype=datatype \"{1}\" from library \"{0}\" not recognized +unsupported_datatype_detail=datatype \"{1}\" from library \"{0}\" not supported: {2} +unrecognized_datatype_library=datatype library \"{0}\" not recognized +unrecognized_builtin_datatype=no such builtin datatype \"{0}\": must be \"string\" or \"token\" +invalid_value=\"{0}\" is not a valid value of the datatype +parent_ref_outside_grammar=reference to non-existent parent grammar +ref_outside_grammar=reference to non-existent grammar +expected_one_name_class=found \"{0}\" element but expected no further content +builtin_param=builtin datatypes do not have any parameters +invalid_param_display=invalid parameter:\n{0} +invalid_param_detail_display=invalid parameter: {0}:\n{1} +display_param={0}>>>>{1} +invalid_param_detail=invalid parameter: {0} +invalid_param=invalid parameter +invalid_params_detail=invalid parameters: {0} +invalid_params=invalid parameters +datatype_requires_parameter=datatype cannot be used without parameters +datatype_requires_parameter_detail=datatype cannot be used without parameters: {0} + +attribute_contains_attribute=\"attribute\" contains \"attribute\" +attribute_contains_element=\"attribute\" contains \"element\" +data_except_contains_attribute=\"except\" in \"data\" contains \"attribute\" +data_except_contains_element=\"except\" in \"data\" contains \"element\" +data_except_contains_empty=\"except\" in \"data\" contains \"empty\" +data_except_contains_group=\"except\" in \"data\" contains \"group\" +data_except_contains_interleave=\"except\" in \"data\" contains \"interleave\" +data_except_contains_list=\"except\" in \"data\" contains \"list\" +data_except_contains_one_or_more=\"except\" in \"data\" contains \"oneOrMore\" +data_except_contains_text=\"except\" in \"data\" contains \"text\" +list_contains_attribute=\"list\" contains \"attribute\" +list_contains_element=\"list\" contains \"element\" +list_contains_list=\"list\" contains \"list\" +list_contains_text=\"list\" contains \"text\" +one_or_more_contains_group_contains_attribute=\"oneOrMore\" contains \"group\" contains \"attribute\" +one_or_more_contains_interleave_contains_attribute=\"oneOrMore\" contains \"interleave\" contains \"attribute\" +start_contains_attribute=\"start\" contains \"attribute\" +start_contains_data=\"start\" contains \"data\" +start_contains_empty=\"start\" contains \"empty\" +start_contains_group=\"start\" contains \"group\" +start_contains_interleave=\"start\" contains \"interleave\" +start_contains_list=\"start\" contains \"list\" +start_contains_one_or_more=\"start\" contains \"oneOrMore\" +start_contains_text=\"start\" contains \"text\" +start_contains_value=\"start\" contains \"value\" +duplicate_attribute=duplicate attribute +duplicate_attribute_detail=duplicate attribute {0} +interleave_element_overlap=overlapping element names in operands of \"interleave\" +list_contains_interleave=\"list\" contains \"interleave\" +interleave_text_overlap=both operands of \"interleave\" contain \"text\" +open_name_class_not_repeated=attribute using \"nsName\" or \"anyName\" must be in \"oneOrMore\" +xmlns_uri_attribute=attribute must not have namespace URI \"http://www.w3.org/2000/xmlns\" +xmlns_attribute=attribute must not be named \"xmlns\" + +# Validation errors +unknown_element=unknown element {0} +required_elements_missing=required elements missing +out_of_context_element=element {0} not allowed in this context +impossible_attribute_ignored=attribute {0} not allowed at this point; ignored +bad_attribute_value=bad value for attribute {0} +required_attributes_missing=required attributes missing +unfinished_element=unfinished element +text_not_allowed=text not allowed here +document_incomplete=document incompletely matched +string_not_allowed=bad character content for element +only_text_not_allowed=element cannot have content that consists only of text +schema_allows_nothing=schema does not allow anything: it is equivalent to + +# ID correctness errors +id_element_name_class=an \"element\" pattern containing an \"attribute\" pattern with a non-null ID-type must have a name class that contains only \"choice\" and \"name\" elements +id_attribute_name_class=an \"attribute\" pattern with a non-null ID-type must have a name class that is a single name +id_parent=a \"data\" or \"value\" pattern with non-null ID-type must occur as the child of an \"attribute\" pattern +id_type_conflict=conflicting ID-types for attribute {1} of element {0} + +# ID soundness errors +id_no_tokens=value of attribute of type ID contained no tokens +id_multiple_tokens=value of attribute of type ID contained multiple tokens +idref_no_tokens=value of attribute of type IDREF contained no tokens +idref_multiple_tokens=value of attribute of type IDREF contained multiple tokens +idrefs_no_tokens=value of attribute of type IDREFS contained no tokens +missing_id=IDREF \"{0}\" without matching ID +duplicate_id=ID \"{0}\" has already been defined +first_id=first occurrence of ID \"{0}\" + +# Fragments +name_absent_namespace=\"{0}\" +name_with_namespace=\"{1}\" from namespace \"{0}\" \ No newline at end of file diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Annotations.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Annotations.java new file mode 100644 index 0000000..2f02c25 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Annotations.java @@ -0,0 +1,15 @@ +package com.thaiopensource.relaxng.parse; + +/** + * Includes attributes and child elements before any RELAX NG element. + */ +public interface Annotations { + void addAttribute(String ns, String localName, String prefix, String value, Location loc) + throws BuildException; + void addElement(ParsedElementAnnotation ea) throws BuildException; + /** + * Adds comments following the last initial child element annotation. + */ + void addComment(CommentList comments) throws BuildException; + void addLeadingComment(CommentList comments) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/BuildException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/BuildException.java new file mode 100644 index 0000000..8fa7ed6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/BuildException.java @@ -0,0 +1,14 @@ +package com.thaiopensource.relaxng.parse; + +public class BuildException extends RuntimeException { + private final Throwable cause; + public BuildException(Throwable cause) { + if (cause == null) + throw new NullPointerException("null cause"); + this.cause = cause; + } + + public Throwable getCause() { + return cause; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/CommentList.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/CommentList.java new file mode 100644 index 0000000..11a5ac0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/CommentList.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface CommentList { + void addComment(String value, Location loc) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Context.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Context.java new file mode 100644 index 0000000..0b83e10 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Context.java @@ -0,0 +1,10 @@ +package com.thaiopensource.relaxng.parse; + +import org.relaxng.datatype.ValidationContext; + +import java.util.Enumeration; + +public interface Context extends ValidationContext { + Enumeration prefixes(); + Context copy(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/DataPatternBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/DataPatternBuilder.java new file mode 100644 index 0000000..224a100 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/DataPatternBuilder.java @@ -0,0 +1,11 @@ +package com.thaiopensource.relaxng.parse; + +public interface DataPatternBuilder { + void addParam(String name, String value, Context context, String ns, Location loc, Annotations anno) + throws BuildException; + void annotation(ParsedElementAnnotation ea); + ParsedPattern makePattern(Location loc, Annotations anno) + throws BuildException; + ParsedPattern makePattern(ParsedPattern except, Location loc, Annotations anno) + throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Div.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Div.java new file mode 100644 index 0000000..6deafac --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Div.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface Div extends GrammarSection { + void endDiv(Location loc, Annotations anno) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ElementAnnotationBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ElementAnnotationBuilder.java new file mode 100644 index 0000000..118d3b5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ElementAnnotationBuilder.java @@ -0,0 +1,6 @@ +package com.thaiopensource.relaxng.parse; + +public interface ElementAnnotationBuilder extends Annotations { + void addText(String value, Location loc, CommentList comments) throws BuildException; + ParsedElementAnnotation makeElementAnnotation() throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Grammar.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Grammar.java new file mode 100644 index 0000000..da294f6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Grammar.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface Grammar extends GrammarSection, Scope { + ParsedPattern endGrammar(Location loc, Annotations anno) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/GrammarSection.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/GrammarSection.java new file mode 100644 index 0000000..a1c7d08 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/GrammarSection.java @@ -0,0 +1,29 @@ +package com.thaiopensource.relaxng.parse; + +public interface GrammarSection { + + static final class Combine { + private final String name; + private Combine(String name) { + this.name = name; + } + final public String toString() { + return name; + } + } + + static final Combine COMBINE_CHOICE = new Combine("choice"); + static final Combine COMBINE_INTERLEAVE = new Combine("interleave"); + + static final String START = new String("#start"); + + void define(String name, Combine combine, ParsedPattern pattern, Location loc, Annotations anno) + throws BuildException; + void topLevelAnnotation(ParsedElementAnnotation ea) throws BuildException; + void topLevelComment(CommentList comments) throws BuildException; + Div makeDiv(); + /** + * Returns null if already in an include. + */ + Include makeInclude(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IllegalSchemaException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IllegalSchemaException.java new file mode 100644 index 0000000..21148ac --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IllegalSchemaException.java @@ -0,0 +1,3 @@ +package com.thaiopensource.relaxng.parse; + +public class IllegalSchemaException extends Exception { } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Include.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Include.java new file mode 100644 index 0000000..4f4d71c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Include.java @@ -0,0 +1,6 @@ +package com.thaiopensource.relaxng.parse; + +public interface Include extends GrammarSection { + void endInclude(String uri, String ns, + Location loc, Annotations anno) throws BuildException, IllegalSchemaException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IncludedGrammar.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IncludedGrammar.java new file mode 100644 index 0000000..3259ad7 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/IncludedGrammar.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface IncludedGrammar extends GrammarSection, Scope { + ParsedPattern endIncludedGrammar(Location loc, Annotations anno) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Location.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Location.java new file mode 100644 index 0000000..445ace0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Location.java @@ -0,0 +1,3 @@ +package com.thaiopensource.relaxng.parse; + +public interface Location { } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParseReceiver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParseReceiver.java new file mode 100644 index 0000000..be5dd89 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParseReceiver.java @@ -0,0 +1,8 @@ +package com.thaiopensource.relaxng.parse; + +import org.xml.sax.XMLReader; +import org.xml.sax.SAXException; + +public interface ParseReceiver extends SubParser { + ParsedPatternFuture installHandlers(XMLReader xr, SchemaBuilder schemaBuilder, Scope scope) throws SAXException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Parseable.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Parseable.java new file mode 100644 index 0000000..13e8e9f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Parseable.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface Parseable extends SubParser { + ParsedPattern parse(SchemaBuilder f, Scope scope) throws BuildException, IllegalSchemaException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.java new file mode 100644 index 0000000..864503d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedElementAnnotation.java @@ -0,0 +1,3 @@ +package com.thaiopensource.relaxng.parse; + +public interface ParsedElementAnnotation { } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedNameClass.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedNameClass.java new file mode 100644 index 0000000..b730ea4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedNameClass.java @@ -0,0 +1,3 @@ +package com.thaiopensource.relaxng.parse; + +public interface ParsedNameClass { } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPattern.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPattern.java new file mode 100644 index 0000000..d465ef1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPattern.java @@ -0,0 +1,3 @@ +package com.thaiopensource.relaxng.parse; + +public interface ParsedPattern { } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPatternFuture.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPatternFuture.java new file mode 100644 index 0000000..f38c2f7 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/ParsedPatternFuture.java @@ -0,0 +1,5 @@ +package com.thaiopensource.relaxng.parse; + +public interface ParsedPatternFuture { + ParsedPattern getParsedPattern() throws IllegalSchemaException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SchemaBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SchemaBuilder.java new file mode 100644 index 0000000..40cdbea --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SchemaBuilder.java @@ -0,0 +1,53 @@ +package com.thaiopensource.relaxng.parse; + +import org.relaxng.datatype.ValidationContext; + +public interface SchemaBuilder { + ParsedPattern makeChoice(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeInterleave(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeGroup(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeOneOrMore(ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeZeroOrMore(ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeOptional(ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeList(ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeMixed(ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeEmpty(Location loc, Annotations anno); + ParsedPattern makeNotAllowed(Location loc, Annotations anno); + ParsedPattern makeText(Location loc, Annotations anno); + ParsedPattern makeAttribute(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeElement(ParsedNameClass nc, ParsedPattern p, Location loc, Annotations anno) throws BuildException; + DataPatternBuilder makeDataPatternBuilder(String datatypeLibrary, String type, Location loc) throws BuildException; + ParsedPattern makeValue(String datatypeLibrary, String type, String value, Context c, String ns, + Location loc, Annotations anno) throws BuildException; + Grammar makeGrammar(Scope parent); + ParsedPattern annotate(ParsedPattern p, Annotations anno) throws BuildException; + ParsedNameClass annotate(ParsedNameClass nc, Annotations anno) throws BuildException; + ParsedPattern annotateAfter(ParsedPattern p, ParsedElementAnnotation e) throws BuildException; + ParsedNameClass annotateAfter(ParsedNameClass nc, ParsedElementAnnotation e) throws BuildException; + ParsedPattern commentAfter(ParsedPattern p, CommentList comments) throws BuildException; + ParsedNameClass commentAfter(ParsedNameClass nc, CommentList comments) throws BuildException; + ParsedPattern makeExternalRef(String uri, String ns, Scope scope, + Location loc, Annotations anno) throws BuildException, IllegalSchemaException; + ParsedNameClass makeChoice(ParsedNameClass[] nameClasses, int nNameClasses, Location loc, Annotations anno); + + static final String INHERIT_NS = new String("#inherit"); + ParsedNameClass makeName(String ns, String localName, String prefix, Location loc, Annotations anno); + ParsedNameClass makeNsName(String ns, Location loc, Annotations anno); + /** + * Caller must enforce constraints on except. + */ + ParsedNameClass makeNsName(String ns, ParsedNameClass except, Location loc, Annotations anno); + ParsedNameClass makeAnyName(Location loc, Annotations anno); + /** + * Caller must enforce constraints on except. + */ + ParsedNameClass makeAnyName(ParsedNameClass except, Location loc, Annotations anno); + Location makeLocation(String systemId, int lineNumber, int columnNumber); + Annotations makeAnnotations(CommentList comments, Context context); + ElementAnnotationBuilder makeElementAnnotationBuilder(String ns, String localName, String prefix, + Location loc, CommentList comments, Context context); + CommentList makeCommentList(); + ParsedPattern makeErrorPattern(); + ParsedNameClass makeErrorNameClass(); + boolean usesComments(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Scope.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Scope.java new file mode 100644 index 0000000..d4cf9f6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/Scope.java @@ -0,0 +1,6 @@ +package com.thaiopensource.relaxng.parse; + +public interface Scope { + ParsedPattern makeParentRef(String name, Location loc, Annotations anno) throws BuildException; + ParsedPattern makeRef(String name, Location loc, Annotations anno) throws BuildException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SubParser.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SubParser.java new file mode 100644 index 0000000..ef6e808 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/SubParser.java @@ -0,0 +1,8 @@ +package com.thaiopensource.relaxng.parse; + +public interface SubParser { + ParsedPattern parseInclude(String uri, SchemaBuilder f, IncludedGrammar g) + throws BuildException, IllegalSchemaException; + ParsedPattern parseExternal(String uri, SchemaBuilder f, Scope s) + throws BuildException, IllegalSchemaException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactParseable.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactParseable.java new file mode 100644 index 0000000..960bc9e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactParseable.java @@ -0,0 +1,89 @@ +package com.thaiopensource.relaxng.parse.compact; + +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.xml.util.EncodingMap; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PushbackInputStream; +import java.io.Reader; +import java.net.URL; + +public class CompactParseable implements Parseable { + private final InputSource in; + private final ErrorHandler eh; + + public CompactParseable(InputSource in, ErrorHandler eh) { + this.in = in; + this.eh = eh; + } + + public ParsedPattern parse(SchemaBuilder sb, Scope scope) throws BuildException, IllegalSchemaException { + return new CompactSyntax(makeReader(in), in.getSystemId(), sb, eh).parse(scope); + } + + public ParsedPattern parseInclude(String uri, SchemaBuilder sb, IncludedGrammar g) + throws BuildException, IllegalSchemaException { + InputSource tem = new InputSource(uri); + tem.setEncoding(in.getEncoding()); + return new CompactSyntax(makeReader(tem), uri, sb, eh).parseInclude(g); + } + + public ParsedPattern parseExternal(String uri, SchemaBuilder sb, Scope scope) + throws BuildException, IllegalSchemaException { + InputSource tem = new InputSource(uri); + tem.setEncoding(in.getEncoding()); + return new CompactSyntax(makeReader(tem), uri, sb, eh).parse(scope); + } + + private static final String UTF8 = EncodingMap.getJavaName("UTF-8"); + private static final String UTF16 = EncodingMap.getJavaName("UTF-16"); + + private static Reader makeReader(InputSource is) throws BuildException { + try { + Reader r = is.getCharacterStream(); + if (r == null) { + InputStream in = is.getByteStream(); + if (in == null) { + String systemId = is.getSystemId(); + in = new URL(systemId).openStream(); + } + String encoding = is.getEncoding(); + if (encoding == null) { + PushbackInputStream pb = new PushbackInputStream(in, 2); + encoding = detectEncoding(pb); + in = pb; + } + r = new InputStreamReader(in, encoding); + } + return r; + } + catch (IOException e) { + throw new BuildException(e); + } + } + + static private String detectEncoding(PushbackInputStream in) throws IOException { + String encoding = UTF8; + int b1 = in.read(); + if (b1 != -1) { + int b2 = in.read(); + if (b2 != -1) { + in.unread(b2); + if ((b1 == 0xFF && b2 == 0xFE) || (b1 == 0xFE && b2 == 0xFF)) + encoding = UTF16; + } + in.unread(b1); + } + return encoding; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.java new file mode 100644 index 0000000..560fdbe --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.java @@ -0,0 +1,3554 @@ +/* Generated By:JavaCC: Do not edit this line. CompactSyntax.java */ +package com.thaiopensource.relaxng.parse.compact; + +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.Context; + +import com.thaiopensource.xml.util.WellKnownNamespaces; + +import com.thaiopensource.util.Localizer; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.Locator; +import org.xml.sax.helpers.LocatorImpl; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; + +public class CompactSyntax implements Context, CompactSyntaxConstants { + private static final int IN_ELEMENT = 0; + private static final int IN_ATTRIBUTE = 1; + private static final int IN_ANY_NAME = 2; + private static final int IN_NS_NAME = 4; + + private String defaultNamespace = SchemaBuilder.INHERIT_NS; + private String compatibilityPrefix = null; + private SchemaBuilder sb; + private String sourceUri; + private ErrorHandler eh; + private final Hashtable namespaceTable = new Hashtable(); + private final Hashtable datatypesTable = new Hashtable(); + private boolean hadError = false; + private static final Localizer localizer = new Localizer(CompactSyntax.class); + private final Hashtable attributeNameTable = new Hashtable(); + private boolean annotationsIncludeElements = false; + + final class LocatedString { + private final String str; + private final Token tok; + + LocatedString(String str, Token tok) { + this.str = str; + this.tok = tok; + } + + String getString() { + return str; + } + + Location getLocation() { + return makeLocation(tok); + } + + Token getToken() { + return tok; + } + + } + + public CompactSyntax(Reader r, String sourceUri, SchemaBuilder sb, ErrorHandler eh) { + this(r); + this.sourceUri = sourceUri; + this.sb = sb; + this.eh = eh; + // this causes the root pattern to have non-null annotations + // which is useful because it gives a context to trang + this.topLevelComments = sb.makeCommentList(); + } + + ParsedPattern parse(Scope scope) throws IllegalSchemaException { + try { + ParsedPattern p = Input(scope); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + ParsedPattern parseInclude(IncludedGrammar g) throws IllegalSchemaException { + try { + ParsedPattern p = IncludedGrammar(g); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + private void checkNsName(int context, LocatedString ns) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_ns_name", ns.getToken()); + } + + private void checkAnyName(int context, Token t) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_any_name", t); + if ((context & IN_ANY_NAME) != 0) + error("any_name_except_contains_any_name", t); + } + + private void error(String key, Token tok) { + doError(localizer.message(key), tok); + } + + private void error(String key, String arg, Token tok) { + doError(localizer.message(key, arg), tok); + } + + private void error(String key, String arg1, String arg2, Token tok) { + doError(localizer.message(key, arg1, arg2), tok); + } + + private void doError(String message, Token tok) { + hadError = true; + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(tok.beginLine); + loc.setColumnNumber(tok.beginColumn); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(message, loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private void reportEscapeSyntaxException(EscapeSyntaxException e) { + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(e.getLineNumber()); + loc.setColumnNumber(e.getColumnNumber()); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(localizer.message(e.getKey()), loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private static String unquote(String s) { + if (s.length() >= 6 && s.charAt(0) == s.charAt(1)) { + s = s.replace('\u0000', '\n'); + return s.substring(3, s.length() - 3); + } + else + return s.substring(1, s.length() - 1); + } + + Location makeLocation(Token t) { + return sb.makeLocation(sourceUri, t.beginLine, t.beginColumn); + } + + private static ParsedPattern[] addPattern(ParsedPattern[] patterns, int i, ParsedPattern p) { + if (i >= patterns.length) { + ParsedPattern[] oldPatterns = patterns; + patterns = new ParsedPattern[oldPatterns.length*2]; + System.arraycopy(oldPatterns, 0, patterns, 0, oldPatterns.length); + } + patterns[i] = p; + return patterns; + } + + String getCompatibilityPrefix() { + if (compatibilityPrefix == null) { + compatibilityPrefix = "a"; + while (namespaceTable.get(compatibilityPrefix) != null) + compatibilityPrefix = compatibilityPrefix + "a"; + } + return compatibilityPrefix; + } + + public String resolveNamespacePrefix(String prefix) { + String result = (String)namespaceTable.get(prefix); + if (result.length() == 0) + return null; + return result; + } + + public Enumeration prefixes() { + return namespaceTable.keys(); + } + + public String getBaseUri() { + return sourceUri; + } + + public boolean isUnparsedEntity(String entityName) { + return false; + } + + public boolean isNotation(String notationName) { + return false; + } + + public Context copy() { + return this; + } + + private Context getContext() { + return this; + } + + private CommentList getComments() { + return getComments(getTopLevelComments()); + } + + private CommentList topLevelComments; + + private CommentList getTopLevelComments() { + CommentList tem = topLevelComments; + topLevelComments = null; + return tem; + } + + private void noteTopLevelComments() { + topLevelComments = getComments(topLevelComments); + } + + private void topLevelComments(GrammarSection section) { + section.topLevelComment(getComments(null)); + } + + private Token lastCommentSourceToken = null; + + private CommentList getComments(CommentList comments) { + Token nextToken = getToken(1); + if (lastCommentSourceToken != nextToken) { + if (lastCommentSourceToken == null) + lastCommentSourceToken = token; + do { + lastCommentSourceToken = lastCommentSourceToken.next; + Token t = lastCommentSourceToken.specialToken; + if (t != null) { + while (t.specialToken != null) + t = t.specialToken; + if (comments == null) + comments = sb.makeCommentList(); + for (; t != null; t = t.next) { + String s = mungeComment(t.image); + Location loc = makeLocation(t); + if (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE) { + StringBuffer buf = new StringBuffer(s); + do { + t = t.next; + buf.append('\n'); + buf.append(mungeComment(t.image)); + } while (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE); + s = buf.toString(); + } + comments.addComment(s, loc); + } + } + } while (lastCommentSourceToken != nextToken); + } + return comments; + } + + private ParsedPattern afterComments(ParsedPattern p) { + CommentList comments = getComments(null); + if (comments == null) + return p; + return sb.commentAfter(p, comments); + } + + private ParsedNameClass afterComments(ParsedNameClass nc) { + CommentList comments = getComments(null); + if (comments == null) + return nc; + return sb.commentAfter(nc, comments); + } + + private static String mungeComment(String image) { + int i = image.indexOf('#') + 1; + while (i < image.length() && image.charAt(i) == '#') + i++; + if (i < image.length() && image.charAt(i) == ' ') + i++; + return image.substring(i); + } + + private Annotations getCommentsAsAnnotations() { + CommentList comments = getComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private Annotations addCommentsToChildAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + a = sb.makeAnnotations(null, getContext()); + a.addComment(comments); + return a; + } + + private Annotations addCommentsToLeadingAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + return sb.makeAnnotations(comments, getContext()); + a.addLeadingComment(comments); + return a; + } + + private Annotations getTopLevelCommentsAsAnnotations() { + CommentList comments = getTopLevelComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private void clearAttributeList() { + attributeNameTable.clear(); + } + + private void addAttribute(Annotations a, String ns, String localName, String prefix, String value, Token tok) { + String key = ns + "#" + localName; + if (attributeNameTable.get(key) != null) + error("duplicate_attribute", ns, localName, tok); + else { + attributeNameTable.put(key, key); + a.addAttribute(ns, localName, prefix, value, makeLocation(tok)); + } + } + + private void checkExcept(Token[] except) { + if (except[0] != null) + error("except_missing_parentheses", except[0]); + } + + private String lookupPrefix(String prefix, Token t) { + String ns = (String)namespaceTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return "#error"; + } + return ns; + } + private String lookupDatatype(String prefix, Token t) { + String ns = (String)datatypesTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return ""; // XXX + } + return ns; + } + private String resolve(String str) { + try { + return new URL(new URL(sourceUri), str).toString(); + } + catch (MalformedURLException e) { } + return str; + } + + final public ParsedPattern Input(Scope scope) throws ParseException { + ParsedPattern p; + Preamble(); + if (jj_2_1(2147483647)) { + p = TopLevelGrammar(scope); + } else { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 10: + case 17: + case 18: + case 19: + case 26: + case 27: + case 28: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + case LITERAL: + p = Expr(true, scope, null, null); + p = afterComments(p); + jj_consume_token(0); + break; + default: + jj_la1[0] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public void TopLevelLookahead() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIXED_NAME: + jj_consume_token(PREFIXED_NAME); + jj_consume_token(1); + break; + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + Identifier(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + jj_consume_token(1); + break; + case 2: + jj_consume_token(2); + break; + case 3: + jj_consume_token(3); + break; + case 4: + jj_consume_token(4); + break; + default: + jj_la1[1] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + break; + case 5: + case 6: + case 7: + LookaheadGrammarKeyword(); + break; + case 1: + LookaheadBody(); + LookaheadAfterAnnotations(); + break; + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + LookaheadDocumentation(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + LookaheadBody(); + break; + default: + jj_la1[2] = jj_gen; + ; + } + LookaheadAfterAnnotations(); + break; + default: + jj_la1[3] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void LookaheadAfterAnnotations() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + Identifier(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 2: + jj_consume_token(2); + break; + case 3: + jj_consume_token(3); + break; + case 4: + jj_consume_token(4); + break; + default: + jj_la1[4] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + break; + case 5: + case 6: + case 7: + LookaheadGrammarKeyword(); + break; + default: + jj_la1[5] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void LookaheadGrammarKeyword() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + jj_consume_token(5); + break; + case 6: + jj_consume_token(6); + break; + case 7: + jj_consume_token(7); + break; + default: + jj_la1[6] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void LookaheadDocumentation() throws ParseException { + label_1: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION: + jj_consume_token(DOCUMENTATION); + break; + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + jj_consume_token(DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT); + break; + default: + jj_la1[7] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + label_2: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION_CONTINUE: + ; + break; + default: + jj_la1[8] = jj_gen; + break label_2; + } + jj_consume_token(DOCUMENTATION_CONTINUE); + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + ; + break; + default: + jj_la1[9] = jj_gen; + break label_1; + } + } + } + + final public void LookaheadBody() throws ParseException { + jj_consume_token(1); + label_3: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 2: + case 5: + case 6: + case 7: + case 8: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + case LITERAL: + ; + break; + default: + jj_la1[10] = jj_gen; + break label_3; + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIXED_NAME: + jj_consume_token(PREFIXED_NAME); + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + UnprefixedName(); + break; + case 2: + jj_consume_token(2); + break; + case LITERAL: + jj_consume_token(LITERAL); + break; + case 8: + jj_consume_token(8); + break; + case 1: + LookaheadBody(); + break; + default: + jj_la1[11] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + jj_consume_token(9); + } + + final public ParsedPattern IncludedGrammar(IncludedGrammar g) throws ParseException { + Annotations a; + ParsedPattern p; + Preamble(); + if (jj_2_2(2147483647)) { + a = GrammarBody(g, g, getTopLevelCommentsAsAnnotations()); + } else { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 10: + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + a = Annotations(); + jj_consume_token(10); + jj_consume_token(11); + a = GrammarBody(g, g, a); + topLevelComments(g); + jj_consume_token(12); + break; + default: + jj_la1[12] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + p = afterComments(g.endIncludedGrammar(sb.makeLocation(sourceUri, 1, 1), a)); + jj_consume_token(0); + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern TopLevelGrammar(Scope scope) throws ParseException { + Annotations a = getTopLevelCommentsAsAnnotations(); + Grammar g; + ParsedPattern p; + g = sb.makeGrammar(scope); + a = GrammarBody(g, g, a); + p = afterComments(g.endGrammar(sb.makeLocation(sourceUri, 1, 1), a)); + jj_consume_token(0); + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public void Preamble() throws ParseException { + label_4: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 13: + case 14: + case 16: + ; + break; + default: + jj_la1[13] = jj_gen; + break label_4; + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 13: + case 14: + NamespaceDecl(); + break; + case 16: + DatatypesDecl(); + break; + default: + jj_la1[14] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + namespaceTable.put("xml", WellKnownNamespaces.XML); + if (datatypesTable.get("xsd") == null) + datatypesTable.put("xsd", WellKnownNamespaces.XML_SCHEMA_DATATYPES); + } + + final public void NamespaceDecl() throws ParseException { + LocatedString prefix = null; + boolean isDefault = false; + String namespaceName; + noteTopLevelComments(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 13: + jj_consume_token(13); + prefix = UnprefixedName(); + break; + case 14: + jj_consume_token(14); + isDefault = true; + jj_consume_token(13); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + prefix = UnprefixedName(); + break; + default: + jj_la1[15] = jj_gen; + ; + } + break; + default: + jj_la1[16] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + jj_consume_token(2); + namespaceName = NamespaceName(); + if (isDefault) + defaultNamespace = namespaceName; + if (prefix != null) { + if (prefix.getString().equals("xmlns")) + error("xmlns_prefix", prefix.getToken()); + else if (prefix.getString().equals("xml")) { + if (!namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_prefix_bad_uri", prefix.getToken()); + } + else if (namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_uri_bad_prefix", prefix.getToken()); + else { + if (namespaceName.equals(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS)) + compatibilityPrefix = prefix.getString(); + namespaceTable.put(prefix.getString(), namespaceName); + } + } + } + + final public String NamespaceName() throws ParseException { + String r; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LITERAL: + r = Literal(); + break; + case 15: + jj_consume_token(15); + r = SchemaBuilder.INHERIT_NS; + break; + default: + jj_la1[17] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return r;} + throw new Error("Missing return statement in function"); + } + + final public void DatatypesDecl() throws ParseException { + LocatedString prefix; + String uri; + noteTopLevelComments(); + jj_consume_token(16); + prefix = UnprefixedName(); + jj_consume_token(2); + uri = Literal(); + datatypesTable.put(prefix.getString(), uri); + } + + final public ParsedPattern AnnotatedPrimaryExpr(boolean topLevel, Scope scope, Token[] except) throws ParseException { + Annotations a; + ParsedPattern p; + ParsedElementAnnotation e; + Token t; + a = Annotations(); + p = PrimaryExpr(topLevel, scope, a, except); + label_5: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FANNOTATE: + ; + break; + default: + jj_la1[18] = jj_gen; + break label_5; + } + t = jj_consume_token(FANNOTATE); + e = AnnotationElement(false); + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + } + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern PrimaryExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) throws ParseException { + ParsedPattern p; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 26: + p = ElementExpr(scope, a); + break; + case 27: + p = AttributeExpr(scope, a); + break; + case 10: + p = GrammarExpr(scope, a); + break; + case 33: + p = ExternalRefExpr(scope, a); + break; + case 31: + p = ListExpr(scope, a); + break; + case 32: + p = MixedExpr(scope, a); + break; + case 28: + p = ParenExpr(topLevel, scope, a); + break; + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + p = IdentifierExpr(scope, a); + break; + case 34: + p = ParentExpr(scope, a); + break; + case 35: + case 36: + case PREFIXED_NAME: + p = DataExpr(topLevel, scope, a, except); + break; + case LITERAL: + p = ValueExpr(topLevel, a); + break; + case 18: + p = TextExpr(a); + break; + case 17: + p = EmptyExpr(a); + break; + case 19: + p = NotAllowedExpr(a); + break; + default: + jj_la1[19] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern EmptyExpr(Annotations a) throws ParseException { + Token t; + t = jj_consume_token(17); + {if (true) return sb.makeEmpty(makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern TextExpr(Annotations a) throws ParseException { + Token t; + t = jj_consume_token(18); + {if (true) return sb.makeText(makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern NotAllowedExpr(Annotations a) throws ParseException { + Token t; + t = jj_consume_token(19); + {if (true) return sb.makeNotAllowed(makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern Expr(boolean topLevel, Scope scope, Token t, Annotations a) throws ParseException { + ParsedPattern p; + ParsedPattern[] patterns = new ParsedPattern[2]; + int nPatterns = 1; + boolean[] hadOccur = new boolean[1]; + Token[] except = new Token[1]; + p = UnaryExpr(topLevel, scope, hadOccur, except); + patterns[0] = p; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 20: + case 21: + case 22: + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 20: + checkExcept(except); + label_6: + while (true) { + t = jj_consume_token(20); + p = UnaryExpr(topLevel, scope, null, except); + patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 20: + ; + break; + default: + jj_la1[20] = jj_gen; + break label_6; + } + } + p = sb.makeChoice(patterns, nPatterns, makeLocation(t), a); + break; + case 21: + label_7: + while (true) { + t = jj_consume_token(21); + p = UnaryExpr(topLevel, scope, null, except); + patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 21: + ; + break; + default: + jj_la1[21] = jj_gen; + break label_7; + } + } + p = sb.makeInterleave(patterns, nPatterns, makeLocation(t), a); + break; + case 22: + label_8: + while (true) { + t = jj_consume_token(22); + p = UnaryExpr(topLevel, scope, null, except); + patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 22: + ; + break; + default: + jj_la1[22] = jj_gen; + break label_8; + } + } + p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); + break; + default: + jj_la1[23] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + break; + default: + jj_la1[24] = jj_gen; + ; + } + if (nPatterns == 1 && a != null) { + if (hadOccur[0]) + p = sb.annotate(p, a); + else + p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); + } + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern UnaryExpr(boolean topLevel, Scope scope, boolean[] hadOccur, Token[] except) throws ParseException { + ParsedPattern p; + Token t; + ParsedElementAnnotation e; + p = AnnotatedPrimaryExpr(topLevel, scope, except); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 23: + case 24: + case 25: + if (hadOccur != null) hadOccur[0] = true; + p = afterComments(p); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 23: + t = jj_consume_token(23); + checkExcept(except); p = sb.makeOneOrMore(p, makeLocation(t), null); + break; + case 24: + t = jj_consume_token(24); + checkExcept(except); p = sb.makeOptional(p, makeLocation(t), null); + break; + case 25: + t = jj_consume_token(25); + checkExcept(except); p = sb.makeZeroOrMore(p, makeLocation(t), null); + break; + default: + jj_la1[25] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + label_9: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FANNOTATE: + ; + break; + default: + jj_la1[26] = jj_gen; + break label_9; + } + t = jj_consume_token(FANNOTATE); + e = AnnotationElement(false); + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + } + break; + default: + jj_la1[27] = jj_gen; + ; + } + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern ElementExpr(Scope scope, Annotations a) throws ParseException { + Token t; + ParsedNameClass nc; + ParsedPattern p; + t = jj_consume_token(26); + nc = NameClass(IN_ELEMENT, null); + jj_consume_token(11); + p = Expr(false, scope, null, null); + p = afterComments(p); + jj_consume_token(12); + {if (true) return sb.makeElement(nc, p, makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern AttributeExpr(Scope scope, Annotations a) throws ParseException { + Token t; + ParsedNameClass nc; + ParsedPattern p; + t = jj_consume_token(27); + nc = NameClass(IN_ATTRIBUTE, null); + jj_consume_token(11); + p = Expr(false, scope, null, null); + p = afterComments(p); + jj_consume_token(12); + {if (true) return sb.makeAttribute(nc, p, makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass NameClass(int context, Annotations[] pa) throws ParseException { + Annotations a; + ParsedNameClass nc; + a = Annotations(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 28: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + nc = PrimaryNameClass(context, a); + nc = AnnotateAfter(nc); + nc = NameClassAlternatives(context, nc, pa); + break; + case 25: + nc = AnyNameExceptClass(context, a, pa); + break; + case PREFIX_STAR: + nc = NsNameExceptClass(context, a, pa); + break; + default: + jj_la1[28] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass AnnotateAfter(ParsedNameClass nc) throws ParseException { + ParsedElementAnnotation e; + label_10: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FANNOTATE: + ; + break; + default: + jj_la1[29] = jj_gen; + break label_10; + } + jj_consume_token(FANNOTATE); + e = AnnotationElement(false); + nc = sb.annotateAfter(nc, e); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass NameClassAlternatives(int context, ParsedNameClass nc, Annotations[] pa) throws ParseException { + Token t; + ParsedNameClass[] nameClasses; + int nNameClasses; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 20: + nameClasses = new ParsedNameClass[2]; + nameClasses[0] = nc; + nNameClasses = 1; + label_11: + while (true) { + t = jj_consume_token(20); + nc = BasicNameClass(context); + nc = AnnotateAfter(nc); + if (nNameClasses >= nameClasses.length) { + ParsedNameClass[] oldNameClasses = nameClasses; + nameClasses = new ParsedNameClass[oldNameClasses.length*2]; + System.arraycopy(oldNameClasses, 0, nameClasses, 0, oldNameClasses.length); + } + nameClasses[nNameClasses++] = nc; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 20: + ; + break; + default: + jj_la1[30] = jj_gen; + break label_11; + } + } + Annotations a; + if (pa == null) + a = null; + else { + a = pa[0]; + pa[0] = null; + } + nc = sb.makeChoice(nameClasses, nNameClasses, makeLocation(t), a); + break; + default: + jj_la1[31] = jj_gen; + ; + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass BasicNameClass(int context) throws ParseException { + Annotations a; + ParsedNameClass nc; + a = Annotations(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 28: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + nc = PrimaryNameClass(context, a); + break; + case 25: + case PREFIX_STAR: + nc = OpenNameClass(context, a); + break; + default: + jj_la1[32] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass PrimaryNameClass(int context, Annotations a) throws ParseException { + ParsedNameClass nc; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + nc = UnprefixedNameClass(context, a); + break; + case PREFIXED_NAME: + nc = PrefixedNameClass(a); + break; + case 28: + nc = ParenNameClass(context, a); + break; + default: + jj_la1[33] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass OpenNameClass(int context, Annotations a) throws ParseException { + Token t; + LocatedString ns; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIX_STAR: + ns = NsName(); + checkNsName(context, ns); {if (true) return sb.makeNsName(ns.getString(), ns.getLocation(), a);} + break; + case 25: + t = jj_consume_token(25); + checkAnyName(context, t); {if (true) return sb.makeAnyName(makeLocation(t), a);} + break; + default: + jj_la1[34] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass UnprefixedNameClass(int context, Annotations a) throws ParseException { + LocatedString name; + name = UnprefixedName(); + String ns; + if ((context & (IN_ATTRIBUTE|IN_ELEMENT)) == IN_ATTRIBUTE) + ns = ""; + else + ns = defaultNamespace; + {if (true) return sb.makeName(ns, name.getString(), null, name.getLocation(), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass PrefixedNameClass(Annotations a) throws ParseException { + Token t; + t = jj_consume_token(PREFIXED_NAME); + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + {if (true) return sb.makeName(lookupPrefix(prefix, t), qn.substring(colon + 1), prefix, makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass NsNameExceptClass(int context, Annotations a, Annotations[] pa) throws ParseException { + LocatedString ns; + ParsedNameClass nc; + ns = NsName(); + checkNsName(context, ns); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 30: + nc = ExceptNameClass(context | IN_NS_NAME); + nc = sb.makeNsName(ns.getString(), nc, ns.getLocation(), a); + nc = AnnotateAfter(nc); + break; + default: + jj_la1[35] = jj_gen; + nc = sb.makeNsName(ns.getString(), ns.getLocation(), a); + nc = AnnotateAfter(nc); + nc = NameClassAlternatives(context, nc, pa); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public LocatedString NsName() throws ParseException { + Token t; + t = jj_consume_token(PREFIX_STAR); + String qn = t.image; + String prefix = qn.substring(0, qn.length() - 2); + {if (true) return new LocatedString(lookupPrefix(prefix, t), t);} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass AnyNameExceptClass(int context, Annotations a, Annotations[] pa) throws ParseException { + Token t; + ParsedNameClass nc; + t = jj_consume_token(25); + checkAnyName(context, t); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 30: + nc = ExceptNameClass(context | IN_ANY_NAME); + nc = sb.makeAnyName(nc, makeLocation(t), a); + nc = AnnotateAfter(nc); + break; + default: + jj_la1[36] = jj_gen; + nc = sb.makeAnyName(makeLocation(t), a); + nc = AnnotateAfter(nc); + nc = NameClassAlternatives(context, nc, pa); + } + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass ParenNameClass(int context, Annotations a) throws ParseException { + Token t; + ParsedNameClass nc; + Annotations[] pa = new Annotations[]{ a }; + t = jj_consume_token(28); + nc = NameClass(context, pa); + nc = afterComments(nc); + jj_consume_token(29); + if (pa[0] != null) + nc = sb.makeChoice(new ParsedNameClass[] { nc }, 1, makeLocation(t), pa[0]); + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedNameClass ExceptNameClass(int context) throws ParseException { + ParsedNameClass nc; + jj_consume_token(30); + nc = BasicNameClass(context); + {if (true) return nc;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern ListExpr(Scope scope, Annotations a) throws ParseException { + Token t; + ParsedPattern p; + t = jj_consume_token(31); + jj_consume_token(11); + p = Expr(false, scope, null, null); + p = afterComments(p); + jj_consume_token(12); + {if (true) return sb.makeList(p, makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern MixedExpr(Scope scope, Annotations a) throws ParseException { + Token t; + ParsedPattern p; + t = jj_consume_token(32); + jj_consume_token(11); + p = Expr(false, scope, null, null); + p = afterComments(p); + jj_consume_token(12); + {if (true) return sb.makeMixed(p, makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern GrammarExpr(Scope scope, Annotations a) throws ParseException { + Token t; + Grammar g; + t = jj_consume_token(10); + g = sb.makeGrammar(scope); + jj_consume_token(11); + a = GrammarBody(g, g, a); + topLevelComments(g); + jj_consume_token(12); + {if (true) return g.endGrammar(makeLocation(t), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern ParenExpr(boolean topLevel, Scope scope, Annotations a) throws ParseException { + Token t; + ParsedPattern p; + t = jj_consume_token(28); + p = Expr(topLevel, scope, t, a); + p = afterComments(p); + jj_consume_token(29); + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public Annotations GrammarBody(GrammarSection section, Scope scope, Annotations a) throws ParseException { + ParsedElementAnnotation e; + label_12: + while (true) { + if (jj_2_3(2)) { + ; + } else { + break label_12; + } + e = AnnotationElementNotKeyword(); + if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); + } + label_13: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 5: + case 6: + case 7: + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + ; + break; + default: + jj_la1[37] = jj_gen; + break label_13; + } + GrammarComponent(section, scope); + } + {if (true) return a;} + throw new Error("Missing return statement in function"); + } + + final public void GrammarComponent(GrammarSection section, Scope scope) throws ParseException { + ParsedElementAnnotation e; + Annotations a; + a = Annotations(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + Definition(section, scope, a); + break; + case 7: + Include(section, scope, a); + break; + case 6: + Div(section, scope, a); + break; + default: + jj_la1[38] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + label_14: + while (true) { + if (jj_2_4(2)) { + ; + } else { + break label_14; + } + e = AnnotationElementNotKeyword(); + section.topLevelAnnotation(e); + } + } + + final public void Definition(GrammarSection section, Scope scope, Annotations a) throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + Define(section, scope, a); + break; + case 5: + Start(section, scope, a); + break; + default: + jj_la1[39] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void Start(GrammarSection section, Scope scope, Annotations a) throws ParseException { + Token t; + GrammarSection.Combine combine; + ParsedPattern p; + t = jj_consume_token(5); + combine = AssignOp(); + p = Expr(false, scope, null, null); + section.define(GrammarSection.START, combine, p, makeLocation(t), a); + } + + final public void Define(GrammarSection section, Scope scope, Annotations a) throws ParseException { + LocatedString name; + GrammarSection.Combine combine; + ParsedPattern p; + name = Identifier(); + combine = AssignOp(); + p = Expr(false, scope, null, null); + section.define(name.getString(), combine, p, name.getLocation(), a); + } + + final public GrammarSection.Combine AssignOp() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 2: + jj_consume_token(2); + {if (true) return null;} + break; + case 4: + jj_consume_token(4); + {if (true) return GrammarSection.COMBINE_CHOICE;} + break; + case 3: + jj_consume_token(3); + {if (true) return GrammarSection.COMBINE_INTERLEAVE;} + break; + default: + jj_la1[40] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + throw new Error("Missing return statement in function"); + } + + final public void Include(GrammarSection section, Scope scope, Annotations a) throws ParseException { + Token t; + String href; + String ns; + Include include = section.makeInclude(); + t = jj_consume_token(7); + href = Literal(); + ns = Inherit(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 11: + jj_consume_token(11); + a = IncludeBody(include, scope, a); + topLevelComments(include); + jj_consume_token(12); + break; + default: + jj_la1[41] = jj_gen; + ; + } + try { + include.endInclude(resolve(href), ns, makeLocation(t), a); + } + catch (IllegalSchemaException e) { } + } + + final public Annotations IncludeBody(GrammarSection section, Scope scope, Annotations a) throws ParseException { + ParsedElementAnnotation e; + label_15: + while (true) { + if (jj_2_5(2)) { + ; + } else { + break label_15; + } + e = AnnotationElementNotKeyword(); + if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); + } + label_16: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 5: + case 6: + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + ; + break; + default: + jj_la1[42] = jj_gen; + break label_16; + } + IncludeComponent(section, scope); + } + {if (true) return a;} + throw new Error("Missing return statement in function"); + } + + final public void IncludeComponent(GrammarSection section, Scope scope) throws ParseException { + ParsedElementAnnotation e; + Annotations a; + a = Annotations(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + Definition(section, scope, a); + break; + case 6: + IncludeDiv(section, scope, a); + break; + default: + jj_la1[43] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + label_17: + while (true) { + if (jj_2_6(2)) { + ; + } else { + break label_17; + } + e = AnnotationElementNotKeyword(); + section.topLevelAnnotation(e); + } + } + + final public void Div(GrammarSection section, Scope scope, Annotations a) throws ParseException { + Token t; + Div div = section.makeDiv(); + t = jj_consume_token(6); + jj_consume_token(11); + a = GrammarBody(div, scope, a); + topLevelComments(div); + jj_consume_token(12); + div.endDiv(makeLocation(t), a); + } + + final public void IncludeDiv(GrammarSection section, Scope scope, Annotations a) throws ParseException { + Token t; + Div div = section.makeDiv(); + t = jj_consume_token(6); + jj_consume_token(11); + a = IncludeBody(div, scope, a); + topLevelComments(div); + jj_consume_token(12); + div.endDiv(makeLocation(t), a); + } + + final public ParsedPattern ExternalRefExpr(Scope scope, Annotations a) throws ParseException { + Token t; + String href; + String ns; + t = jj_consume_token(33); + href = Literal(); + ns = Inherit(); + try { + {if (true) return sb.makeExternalRef(resolve(href), ns, scope, makeLocation(t), a);} + } + catch (IllegalSchemaException e) { + {if (true) return sb.makeErrorPattern();} + } + throw new Error("Missing return statement in function"); + } + + final public String Inherit() throws ParseException { + String ns = null; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 15: + jj_consume_token(15); + jj_consume_token(2); + ns = Prefix(); + break; + default: + jj_la1[44] = jj_gen; + ; + } + if (ns == null) + ns = defaultNamespace; + {if (true) return ns;} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern ParentExpr(Scope scope, Annotations a) throws ParseException { + LocatedString name; + jj_consume_token(34); + a = addCommentsToChildAnnotations(a); + name = Identifier(); + {if (true) return scope.makeParentRef(name.getString(), name.getLocation(), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern IdentifierExpr(Scope scope, Annotations a) throws ParseException { + LocatedString name; + name = Identifier(); + {if (true) return scope.makeRef(name.getString(), name.getLocation(), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern ValueExpr(boolean topLevel, Annotations a) throws ParseException { + LocatedString s; + s = LocatedLiteral(); + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", s.getToken()); + a = null; + } + {if (true) return sb.makeValue("", "token", s.getString(), getContext(), defaultNamespace, s.getLocation(), a);} + throw new Error("Missing return statement in function"); + } + + final public ParsedPattern DataExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) throws ParseException { + Token datatypeToken; + Location loc; + String datatype; + String datatypeUri = null; + String s = null; + ParsedPattern e = null; + DataPatternBuilder dpb; + datatypeToken = DatatypeName(); + datatype = datatypeToken.image; + loc = makeLocation(datatypeToken); + int colon = datatype.indexOf(':'); + if (colon < 0) + datatypeUri = ""; + else { + String prefix = datatype.substring(0, colon); + datatypeUri = lookupDatatype(prefix, datatypeToken); + datatype = datatype.substring(colon + 1); + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LITERAL: + s = Literal(); + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", datatypeToken); + a = null; + } + {if (true) return sb.makeValue(datatypeUri, datatype, s, getContext(), defaultNamespace, loc, a);} + break; + default: + jj_la1[48] = jj_gen; + dpb = sb.makeDataPatternBuilder(datatypeUri, datatype, loc); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 11: + Params(dpb); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 30: + e = Except(scope, except); + break; + default: + jj_la1[45] = jj_gen; + ; + } + break; + default: + jj_la1[47] = jj_gen; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 30: + e = Except(scope, except); + break; + default: + jj_la1[46] = jj_gen; + ; + } + } + {if (true) return e == null ? dpb.makePattern(loc, a) : dpb.makePattern(e, loc, a);} + } + throw new Error("Missing return statement in function"); + } + + final public Token DatatypeName() throws ParseException { + Token t; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 35: + t = jj_consume_token(35); + break; + case 36: + t = jj_consume_token(36); + break; + case PREFIXED_NAME: + t = jj_consume_token(PREFIXED_NAME); + break; + default: + jj_la1[49] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t;} + throw new Error("Missing return statement in function"); + } + + final public LocatedString Identifier() throws ParseException { + LocatedString s; + Token t; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + t = jj_consume_token(IDENTIFIER); + s = new LocatedString(t.image, t); + break; + case ESCAPED_IDENTIFIER: + t = jj_consume_token(ESCAPED_IDENTIFIER); + s = new LocatedString(t.image.substring(1), t); + break; + default: + jj_la1[50] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return s;} + throw new Error("Missing return statement in function"); + } + + final public String Prefix() throws ParseException { + Token t; + String prefix; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + t = jj_consume_token(IDENTIFIER); + prefix = t.image; + break; + case ESCAPED_IDENTIFIER: + t = jj_consume_token(ESCAPED_IDENTIFIER); + prefix = t.image.substring(1); + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + t = Keyword(); + prefix = t.image; + break; + default: + jj_la1[51] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return lookupPrefix(prefix, t);} + throw new Error("Missing return statement in function"); + } + + final public LocatedString UnprefixedName() throws ParseException { + LocatedString s; + Token t; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + s = Identifier(); + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + t = Keyword(); + s = new LocatedString(t.image, t); + break; + default: + jj_la1[52] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return s;} + throw new Error("Missing return statement in function"); + } + + final public void Params(DataPatternBuilder dpb) throws ParseException { + jj_consume_token(11); + label_18: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + ; + break; + default: + jj_la1[53] = jj_gen; + break label_18; + } + Param(dpb); + } + jj_consume_token(12); + } + + final public void Param(DataPatternBuilder dpb) throws ParseException { + LocatedString name; + Annotations a; + String value; + a = Annotations(); + name = UnprefixedName(); + jj_consume_token(2); + a = addCommentsToLeadingAnnotations(a); + value = Literal(); + dpb.addParam(name.getString(), value, getContext(), defaultNamespace, name.getLocation(), a); + } + + final public ParsedPattern Except(Scope scope, Token[] except) throws ParseException { + Annotations a; + ParsedPattern p; + Token t; + Token[] innerExcept = new Token[1]; + t = jj_consume_token(30); + a = Annotations(); + p = PrimaryExpr(false, scope, a, innerExcept); + checkExcept(innerExcept); + except[0] = t; + {if (true) return p;} + throw new Error("Missing return statement in function"); + } + + final public ParsedElementAnnotation Documentation() throws ParseException { + CommentList comments = getComments(); + ElementAnnotationBuilder eab; + Token t; + String s; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION: + t = jj_consume_token(DOCUMENTATION); + break; + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + t = jj_consume_token(DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT); + break; + default: + jj_la1[54] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + eab = sb.makeElementAnnotationBuilder(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS, + "documentation", + getCompatibilityPrefix(), + makeLocation(t), + comments, + getContext()); + eab.addText(mungeComment(t.image), makeLocation(t), null); + label_19: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION_CONTINUE: + ; + break; + default: + jj_la1[55] = jj_gen; + break label_19; + } + t = jj_consume_token(DOCUMENTATION_CONTINUE); + eab.addText("\n" + mungeComment(t.image), makeLocation(t), null); + } + {if (true) return eab.makeElementAnnotation();} + throw new Error("Missing return statement in function"); + } + + final public Annotations Annotations() throws ParseException { + CommentList comments = getComments(); + Annotations a = null; + ParsedElementAnnotation e; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + a = sb.makeAnnotations(comments, getContext()); + label_20: + while (true) { + e = Documentation(); + a.addElement(e); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOCUMENTATION: + case DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: + ; + break; + default: + jj_la1[56] = jj_gen; + break label_20; + } + } + comments = getComments(); + if (comments != null) + a.addLeadingComment(comments); + break; + default: + jj_la1[57] = jj_gen; + ; + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 1: + jj_consume_token(1); + if (a == null) a = sb.makeAnnotations(comments, getContext()); clearAttributeList(); annotationsIncludeElements = false; + label_21: + while (true) { + if (jj_2_7(2)) { + ; + } else { + break label_21; + } + PrefixedAnnotationAttribute(a, false); + } + label_22: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + ; + break; + default: + jj_la1[58] = jj_gen; + break label_22; + } + e = AnnotationElement(false); + a.addElement(e); annotationsIncludeElements = true; + } + a.addComment(getComments()); + jj_consume_token(9); + break; + default: + jj_la1[59] = jj_gen; + ; + } + if (a == null && comments != null) + a = sb.makeAnnotations(comments, getContext()); + {if (true) return a;} + throw new Error("Missing return statement in function"); + } + + final public void AnnotationAttribute(Annotations a) throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIXED_NAME: + PrefixedAnnotationAttribute(a, true); + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + UnprefixedAnnotationAttribute(a); + break; + default: + jj_la1[60] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void PrefixedAnnotationAttribute(Annotations a, boolean nested) throws ParseException { + Token t; + String value; + t = jj_consume_token(PREFIXED_NAME); + jj_consume_token(2); + value = Literal(); + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) + error("inherited_annotation_namespace", t); + else if (ns.length() == 0 && !nested) + error("unqualified_annotation_attribute", t); + else if (ns.equals(WellKnownNamespaces.RELAX_NG) && !nested) + error("relax_ng_namespace", t); + /*else if (ns.length() == 0 + && qn.length() - colon - 1 == 5 + && qn.regionMatches(colon + 1, "xmlns", 0, 5)) + error("xmlns_annotation_attribute", t);*/ + else if (ns.equals(WellKnownNamespaces.XMLNS)) + error("xmlns_annotation_attribute_uri", t); + else { + if (ns.length() == 0) + prefix = null; + addAttribute(a, ns, qn.substring(colon + 1), prefix, value, t); + } + } + + final public void UnprefixedAnnotationAttribute(Annotations a) throws ParseException { + LocatedString name; + String value; + name = UnprefixedName(); + jj_consume_token(2); + value = Literal(); + if (name.getString().equals("xmlns")) + error("xmlns_annotation_attribute", name.getToken()); + else + addAttribute(a, "", name.getString(), null, value, name.getToken()); + } + + final public ParsedElementAnnotation AnnotationElement(boolean nested) throws ParseException { + ParsedElementAnnotation a; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIXED_NAME: + a = PrefixedAnnotationElement(nested); + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + a = UnprefixedAnnotationElement(); + break; + default: + jj_la1[61] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return a;} + throw new Error("Missing return statement in function"); + } + + final public ParsedElementAnnotation AnnotationElementNotKeyword() throws ParseException { + ParsedElementAnnotation a; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PREFIXED_NAME: + a = PrefixedAnnotationElement(false); + break; + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + a = IdentifierAnnotationElement(); + break; + default: + jj_la1[62] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return a;} + throw new Error("Missing return statement in function"); + } + + final public ParsedElementAnnotation PrefixedAnnotationElement(boolean nested) throws ParseException { + CommentList comments = getComments(); + Token t; + ElementAnnotationBuilder eab; + t = jj_consume_token(PREFIXED_NAME); + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) { + error("inherited_annotation_namespace", t); + ns = ""; + } + else if (!nested && ns.equals(WellKnownNamespaces.RELAX_NG)) { + error("relax_ng_namespace", t); + ns = ""; + } + else { + if (ns.length() == 0) + prefix = null; + } + eab = sb.makeElementAnnotationBuilder(ns, qn.substring(colon + 1), prefix, + makeLocation(t), comments, getContext()); + AnnotationElementContent(eab); + {if (true) return eab.makeElementAnnotation();} + throw new Error("Missing return statement in function"); + } + + final public ParsedElementAnnotation UnprefixedAnnotationElement() throws ParseException { + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; + name = UnprefixedName(); + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + AnnotationElementContent(eab); + {if (true) return eab.makeElementAnnotation();} + throw new Error("Missing return statement in function"); + } + + final public ParsedElementAnnotation IdentifierAnnotationElement() throws ParseException { + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; + name = Identifier(); + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + AnnotationElementContent(eab); + {if (true) return eab.makeElementAnnotation();} + throw new Error("Missing return statement in function"); + } + + final public void AnnotationElementContent(ElementAnnotationBuilder eab) throws ParseException { + ParsedElementAnnotation e; + jj_consume_token(1); + clearAttributeList(); + label_23: + while (true) { + if (jj_2_8(2)) { + ; + } else { + break label_23; + } + AnnotationAttribute(eab); + } + label_24: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + case LITERAL: + ; + break; + default: + jj_la1[63] = jj_gen; + break label_24; + } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LITERAL: + AnnotationElementLiteral(eab); + label_25: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 8: + ; + break; + default: + jj_la1[64] = jj_gen; + break label_25; + } + jj_consume_token(8); + AnnotationElementLiteral(eab); + } + break; + case 5: + case 6: + case 7: + case 10: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 26: + case 27: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case IDENTIFIER: + case ESCAPED_IDENTIFIER: + case PREFIXED_NAME: + e = AnnotationElement(true); + eab.addElement(e); + break; + default: + jj_la1[65] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + eab.addComment(getComments()); + jj_consume_token(9); + } + + final public void AnnotationElementLiteral(ElementAnnotationBuilder eab) throws ParseException { + Token t; + CommentList comments = getComments(); + t = jj_consume_token(LITERAL); + eab.addText(unquote(t.image), makeLocation(t), comments); + } + + final public String Literal() throws ParseException { + Token t; + String s; + StringBuffer buf; + t = jj_consume_token(LITERAL); + s = unquote(t.image); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 8: + buf = new StringBuffer(s); + label_26: + while (true) { + jj_consume_token(8); + t = jj_consume_token(LITERAL); + buf.append(unquote(t.image)); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 8: + ; + break; + default: + jj_la1[66] = jj_gen; + break label_26; + } + } + s = buf.toString(); + break; + default: + jj_la1[67] = jj_gen; + ; + } + {if (true) return s;} + throw new Error("Missing return statement in function"); + } + + final public LocatedString LocatedLiteral() throws ParseException { + Token t; + Token t2; + String s; + StringBuffer buf; + t = jj_consume_token(LITERAL); + s = unquote(t.image); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 8: + buf = new StringBuffer(s); + label_27: + while (true) { + jj_consume_token(8); + t2 = jj_consume_token(LITERAL); + buf.append(unquote(t2.image)); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 8: + ; + break; + default: + jj_la1[68] = jj_gen; + break label_27; + } + } + s = buf.toString(); + break; + default: + jj_la1[69] = jj_gen; + ; + } + {if (true) return new LocatedString(s, t);} + throw new Error("Missing return statement in function"); + } + + final public Token Keyword() throws ParseException { + Token t; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 26: + t = jj_consume_token(26); + break; + case 27: + t = jj_consume_token(27); + break; + case 13: + t = jj_consume_token(13); + break; + case 31: + t = jj_consume_token(31); + break; + case 32: + t = jj_consume_token(32); + break; + case 10: + t = jj_consume_token(10); + break; + case 17: + t = jj_consume_token(17); + break; + case 18: + t = jj_consume_token(18); + break; + case 34: + t = jj_consume_token(34); + break; + case 33: + t = jj_consume_token(33); + break; + case 19: + t = jj_consume_token(19); + break; + case 5: + t = jj_consume_token(5); + break; + case 7: + t = jj_consume_token(7); + break; + case 14: + t = jj_consume_token(14); + break; + case 15: + t = jj_consume_token(15); + break; + case 35: + t = jj_consume_token(35); + break; + case 36: + t = jj_consume_token(36); + break; + case 16: + t = jj_consume_token(16); + break; + case 6: + t = jj_consume_token(6); + break; + default: + jj_la1[70] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t;} + throw new Error("Missing return statement in function"); + } + + final private boolean jj_2_1(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_1(); + jj_save(0, xla); + return retval; + } + + final private boolean jj_2_2(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_2(); + jj_save(1, xla); + return retval; + } + + final private boolean jj_2_3(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_3(); + jj_save(2, xla); + return retval; + } + + final private boolean jj_2_4(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_4(); + jj_save(3, xla); + return retval; + } + + final private boolean jj_2_5(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_5(); + jj_save(4, xla); + return retval; + } + + final private boolean jj_2_6(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_6(); + jj_save(5, xla); + return retval; + } + + final private boolean jj_2_7(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_7(); + jj_save(6, xla); + return retval; + } + + final private boolean jj_2_8(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_8(); + jj_save(7, xla); + return retval; + } + + final private boolean jj_3R_92() { + if (jj_scan_token(7)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_91() { + if (jj_scan_token(5)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_90() { + if (jj_scan_token(19)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_89() { + if (jj_scan_token(33)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_88() { + if (jj_scan_token(34)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_87() { + if (jj_scan_token(18)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_86() { + if (jj_scan_token(17)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_85() { + if (jj_scan_token(10)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_84() { + if (jj_scan_token(32)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_83() { + if (jj_scan_token(31)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_82() { + if (jj_scan_token(13)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_81() { + if (jj_scan_token(27)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_80() { + if (jj_scan_token(26)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_79() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_80()) { + jj_scanpos = xsp; + if (jj_3R_81()) { + jj_scanpos = xsp; + if (jj_3R_82()) { + jj_scanpos = xsp; + if (jj_3R_83()) { + jj_scanpos = xsp; + if (jj_3R_84()) { + jj_scanpos = xsp; + if (jj_3R_85()) { + jj_scanpos = xsp; + if (jj_3R_86()) { + jj_scanpos = xsp; + if (jj_3R_87()) { + jj_scanpos = xsp; + if (jj_3R_88()) { + jj_scanpos = xsp; + if (jj_3R_89()) { + jj_scanpos = xsp; + if (jj_3R_90()) { + jj_scanpos = xsp; + if (jj_3R_91()) { + jj_scanpos = xsp; + if (jj_3R_92()) { + jj_scanpos = xsp; + if (jj_3R_93()) { + jj_scanpos = xsp; + if (jj_3R_94()) { + jj_scanpos = xsp; + if (jj_3R_95()) { + jj_scanpos = xsp; + if (jj_3R_96()) { + jj_scanpos = xsp; + if (jj_3R_97()) { + jj_scanpos = xsp; + if (jj_3R_98()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_30() { + if (jj_scan_token(PREFIXED_NAME)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(2)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_39() { + if (jj_3R_30()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_31() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_39()) { + jj_scanpos = xsp; + if (jj_3R_40()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_7() { + if (jj_3R_30()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_70() { + if (jj_3R_47()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_69() { + if (jj_scan_token(8)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_76() { + if (jj_scan_token(DOCUMENTATION_CONTINUE)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_8() { + if (jj_3R_31()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_68() { + if (jj_scan_token(LITERAL)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_63() { + if (jj_scan_token(1)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_67() { + if (jj_scan_token(2)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_52() { + if (jj_3R_41()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_63()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_6() { + if (jj_3R_29()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_2() { + if (jj_3R_28()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_66() { + if (jj_3R_64()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_5() { + if (jj_3R_29()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_75() { + if (jj_scan_token(DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_78() { + if (jj_3R_79()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_73() { + if (jj_scan_token(4)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_77() { + if (jj_3R_41()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_45() { + if (jj_scan_token(4)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_64() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_77()) { + jj_scanpos = xsp; + if (jj_3R_78()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_58() { + if (jj_scan_token(7)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_50() { + if (jj_3R_47()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_59() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_65()) { + jj_scanpos = xsp; + if (jj_3R_66()) { + jj_scanpos = xsp; + if (jj_3R_67()) { + jj_scanpos = xsp; + if (jj_3R_68()) { + jj_scanpos = xsp; + if (jj_3R_69()) { + jj_scanpos = xsp; + if (jj_3R_70()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_65() { + if (jj_scan_token(PREFIXED_NAME)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_72() { + if (jj_scan_token(3)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_47() { + if (jj_scan_token(1)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_59()) { jj_scanpos = xsp; break; } + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } + if (jj_scan_token(9)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_44() { + if (jj_scan_token(3)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_57() { + if (jj_scan_token(6)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_74() { + if (jj_scan_token(DOCUMENTATION)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_62() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_74()) { + jj_scanpos = xsp; + if (jj_3R_75()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + while (true) { + xsp = jj_scanpos; + if (jj_3R_76()) { jj_scanpos = xsp; break; } + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } + return false; + } + + final private boolean jj_3R_71() { + if (jj_scan_token(2)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_49() { + Token xsp; + if (jj_3R_62()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + while (true) { + xsp = jj_scanpos; + if (jj_3R_62()) { jj_scanpos = xsp; break; } + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } + return false; + } + + final private boolean jj_3R_43() { + if (jj_scan_token(2)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_46() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_56()) { + jj_scanpos = xsp; + if (jj_3R_57()) { + jj_scanpos = xsp; + if (jj_3R_58()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_42() { + if (jj_scan_token(1)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_56() { + if (jj_scan_token(5)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_55() { + if (jj_scan_token(ESCAPED_IDENTIFIER)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_54() { + if (jj_scan_token(IDENTIFIER)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_61() { + if (jj_3R_46()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_41() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_54()) { + jj_scanpos = xsp; + if (jj_3R_55()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_51() { + if (jj_scan_token(PREFIXED_NAME)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_63()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_48() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_60()) { + jj_scanpos = xsp; + if (jj_3R_61()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_60() { + if (jj_3R_41()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_71()) { + jj_scanpos = xsp; + if (jj_3R_72()) { + jj_scanpos = xsp; + if (jj_3R_73()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_36() { + if (jj_3R_49()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_50()) jj_scanpos = xsp; + else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_48()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_35() { + if (jj_3R_47()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_48()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_34() { + if (jj_3R_46()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_38() { + if (jj_3R_52()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_1() { + if (jj_3R_28()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_33() { + if (jj_3R_41()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_42()) { + jj_scanpos = xsp; + if (jj_3R_43()) { + jj_scanpos = xsp; + if (jj_3R_44()) { + jj_scanpos = xsp; + if (jj_3R_45()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_37() { + if (jj_3R_51()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_28() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_32()) { + jj_scanpos = xsp; + if (jj_3R_33()) { + jj_scanpos = xsp; + if (jj_3R_34()) { + jj_scanpos = xsp; + if (jj_3R_35()) { + jj_scanpos = xsp; + if (jj_3R_36()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_32() { + if (jj_scan_token(PREFIXED_NAME)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(1)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_29() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_37()) { + jj_scanpos = xsp; + if (jj_3R_38()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_4() { + if (jj_3R_29()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_53() { + if (jj_3R_64()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(2)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_40() { + if (jj_3R_53()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_98() { + if (jj_scan_token(6)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3_3() { + if (jj_3R_29()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_97() { + if (jj_scan_token(16)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_96() { + if (jj_scan_token(36)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_95() { + if (jj_scan_token(35)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_94() { + if (jj_scan_token(15)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + final private boolean jj_3R_93() { + if (jj_scan_token(14)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + public CompactSyntaxTokenManager token_source; + UCode_UCodeESC_CharStream jj_input_stream; + public Token token, jj_nt; + private int jj_ntk; + private Token jj_scanpos, jj_lastpos; + private int jj_la; + public boolean lookingAhead = false; + private boolean jj_semLA; + private int jj_gen; + final private int[] jj_la1 = new int[71]; + final private int[] jj_la1_0 = {0x9c0e0402,0x1e,0x2,0xe2,0x1c,0xe0,0xe0,0x0,0x0,0x0,0x8c0fe5e6,0x8c0fe5e6,0x402,0x16000,0x16000,0x8c0fe4e0,0x6000,0x8000,0x0,0x9c0e0400,0x100000,0x200000,0x400000,0x700000,0x700000,0x3800000,0x0,0x3800000,0x9e0fe4e0,0x0,0x100000,0x100000,0x9e0fe4e0,0x9c0fe4e0,0x2000000,0x40000000,0x40000000,0xe2,0xe0,0x20,0x1c,0x800,0x62,0x60,0x8000,0x40000000,0x40000000,0x800,0x0,0x0,0x0,0x8c0fe4e0,0x8c0fe4e0,0x8c0fe4e2,0x0,0x0,0x0,0x0,0x8c0fe4e0,0x2,0x8c0fe4e0,0x8c0fe4e0,0x0,0x8c0fe4e0,0x100,0x8c0fe4e0,0x100,0x100,0x100,0x100,0x8c0fe4e0,}; + final private int[] jj_la1_1 = {0x6c0091f,0x0,0x0,0x2c00900,0x0,0xc00000,0x0,0x900,0x200,0x900,0x6c0001f,0x6c0001f,0x900,0x0,0x0,0xc0001f,0x0,0x4000000,0x8000000,0x6c0001f,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x3c0001f,0x8000000,0x0,0x0,0x3c0001f,0x2c0001f,0x1000000,0x0,0x0,0xc00900,0xc00000,0xc00000,0x0,0x0,0xc00900,0xc00000,0x0,0x0,0x0,0x0,0x4000000,0x2000018,0xc00000,0xc0001f,0xc0001f,0xc0091f,0x900,0x200,0x900,0x900,0x2c0001f,0x0,0x2c0001f,0x2c0001f,0x2c00000,0x6c0001f,0x0,0x6c0001f,0x0,0x0,0x0,0x0,0x1f,}; + final private JJCalls[] jj_2_rtns = new JJCalls[8]; + private boolean jj_rescan = false; + private int jj_gc = 0; + + public CompactSyntax(java.io.InputStream stream) { + jj_input_stream = new UCode_UCodeESC_CharStream(stream, 1, 1); + token_source = new CompactSyntaxTokenManager(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public void ReInit(java.io.InputStream stream) { + jj_input_stream.ReInit(stream, 1, 1); + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public CompactSyntax(java.io.Reader stream) { + jj_input_stream = new UCode_UCodeESC_CharStream(stream, 1, 1); + token_source = new CompactSyntaxTokenManager(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public void ReInit(java.io.Reader stream) { + jj_input_stream.ReInit(stream, 1, 1); + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public CompactSyntax(CompactSyntaxTokenManager tm) { + token_source = tm; + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public void ReInit(CompactSyntaxTokenManager tm) { + token_source = tm; + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 71; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + final private Token jj_consume_token(int kind) throws ParseException { + Token oldToken; + if ((oldToken = token).next != null) token = token.next; + else token = token.next = token_source.getNextToken(); + jj_ntk = -1; + if (token.kind == kind) { + jj_gen++; + if (++jj_gc > 100) { + jj_gc = 0; + for (int i = 0; i < jj_2_rtns.length; i++) { + JJCalls c = jj_2_rtns[i]; + while (c != null) { + if (c.gen < jj_gen) c.first = null; + c = c.next; + } + } + } + return token; + } + token = oldToken; + jj_kind = kind; + throw generateParseException(); + } + + final private boolean jj_scan_token(int kind) { + if (jj_scanpos == jj_lastpos) { + jj_la--; + if (jj_scanpos.next == null) { + jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); + } else { + jj_lastpos = jj_scanpos = jj_scanpos.next; + } + } else { + jj_scanpos = jj_scanpos.next; + } + if (jj_rescan) { + int i = 0; Token tok = token; + while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } + if (tok != null) jj_add_error_token(kind, i); + } + return (jj_scanpos.kind != kind); + } + + final public Token getNextToken() { + if (token.next != null) token = token.next; + else token = token.next = token_source.getNextToken(); + jj_ntk = -1; + jj_gen++; + return token; + } + + final public Token getToken(int index) { + Token t = lookingAhead ? jj_scanpos : token; + for (int i = 0; i < index; i++) { + if (t.next != null) t = t.next; + else t = t.next = token_source.getNextToken(); + } + return t; + } + + final private int jj_ntk() { + if ((jj_nt=token.next) == null) + return (jj_ntk = (token.next=token_source.getNextToken()).kind); + else + return (jj_ntk = jj_nt.kind); + } + + private java.util.Vector jj_expentries = new java.util.Vector(); + private int[] jj_expentry; + private int jj_kind = -1; + private int[] jj_lasttokens = new int[100]; + private int jj_endpos; + + private void jj_add_error_token(int kind, int pos) { + if (pos >= 100) return; + if (pos == jj_endpos + 1) { + jj_lasttokens[jj_endpos++] = kind; + } else if (jj_endpos != 0) { + jj_expentry = new int[jj_endpos]; + for (int i = 0; i < jj_endpos; i++) { + jj_expentry[i] = jj_lasttokens[i]; + } + boolean exists = false; + for (java.util.Enumeration enumList = jj_expentries.elements(); enumList.hasMoreElements();) { + int[] oldentry = (int[])(enumList.nextElement()); + if (oldentry.length == jj_expentry.length) { + exists = true; + for (int i = 0; i < jj_expentry.length; i++) { + if (oldentry[i] != jj_expentry[i]) { + exists = false; + break; + } + } + if (exists) break; + } + } + if (!exists) jj_expentries.addElement(jj_expentry); + if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; + } + } + + final public ParseException generateParseException() { + jj_expentries.removeAllElements(); + boolean[] la1tokens = new boolean[61]; + for (int i = 0; i < 61; i++) { + la1tokens[i] = false; + } + if (jj_kind >= 0) { + la1tokens[jj_kind] = true; + jj_kind = -1; + } + for (int i = 0; i < 71; i++) { + if (jj_la1[i] == jj_gen) { + for (int j = 0; j < 32; j++) { + if ((jj_la1_0[i] & (1< jj_gen) { + jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; + switch (i) { + case 0: jj_3_1(); break; + case 1: jj_3_2(); break; + case 2: jj_3_3(); break; + case 3: jj_3_4(); break; + case 4: jj_3_5(); break; + case 5: jj_3_6(); break; + case 6: jj_3_7(); break; + case 7: jj_3_8(); break; + } + } + p = p.next; + } while (p != null); + } + jj_rescan = false; + } + + final private void jj_save(int index, int xla) { + JJCalls p = jj_2_rtns[index]; + while (p.gen > jj_gen) { + if (p.next == null) { p = p.next = new JJCalls(); break; } + p = p.next; + } + p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; + } + + static final class JJCalls { + int gen; + Token first; + int arg; + JJCalls next; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj new file mode 100644 index 0000000..c00bc06 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntax.jj @@ -0,0 +1,1933 @@ +options { + STATIC = false; + UNICODE_INPUT = true; + JAVA_UNICODE_ESCAPE = true; +} + +PARSER_BEGIN(CompactSyntax) + +package com.thaiopensource.relaxng.parse.compact; + +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.Context; + +import com.thaiopensource.xml.util.WellKnownNamespaces; + +import com.thaiopensource.util.Localizer; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.Locator; +import org.xml.sax.helpers.LocatorImpl; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; + +public class CompactSyntax implements Context { + private static final int IN_ELEMENT = 0; + private static final int IN_ATTRIBUTE = 1; + private static final int IN_ANY_NAME = 2; + private static final int IN_NS_NAME = 4; + + private String defaultNamespace = SchemaBuilder.INHERIT_NS; + private String compatibilityPrefix = null; + private SchemaBuilder sb; + private String sourceUri; + private ErrorHandler eh; + private final Hashtable namespaceTable = new Hashtable(); + private final Hashtable datatypesTable = new Hashtable(); + private boolean hadError = false; + private static final Localizer localizer = new Localizer(CompactSyntax.class); + private final Hashtable attributeNameTable = new Hashtable(); + private boolean annotationsIncludeElements = false; + + final class LocatedString { + private final String str; + private final Token tok; + + LocatedString(String str, Token tok) { + this.str = str; + this.tok = tok; + } + + String getString() { + return str; + } + + Location getLocation() { + return makeLocation(tok); + } + + Token getToken() { + return tok; + } + + } + + public CompactSyntax(Reader r, String sourceUri, SchemaBuilder sb, ErrorHandler eh) { + this(r); + this.sourceUri = sourceUri; + this.sb = sb; + this.eh = eh; + // this causes the root pattern to have non-null annotations + // which is useful because it gives a context to trang + this.topLevelComments = sb.makeCommentList(); + } + + ParsedPattern parse(Scope scope) throws IllegalSchemaException { + try { + ParsedPattern p = Input(scope); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + ParsedPattern parseInclude(IncludedGrammar g) throws IllegalSchemaException { + try { + ParsedPattern p = IncludedGrammar(g); + if (!hadError) + return p; + } + catch (ParseException e) { + error("syntax_error", e.currentToken.next); + } + catch (EscapeSyntaxException e) { + reportEscapeSyntaxException(e); + } + throw new IllegalSchemaException(); + } + + private void checkNsName(int context, LocatedString ns) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_ns_name", ns.getToken()); + } + + private void checkAnyName(int context, Token t) { + if ((context & IN_NS_NAME) != 0) + error("ns_name_except_contains_any_name", t); + if ((context & IN_ANY_NAME) != 0) + error("any_name_except_contains_any_name", t); + } + + private void error(String key, Token tok) { + doError(localizer.message(key), tok); + } + + private void error(String key, String arg, Token tok) { + doError(localizer.message(key, arg), tok); + } + + private void error(String key, String arg1, String arg2, Token tok) { + doError(localizer.message(key, arg1, arg2), tok); + } + + private void doError(String message, Token tok) { + hadError = true; + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(tok.beginLine); + loc.setColumnNumber(tok.beginColumn); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(message, loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private void reportEscapeSyntaxException(EscapeSyntaxException e) { + if (eh != null) { + LocatorImpl loc = new LocatorImpl(); + loc.setLineNumber(e.getLineNumber()); + loc.setColumnNumber(e.getColumnNumber()); + loc.setSystemId(sourceUri); + try { + eh.error(new SAXParseException(localizer.message(e.getKey()), loc)); + } + catch (SAXException se) { + throw new BuildException(se); + } + } + } + + private static String unquote(String s) { + if (s.length() >= 6 && s.charAt(0) == s.charAt(1)) { + s = s.replace('\u0000', '\n'); + return s.substring(3, s.length() - 3); + } + else + return s.substring(1, s.length() - 1); + } + + Location makeLocation(Token t) { + return sb.makeLocation(sourceUri, t.beginLine, t.beginColumn); + } + + private static ParsedPattern[] addPattern(ParsedPattern[] patterns, int i, ParsedPattern p) { + if (i >= patterns.length) { + ParsedPattern[] oldPatterns = patterns; + patterns = new ParsedPattern[oldPatterns.length*2]; + System.arraycopy(oldPatterns, 0, patterns, 0, oldPatterns.length); + } + patterns[i] = p; + return patterns; + } + + String getCompatibilityPrefix() { + if (compatibilityPrefix == null) { + compatibilityPrefix = "a"; + while (namespaceTable.get(compatibilityPrefix) != null) + compatibilityPrefix = compatibilityPrefix + "a"; + } + return compatibilityPrefix; + } + + public String resolveNamespacePrefix(String prefix) { + String result = (String)namespaceTable.get(prefix); + if (result.length() == 0) + return null; + return result; + } + + public Enumeration prefixes() { + return namespaceTable.keys(); + } + + public String getBaseUri() { + return sourceUri; + } + + public boolean isUnparsedEntity(String entityName) { + return false; + } + + public boolean isNotation(String notationName) { + return false; + } + + public Context copy() { + return this; + } + + private Context getContext() { + return this; + } + + private CommentList getComments() { + return getComments(getTopLevelComments()); + } + + private CommentList topLevelComments; + + private CommentList getTopLevelComments() { + CommentList tem = topLevelComments; + topLevelComments = null; + return tem; + } + + private void noteTopLevelComments() { + topLevelComments = getComments(topLevelComments); + } + + private void topLevelComments(GrammarSection section) { + section.topLevelComment(getComments(null)); + } + + private Token lastCommentSourceToken = null; + + private CommentList getComments(CommentList comments) { + Token nextToken = getToken(1); + if (lastCommentSourceToken != nextToken) { + if (lastCommentSourceToken == null) + lastCommentSourceToken = token; + do { + lastCommentSourceToken = lastCommentSourceToken.next; + Token t = lastCommentSourceToken.specialToken; + if (t != null) { + while (t.specialToken != null) + t = t.specialToken; + if (comments == null) + comments = sb.makeCommentList(); + for (; t != null; t = t.next) { + String s = mungeComment(t.image); + Location loc = makeLocation(t); + if (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE) { + StringBuffer buf = new StringBuffer(s); + do { + t = t.next; + buf.append('\n'); + buf.append(mungeComment(t.image)); + } while (t.next != null + && t.next.kind == CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE); + s = buf.toString(); + } + comments.addComment(s, loc); + } + } + } while (lastCommentSourceToken != nextToken); + } + return comments; + } + + private ParsedPattern afterComments(ParsedPattern p) { + CommentList comments = getComments(null); + if (comments == null) + return p; + return sb.commentAfter(p, comments); + } + + private ParsedNameClass afterComments(ParsedNameClass nc) { + CommentList comments = getComments(null); + if (comments == null) + return nc; + return sb.commentAfter(nc, comments); + } + + private static String mungeComment(String image) { + int i = image.indexOf('#') + 1; + while (i < image.length() && image.charAt(i) == '#') + i++; + if (i < image.length() && image.charAt(i) == ' ') + i++; + return image.substring(i); + } + + private Annotations getCommentsAsAnnotations() { + CommentList comments = getComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private Annotations addCommentsToChildAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + a = sb.makeAnnotations(null, getContext()); + a.addComment(comments); + return a; + } + + private Annotations addCommentsToLeadingAnnotations(Annotations a) { + CommentList comments = getComments(); + if (comments == null) + return a; + if (a == null) + return sb.makeAnnotations(comments, getContext()); + a.addLeadingComment(comments); + return a; + } + + private Annotations getTopLevelCommentsAsAnnotations() { + CommentList comments = getTopLevelComments(); + if (comments == null) + return null; + return sb.makeAnnotations(comments, getContext()); + } + + private void clearAttributeList() { + attributeNameTable.clear(); + } + + private void addAttribute(Annotations a, String ns, String localName, String prefix, String value, Token tok) { + String key = ns + "#" + localName; + if (attributeNameTable.get(key) != null) + error("duplicate_attribute", ns, localName, tok); + else { + attributeNameTable.put(key, key); + a.addAttribute(ns, localName, prefix, value, makeLocation(tok)); + } + } + + private void checkExcept(Token[] except) { + if (except[0] != null) + error("except_missing_parentheses", except[0]); + } + + private String lookupPrefix(String prefix, Token t) { + String ns = (String)namespaceTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return "#error"; + } + return ns; + } + private String lookupDatatype(String prefix, Token t) { + String ns = (String)datatypesTable.get(prefix); + if (ns == null) { + error("undeclared_prefix", prefix, t); + return ""; // XXX + } + return ns; + } + private String resolve(String str) { + try { + return new URL(new URL(sourceUri), str).toString(); + } + catch (MalformedURLException e) { } + return str; + } +} + +PARSER_END(CompactSyntax) + +ParsedPattern Input(Scope scope) : +{ + ParsedPattern p; +} +{ + Preamble() + (LOOKAHEAD(TopLevelLookahead()) p = TopLevelGrammar(scope) + | p = Expr(true, scope, null, null) { p = afterComments(p); } ) + { return p; } +} + +void TopLevelLookahead() : +{} +{ + "[" + | Identifier() ("[" | "=" | "&=" | "|=") + | LookaheadGrammarKeyword() + | LookaheadBody() LookaheadAfterAnnotations() + | LookaheadDocumentation() (LookaheadBody())? LookaheadAfterAnnotations() +} + +void LookaheadAfterAnnotations() : +{} +{ + Identifier() ("=" | "&=" | "|=") + | LookaheadGrammarKeyword() +} + +void LookaheadGrammarKeyword() : +{} +{ + "start" | "div" | "include" +} + +void LookaheadDocumentation() : +{} +{ + (( | ) ()*)+ +} + +void LookaheadBody() : +{} +{ + "[" + ( | UnprefixedName() | "=" | | "~" | LookaheadBody() )* + "]" +} + +ParsedPattern IncludedGrammar(IncludedGrammar g) : +{ + Annotations a; + ParsedPattern p; +} +{ + Preamble() + (LOOKAHEAD(TopLevelLookahead()) a = GrammarBody(g, g, getTopLevelCommentsAsAnnotations()) + | a = Annotations() "grammar" "{" a = GrammarBody(g, g, a) { topLevelComments(g); } "}") + { p = afterComments(g.endIncludedGrammar(sb.makeLocation(sourceUri, 1, 1), a)); } + + { return p; } +} + +ParsedPattern TopLevelGrammar(Scope scope) : +{ + Annotations a = getTopLevelCommentsAsAnnotations(); + Grammar g; + ParsedPattern p; +} +{ + { g = sb.makeGrammar(scope); } + a = GrammarBody(g, g, a) + { p = afterComments(g.endGrammar(sb.makeLocation(sourceUri, 1, 1), a)); } + + { return p; } +} + +void Preamble() : +{} +{ + (NamespaceDecl() | DatatypesDecl())* + { + namespaceTable.put("xml", WellKnownNamespaces.XML); + if (datatypesTable.get("xsd") == null) + datatypesTable.put("xsd", WellKnownNamespaces.XML_SCHEMA_DATATYPES); + } +} + +void NamespaceDecl() : +{ + LocatedString prefix = null; + boolean isDefault = false; + String namespaceName; +} +{ + { noteTopLevelComments(); } + (("namespace" prefix = UnprefixedName()) + | ("default" { isDefault = true; } + "namespace" (prefix = UnprefixedName())?)) + "=" + namespaceName = NamespaceName() + { + if (isDefault) + defaultNamespace = namespaceName; + if (prefix != null) { + if (prefix.getString().equals("xmlns")) + error("xmlns_prefix", prefix.getToken()); + else if (prefix.getString().equals("xml")) { + if (!namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_prefix_bad_uri", prefix.getToken()); + } + else if (namespaceName.equals(WellKnownNamespaces.XML)) + error("xml_uri_bad_prefix", prefix.getToken()); + else { + if (namespaceName.equals(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS)) + compatibilityPrefix = prefix.getString(); + namespaceTable.put(prefix.getString(), namespaceName); + } + } + } +} + +String NamespaceName() : +{ + String r; +} +{ + (r = Literal() | "inherit" { r = SchemaBuilder.INHERIT_NS; }) + { return r; } +} + +void DatatypesDecl() : +{ + LocatedString prefix; + String uri; +} +{ + { noteTopLevelComments(); } + "datatypes" prefix = UnprefixedName() "=" uri = Literal() + { + datatypesTable.put(prefix.getString(), uri); + } +} + +ParsedPattern AnnotatedPrimaryExpr(boolean topLevel, Scope scope, Token[] except) : +{ + Annotations a; + ParsedPattern p; + ParsedElementAnnotation e; + Token t; +} +{ + a = Annotations() + p = PrimaryExpr(topLevel, scope, a, except) + ( t = e = AnnotationElement(false) { + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + })* + { return p; } +} + + +ParsedPattern PrimaryExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) : +{ + ParsedPattern p; +} +{ + (p = ElementExpr(scope, a) + | p = AttributeExpr(scope, a) + | p = GrammarExpr(scope, a) + | p = ExternalRefExpr(scope, a) + | p = ListExpr(scope, a) + | p = MixedExpr(scope, a) + | p = ParenExpr(topLevel, scope, a) + | p = IdentifierExpr(scope, a) + | p = ParentExpr(scope, a) + | p = DataExpr(topLevel, scope, a, except) + | p = ValueExpr(topLevel, a) + | p = TextExpr(a) + | p = EmptyExpr(a) + | p = NotAllowedExpr(a)) + { return p; } +} + +ParsedPattern EmptyExpr(Annotations a) : +{ + Token t; +} +{ + t = "empty" + { return sb.makeEmpty(makeLocation(t), a); } +} + +ParsedPattern TextExpr(Annotations a) : +{ + Token t; +} +{ + t = "text" + { return sb.makeText(makeLocation(t), a); } +} + +ParsedPattern NotAllowedExpr(Annotations a) : +{ + Token t; +} +{ + t = "notAllowed" + { return sb.makeNotAllowed(makeLocation(t), a); } +} + +ParsedPattern Expr(boolean topLevel, Scope scope, Token t, Annotations a) : +{ + ParsedPattern p; + ParsedPattern[] patterns = new ParsedPattern[2]; + int nPatterns = 1; + boolean[] hadOccur = new boolean[1]; + Token[] except = new Token[1]; +} +{ + p = UnaryExpr(topLevel, scope, hadOccur, except) + { patterns[0] = p; } + ( + { checkExcept(except); } + (t = "|" p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeChoice(patterns, nPatterns, makeLocation(t), a); } + | (t = "&" p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeInterleave(patterns, nPatterns, makeLocation(t), a); } + | (t = "," p = UnaryExpr(topLevel, scope, null, except) + { patterns = addPattern(patterns, nPatterns++, p); checkExcept(except); } )+ + { p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); } + )? + { + if (nPatterns == 1 && a != null) { + if (hadOccur[0]) + p = sb.annotate(p, a); + else + p = sb.makeGroup(patterns, nPatterns, makeLocation(t), a); + } + return p; + } +} + +ParsedPattern UnaryExpr(boolean topLevel, Scope scope, boolean[] hadOccur, Token[] except) : +{ + ParsedPattern p; + Token t; + ParsedElementAnnotation e; +} +{ + p = AnnotatedPrimaryExpr(topLevel, scope, except) + ( + { + if (hadOccur != null) hadOccur[0] = true; + p = afterComments(p); + } + (t = "+" { checkExcept(except); p = sb.makeOneOrMore(p, makeLocation(t), null); } + | t = "?" { checkExcept(except); p = sb.makeOptional(p, makeLocation(t), null); } + | t = "*" { checkExcept(except); p = sb.makeZeroOrMore(p, makeLocation(t), null); }) + ( t = e = AnnotationElement(false) { + if (topLevel) + error("top_level_follow_annotation", t); + else + p = sb.annotateAfter(p, e); + } )* + )? + { return p; } +} + +ParsedPattern ElementExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedNameClass nc; + ParsedPattern p; +} +{ + t = "element" + nc = NameClass(IN_ELEMENT, null) + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeElement(nc, p, makeLocation(t), a); } +} + +ParsedPattern AttributeExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedNameClass nc; + ParsedPattern p; +} +{ + t = "attribute" + nc = NameClass(IN_ATTRIBUTE, null) + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeAttribute(nc, p, makeLocation(t), a); } +} + +ParsedNameClass NameClass(int context, Annotations[] pa) : +{ + Annotations a; + ParsedNameClass nc; +} +{ + a = Annotations() + (nc = PrimaryNameClass(context, a) nc = AnnotateAfter(nc) nc = NameClassAlternatives(context, nc, pa) + | nc = AnyNameExceptClass(context, a, pa) + | nc = NsNameExceptClass(context, a, pa)) + { return nc; } +} + +ParsedNameClass AnnotateAfter(ParsedNameClass nc) : +{ + ParsedElementAnnotation e; +} +{ + ( e = AnnotationElement(false) { nc = sb.annotateAfter(nc, e); })* + { return nc; } +} + +ParsedNameClass NameClassAlternatives(int context, ParsedNameClass nc, Annotations[] pa) : +{ + Token t; + ParsedNameClass[] nameClasses; + int nNameClasses; +} +{ + ( + { + nameClasses = new ParsedNameClass[2]; + nameClasses[0] = nc; + nNameClasses = 1; + } + (t = "|" nc = BasicNameClass(context) nc = AnnotateAfter(nc) + { + if (nNameClasses >= nameClasses.length) { + ParsedNameClass[] oldNameClasses = nameClasses; + nameClasses = new ParsedNameClass[oldNameClasses.length*2]; + System.arraycopy(oldNameClasses, 0, nameClasses, 0, oldNameClasses.length); + } + nameClasses[nNameClasses++] = nc; + })+ + { + Annotations a; + if (pa == null) + a = null; + else { + a = pa[0]; + pa[0] = null; + } + nc = sb.makeChoice(nameClasses, nNameClasses, makeLocation(t), a); + } + )? + { return nc; } +} + +ParsedNameClass BasicNameClass(int context) : +{ + Annotations a; + ParsedNameClass nc; +} +{ + a = Annotations() + (nc = PrimaryNameClass(context, a) + | nc = OpenNameClass(context, a)) + { return nc; } +} + +ParsedNameClass PrimaryNameClass(int context, Annotations a) : +{ + ParsedNameClass nc; +} +{ + (nc = UnprefixedNameClass(context, a) + | nc = PrefixedNameClass(a) + | nc = ParenNameClass(context, a)) + { return nc; } +} + +ParsedNameClass OpenNameClass(int context, Annotations a) : +{ + Token t; + LocatedString ns; +} +{ + ns = NsName() { checkNsName(context, ns); return sb.makeNsName(ns.getString(), ns.getLocation(), a); } + | t = "*" { checkAnyName(context, t); return sb.makeAnyName(makeLocation(t), a); } +} + + +ParsedNameClass UnprefixedNameClass(int context, Annotations a) : +{ + LocatedString name; +} +{ + name = UnprefixedName() + { + String ns; + if ((context & (IN_ATTRIBUTE|IN_ELEMENT)) == IN_ATTRIBUTE) + ns = ""; + else + ns = defaultNamespace; + return sb.makeName(ns, name.getString(), null, name.getLocation(), a); + } +} + +ParsedNameClass PrefixedNameClass(Annotations a) : +{ + Token t; +} +{ + t = + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + return sb.makeName(lookupPrefix(prefix, t), qn.substring(colon + 1), prefix, makeLocation(t), a); + } +} + +ParsedNameClass NsNameExceptClass(int context, Annotations a, Annotations[] pa) : +{ + LocatedString ns; + ParsedNameClass nc; +} +{ + ns = NsName() + { checkNsName(context, ns); } + (nc = ExceptNameClass(context | IN_NS_NAME) + { nc = sb.makeNsName(ns.getString(), nc, ns.getLocation(), a); } + nc = AnnotateAfter(nc) + | { nc = sb.makeNsName(ns.getString(), ns.getLocation(), a); } + nc = AnnotateAfter(nc) + nc = NameClassAlternatives(context, nc, pa)) + { return nc; } +} + +LocatedString NsName() : +{ + Token t; +} +{ + t = + { + String qn = t.image; + String prefix = qn.substring(0, qn.length() - 2); + return new LocatedString(lookupPrefix(prefix, t), t); + } +} + +ParsedNameClass AnyNameExceptClass(int context, Annotations a, Annotations[] pa) : +{ + Token t; + ParsedNameClass nc; +} +{ + t = "*" + { checkAnyName(context, t); } + (nc = ExceptNameClass(context | IN_ANY_NAME) + { nc = sb.makeAnyName(nc, makeLocation(t), a); } + nc = AnnotateAfter(nc) + | { nc = sb.makeAnyName(makeLocation(t), a); } + nc = AnnotateAfter(nc) + nc = NameClassAlternatives(context, nc, pa)) + { return nc; } +} + +ParsedNameClass ParenNameClass(int context, Annotations a) : +{ + Token t; + ParsedNameClass nc; + Annotations[] pa = new Annotations[]{ a }; +} +{ + t = "(" nc = NameClass(context, pa) { nc = afterComments(nc); } ")" + { + if (pa[0] != null) + nc = sb.makeChoice(new ParsedNameClass[] { nc }, 1, makeLocation(t), pa[0]); + return nc; + } +} + +ParsedNameClass ExceptNameClass(int context) : +{ + ParsedNameClass nc; +} +{ + "-" nc = BasicNameClass(context) + { return nc; } +} + +ParsedPattern ListExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "list" + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeList(p, makeLocation(t), a); } +} + +ParsedPattern MixedExpr(Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "mixed" + "{" + p = Expr(false, scope, null, null) + { p = afterComments(p); } + "}" + { return sb.makeMixed(p, makeLocation(t), a); } +} + +ParsedPattern GrammarExpr(Scope scope, Annotations a) : +{ + Token t; + Grammar g; +} +{ + t = "grammar" { g = sb.makeGrammar(scope); } + "{" a = GrammarBody(g, g, a) { topLevelComments(g); } "}" + { return g.endGrammar(makeLocation(t), a); } +} + +ParsedPattern ParenExpr(boolean topLevel, Scope scope, Annotations a) : +{ + Token t; + ParsedPattern p; +} +{ + t = "(" p = Expr(topLevel, scope, t, a) { p = afterComments(p); } ")" + { return p; } +} + +Annotations GrammarBody(GrammarSection section, Scope scope, Annotations a) : +{ + ParsedElementAnnotation e; +} +{ + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() + { if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); })* + (GrammarComponent(section, scope))* + { return a; } +} + +void GrammarComponent(GrammarSection section, Scope scope) : +{ + ParsedElementAnnotation e; + Annotations a; +} +{ + (a = Annotations() + (Definition(section, scope, a) + | Include(section, scope, a) + | Div(section, scope, a))) + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() { section.topLevelAnnotation(e); })* +} + +void Definition(GrammarSection section, Scope scope, Annotations a) : +{} +{ + (Define(section, scope, a) | Start(section, scope, a)) +} + +void Start(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + GrammarSection.Combine combine; + ParsedPattern p; +} +{ + t = "start" combine = AssignOp() p = Expr(false, scope, null, null) + { section.define(GrammarSection.START, combine, p, makeLocation(t), a); } +} + +void Define(GrammarSection section, Scope scope, Annotations a) : +{ + LocatedString name; + GrammarSection.Combine combine; + ParsedPattern p; +} +{ + name = Identifier() combine = AssignOp() p = Expr(false, scope, null, null) + { section.define(name.getString(), combine, p, name.getLocation(), a); } +} + +GrammarSection.Combine AssignOp() : +{} +{ + "=" { return null; } + | "|=" { return GrammarSection.COMBINE_CHOICE; } + | "&=" { return GrammarSection.COMBINE_INTERLEAVE; } +} + +void Include(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + String href; + String ns; + Include include = section.makeInclude(); +} +{ + t = "include" href = Literal() + ns = Inherit() + ("{" a = IncludeBody(include, scope, a) { topLevelComments(include); } "}")? + { + try { + include.endInclude(resolve(href), ns, makeLocation(t), a); + } + catch (IllegalSchemaException e) { } + } +} + +Annotations IncludeBody(GrammarSection section, Scope scope, Annotations a) : +{ + ParsedElementAnnotation e; +} +{ + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() + { if (a == null) a = sb.makeAnnotations(null, getContext()); a.addElement(e); })* + (IncludeComponent(section, scope))* + { return a; } +} + + +void IncludeComponent(GrammarSection section, Scope scope) : +{ + ParsedElementAnnotation e; + Annotations a; +} +{ + (a = Annotations() (Definition(section, scope, a) + | IncludeDiv(section, scope, a))) + (LOOKAHEAD(2) e = AnnotationElementNotKeyword() { section.topLevelAnnotation(e); })* +} + +void Div(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + Div div = section.makeDiv(); +} +{ + t = "div" "{" a = GrammarBody(div, scope, a) { topLevelComments(div); } "}" + { div.endDiv(makeLocation(t), a); } +} + +void IncludeDiv(GrammarSection section, Scope scope, Annotations a) : +{ + Token t; + Div div = section.makeDiv(); +} +{ + t = "div" "{" a = IncludeBody(div, scope, a) { topLevelComments(div); } "}" + { div.endDiv(makeLocation(t), a); } +} + +ParsedPattern ExternalRefExpr(Scope scope, Annotations a) : +{ + Token t; + String href; + String ns; +} +{ + t = "external" href = Literal() + ns = Inherit() + { + try { + return sb.makeExternalRef(resolve(href), ns, scope, makeLocation(t), a); + } + catch (IllegalSchemaException e) { + return sb.makeErrorPattern(); + } + } +} + +String Inherit() : +{ + String ns = null; +} +{ + ("inherit" "=" ns = Prefix())? + { + if (ns == null) + ns = defaultNamespace; + return ns; + } +} + +ParsedPattern ParentExpr(Scope scope, Annotations a) : +{ + LocatedString name; +} +{ + "parent" { a = addCommentsToChildAnnotations(a); } name = Identifier() + { + return scope.makeParentRef(name.getString(), name.getLocation(), a); + } +} + +ParsedPattern IdentifierExpr(Scope scope, Annotations a) : +{ + LocatedString name; +} +{ + name = Identifier() + { + return scope.makeRef(name.getString(), name.getLocation(), a); + } +} + +ParsedPattern ValueExpr(boolean topLevel, Annotations a) : +{ + LocatedString s; +} +{ + s = LocatedLiteral() + { + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", s.getToken()); + a = null; + } + return sb.makeValue("", "token", s.getString(), getContext(), defaultNamespace, s.getLocation(), a); + } +} + +ParsedPattern DataExpr(boolean topLevel, Scope scope, Annotations a, Token[] except) : +{ + Token datatypeToken; + Location loc; + String datatype; + String datatypeUri = null; + String s = null; + ParsedPattern e = null; + DataPatternBuilder dpb; +} +{ + datatypeToken = DatatypeName() + { + datatype = datatypeToken.image; + loc = makeLocation(datatypeToken); + int colon = datatype.indexOf(':'); + if (colon < 0) + datatypeUri = ""; + else { + String prefix = datatype.substring(0, colon); + datatypeUri = lookupDatatype(prefix, datatypeToken); + datatype = datatype.substring(colon + 1); + } + } + ((s = Literal() + { + if (topLevel && annotationsIncludeElements) { + error("top_level_follow_annotation", datatypeToken); + a = null; + } + return sb.makeValue(datatypeUri, datatype, s, getContext(), defaultNamespace, loc, a); + } + ) + | ( { dpb = sb.makeDataPatternBuilder(datatypeUri, datatype, loc); } + ( (Params(dpb) (e = Except(scope, except))?) + | (e = Except(scope, except))?) + { return e == null ? dpb.makePattern(loc, a) : dpb.makePattern(e, loc, a); })) +} + +Token DatatypeName() : +{ + Token t; +} +{ + (t = "string" | t = "token" | t = ) + { return t; } +} + +LocatedString Identifier() : +{ + LocatedString s; + Token t; +} +{ + (t = { s = new LocatedString(t.image, t); } + | t = { s = new LocatedString(t.image.substring(1), t); }) + { return s; } +} + +String Prefix() : +{ + Token t; + String prefix; +} +{ + (t = { prefix = t.image; } + | t = { prefix = t.image.substring(1); } + | t = Keyword() { prefix = t.image; }) + { return lookupPrefix(prefix, t); } +} + +LocatedString UnprefixedName() : +{ + LocatedString s; + Token t; +} +{ + (s = Identifier() + | t = Keyword() { s = new LocatedString(t.image, t); }) + { return s; } +} + +void Params(DataPatternBuilder dpb) : +{} +{ + "{" (Param(dpb))* "}" +} + +void Param(DataPatternBuilder dpb) : +{ + LocatedString name; + Annotations a; + String value; +} +{ + a = Annotations() name = UnprefixedName() "=" { a = addCommentsToLeadingAnnotations(a); } value = Literal() + { dpb.addParam(name.getString(), value, getContext(), defaultNamespace, name.getLocation(), a); } +} + +ParsedPattern Except(Scope scope, Token[] except) : +{ + Annotations a; + ParsedPattern p; + Token t; + Token[] innerExcept = new Token[1]; +} +{ + t = "-" a = Annotations() p = PrimaryExpr(false, scope, a, innerExcept) + { + checkExcept(innerExcept); + except[0] = t; + return p; + } +} + +ParsedElementAnnotation Documentation() : +{ + CommentList comments = getComments(); + ElementAnnotationBuilder eab; + Token t; + String s; +} +{ + (t = | t = ) + { + eab = sb.makeElementAnnotationBuilder(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_ANNOTATIONS, + "documentation", + getCompatibilityPrefix(), + makeLocation(t), + comments, + getContext()); + eab.addText(mungeComment(t.image), makeLocation(t), null); + } + (t = { eab.addText("\n" + mungeComment(t.image), makeLocation(t), null); })* + { return eab.makeElementAnnotation(); } +} + +Annotations Annotations() : +{ + CommentList comments = getComments(); + Annotations a = null; + ParsedElementAnnotation e; +} +{ + ( { a = sb.makeAnnotations(comments, getContext()); } + (e = Documentation() { a.addElement(e); })+ + { + comments = getComments(); + if (comments != null) + a.addLeadingComment(comments); + } + )? + ("[" { if (a == null) a = sb.makeAnnotations(comments, getContext()); clearAttributeList(); annotationsIncludeElements = false; } + (LOOKAHEAD(2) PrefixedAnnotationAttribute(a, false) )* + ( e = AnnotationElement(false) { a.addElement(e); annotationsIncludeElements = true; } )* + { a.addComment(getComments()); } + "]")? + { + if (a == null && comments != null) + a = sb.makeAnnotations(comments, getContext()); + return a; + } +} + +void AnnotationAttribute(Annotations a) : +{} +{ + PrefixedAnnotationAttribute(a, true) | UnprefixedAnnotationAttribute(a) +} + +void PrefixedAnnotationAttribute(Annotations a, boolean nested) : +{ + Token t; + String value; +} +{ + t = "=" value = Literal() + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) + error("inherited_annotation_namespace", t); + else if (ns.length() == 0 && !nested) + error("unqualified_annotation_attribute", t); + else if (ns.equals(WellKnownNamespaces.RELAX_NG) && !nested) + error("relax_ng_namespace", t); + /*else if (ns.length() == 0 + && qn.length() - colon - 1 == 5 + && qn.regionMatches(colon + 1, "xmlns", 0, 5)) + error("xmlns_annotation_attribute", t);*/ + else if (ns.equals(WellKnownNamespaces.XMLNS)) + error("xmlns_annotation_attribute_uri", t); + else { + if (ns.length() == 0) + prefix = null; + addAttribute(a, ns, qn.substring(colon + 1), prefix, value, t); + } + } +} + +void UnprefixedAnnotationAttribute(Annotations a) : +{ + LocatedString name; + String value; +} +{ + name = UnprefixedName() "=" value = Literal() + { + if (name.getString().equals("xmlns")) + error("xmlns_annotation_attribute", name.getToken()); + else + addAttribute(a, "", name.getString(), null, value, name.getToken()); + } +} + +ParsedElementAnnotation AnnotationElement(boolean nested) : +{ + ParsedElementAnnotation a; +} +{ + (a = PrefixedAnnotationElement(nested) + | a = UnprefixedAnnotationElement()) + { return a; } +} + +ParsedElementAnnotation AnnotationElementNotKeyword() : +{ + ParsedElementAnnotation a; +} +{ + (a = PrefixedAnnotationElement(false) + | a = IdentifierAnnotationElement()) + { return a; } +} + +ParsedElementAnnotation PrefixedAnnotationElement(boolean nested) : +{ + CommentList comments = getComments(); + Token t; + ElementAnnotationBuilder eab; +} +{ + t = + { + String qn = t.image; + int colon = qn.indexOf(':'); + String prefix = qn.substring(0, colon); + String ns = lookupPrefix(prefix, t); + if (ns == SchemaBuilder.INHERIT_NS) { + error("inherited_annotation_namespace", t); + ns = ""; + } + else if (!nested && ns.equals(WellKnownNamespaces.RELAX_NG)) { + error("relax_ng_namespace", t); + ns = ""; + } + else { + if (ns.length() == 0) + prefix = null; + } + eab = sb.makeElementAnnotationBuilder(ns, qn.substring(colon + 1), prefix, + makeLocation(t), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +ParsedElementAnnotation UnprefixedAnnotationElement() : +{ + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; +} +{ + name = UnprefixedName() + { + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +ParsedElementAnnotation IdentifierAnnotationElement() : +{ + CommentList comments = getComments(); + LocatedString name; + ElementAnnotationBuilder eab; +} +{ + name = Identifier() + { + eab = sb.makeElementAnnotationBuilder("", name.getString(), null, + name.getLocation(), comments, getContext()); + } + AnnotationElementContent(eab) + { return eab.makeElementAnnotation(); } +} + +void AnnotationElementContent(ElementAnnotationBuilder eab) : +{ + ParsedElementAnnotation e; +} +{ + "[" { clearAttributeList(); } + (LOOKAHEAD(2) AnnotationAttribute(eab))* + ((AnnotationElementLiteral(eab) + ("~" AnnotationElementLiteral(eab))*) + | e = AnnotationElement(true) { eab.addElement(e); })* + { eab.addComment(getComments()); } + "]" +} + +void AnnotationElementLiteral(ElementAnnotationBuilder eab) : +{ + Token t; + CommentList comments = getComments(); +} +{ + t = { eab.addText(unquote(t.image), makeLocation(t), comments); } +} + +String Literal() : +{ + Token t; + String s; + StringBuffer buf; +} +{ + t = + { + s = unquote(t.image); + } + ( + { buf = new StringBuffer(s); } + ("~" t = { buf.append(unquote(t.image)); })+ + { s = buf.toString(); } + )? + { return s; } +} + +LocatedString LocatedLiteral() : +{ + Token t; + Token t2; + String s; + StringBuffer buf; +} +{ + t = + { + s = unquote(t.image); + } + ( + { buf = new StringBuffer(s); } + ("~" t2 = { buf.append(unquote(t2.image)); })+ + { s = buf.toString(); } + )? + { return new LocatedString(s, t); } +} + +Token Keyword() : +{ + Token t; +} +{ + (t = "element" + | t = "attribute" + | t = "namespace" + | t = "list" + | t = "mixed" + | t = "grammar" + | t = "empty" + | t = "text" + | t = "parent" + | t = "external" + | t = "notAllowed" + | t = "start" + | t = "include" + | t = "default" + | t = "inherit" + | t = "string" + | t = "token" + | t = "datatypes" + | t = "div") + { return t; } +} + +<*> +SKIP: { + < #NEWLINE : [ "\u0000", "\n" ] > + | < #NOT_NEWLINE : ~[ "\u0000", "\n" ] > + | < WS: ([ "\u0000", " ", "\n", "\t" ])+ > : DEFAULT +} + +TOKEN : +{ + < DOCUMENTATION: "##" ()* > : AFTER_DOCUMENTATION +} + + +TOKEN : +{ + < DOCUMENTATION_CONTINUE: ([" ", "\t"])* > +} + +SPECIAL_TOKEN: +{ + < SINGLE_LINE_COMMENT: "#" ()* > : AFTER_SINGLE_LINE_COMMENT +} + + +TOKEN : +{ + < DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT: ([" ", "\t"])* > : AFTER_DOCUMENTATION +} + + +SPECIAL_TOKEN : +{ + < SINGLE_LINE_COMMENT_CONTINUE: ([" ", "\t"])* > +} + +TOKEN : +{ + < #BASE_CHAR : [ + "\u0041" - "\u005a", + "\u0061" - "\u007a", + "\u00c0" - "\u00d6", + "\u00d8" - "\u00f6", + "\u00f8" - "\u00ff", + "\u0100" - "\u0131", + "\u0134" - "\u013e", + "\u0141" - "\u0148", + "\u014a" - "\u017e", + "\u0180" - "\u01c3", + "\u01cd" - "\u01f0", + "\u01f4" - "\u01f5", + "\u01fa" - "\u0217", + "\u0250" - "\u02a8", + "\u02bb" - "\u02c1", + "\u0386", + "\u0388" - "\u038a", + "\u038c", + "\u038e" - "\u03a1", + "\u03a3" - "\u03ce", + "\u03d0" - "\u03d6", + "\u03da", + "\u03dc", + "\u03de", + "\u03e0", + "\u03e2" - "\u03f3", + "\u0401" - "\u040c", + "\u040e" - "\u044f", + "\u0451" - "\u045c", + "\u045e" - "\u0481", + "\u0490" - "\u04c4", + "\u04c7" - "\u04c8", + "\u04cb" - "\u04cc", + "\u04d0" - "\u04eb", + "\u04ee" - "\u04f5", + "\u04f8" - "\u04f9", + "\u0531" - "\u0556", + "\u0559", + "\u0561" - "\u0586", + "\u05d0" - "\u05ea", + "\u05f0" - "\u05f2", + "\u0621" - "\u063a", + "\u0641" - "\u064a", + "\u0671" - "\u06b7", + "\u06ba" - "\u06be", + "\u06c0" - "\u06ce", + "\u06d0" - "\u06d3", + "\u06d5", + "\u06e5" - "\u06e6", + "\u0905" - "\u0939", + "\u093d", + "\u0958" - "\u0961", + "\u0985" - "\u098c", + "\u098f" - "\u0990", + "\u0993" - "\u09a8", + "\u09aa" - "\u09b0", + "\u09b2", + "\u09b6" - "\u09b9", + "\u09dc" - "\u09dd", + "\u09df" - "\u09e1", + "\u09f0" - "\u09f1", + "\u0a05" - "\u0a0a", + "\u0a0f" - "\u0a10", + "\u0a13" - "\u0a28", + "\u0a2a" - "\u0a30", + "\u0a32" - "\u0a33", + "\u0a35" - "\u0a36", + "\u0a38" - "\u0a39", + "\u0a59" - "\u0a5c", + "\u0a5e", + "\u0a72" - "\u0a74", + "\u0a85" - "\u0a8b", + "\u0a8d", + "\u0a8f" - "\u0a91", + "\u0a93" - "\u0aa8", + "\u0aaa" - "\u0ab0", + "\u0ab2" - "\u0ab3", + "\u0ab5" - "\u0ab9", + "\u0abd", + "\u0ae0", + "\u0b05" - "\u0b0c", + "\u0b0f" - "\u0b10", + "\u0b13" - "\u0b28", + "\u0b2a" - "\u0b30", + "\u0b32" - "\u0b33", + "\u0b36" - "\u0b39", + "\u0b3d", + "\u0b5c" - "\u0b5d", + "\u0b5f" - "\u0b61", + "\u0b85" - "\u0b8a", + "\u0b8e" - "\u0b90", + "\u0b92" - "\u0b95", + "\u0b99" - "\u0b9a", + "\u0b9c", + "\u0b9e" - "\u0b9f", + "\u0ba3" - "\u0ba4", + "\u0ba8" - "\u0baa", + "\u0bae" - "\u0bb5", + "\u0bb7" - "\u0bb9", + "\u0c05" - "\u0c0c", + "\u0c0e" - "\u0c10", + "\u0c12" - "\u0c28", + "\u0c2a" - "\u0c33", + "\u0c35" - "\u0c39", + "\u0c60" - "\u0c61", + "\u0c85" - "\u0c8c", + "\u0c8e" - "\u0c90", + "\u0c92" - "\u0ca8", + "\u0caa" - "\u0cb3", + "\u0cb5" - "\u0cb9", + "\u0cde", + "\u0ce0" - "\u0ce1", + "\u0d05" - "\u0d0c", + "\u0d0e" - "\u0d10", + "\u0d12" - "\u0d28", + "\u0d2a" - "\u0d39", + "\u0d60" - "\u0d61", + "\u0e01" - "\u0e2e", + "\u0e30", + "\u0e32" - "\u0e33", + "\u0e40" - "\u0e45", + "\u0e81" - "\u0e82", + "\u0e84", + "\u0e87" - "\u0e88", + "\u0e8a", + "\u0e8d", + "\u0e94" - "\u0e97", + "\u0e99" - "\u0e9f", + "\u0ea1" - "\u0ea3", + "\u0ea5", + "\u0ea7", + "\u0eaa" - "\u0eab", + "\u0ead" - "\u0eae", + "\u0eb0", + "\u0eb2" - "\u0eb3", + "\u0ebd", + "\u0ec0" - "\u0ec4", + "\u0f40" - "\u0f47", + "\u0f49" - "\u0f69", + "\u10a0" - "\u10c5", + "\u10d0" - "\u10f6", + "\u1100", + "\u1102" - "\u1103", + "\u1105" - "\u1107", + "\u1109", + "\u110b" - "\u110c", + "\u110e" - "\u1112", + "\u113c", + "\u113e", + "\u1140", + "\u114c", + "\u114e", + "\u1150", + "\u1154" - "\u1155", + "\u1159", + "\u115f" - "\u1161", + "\u1163", + "\u1165", + "\u1167", + "\u1169", + "\u116d" - "\u116e", + "\u1172" - "\u1173", + "\u1175", + "\u119e", + "\u11a8", + "\u11ab", + "\u11ae" - "\u11af", + "\u11b7" - "\u11b8", + "\u11ba", + "\u11bc" - "\u11c2", + "\u11eb", + "\u11f0", + "\u11f9", + "\u1e00" - "\u1e9b", + "\u1ea0" - "\u1ef9", + "\u1f00" - "\u1f15", + "\u1f18" - "\u1f1d", + "\u1f20" - "\u1f45", + "\u1f48" - "\u1f4d", + "\u1f50" - "\u1f57", + "\u1f59", + "\u1f5b", + "\u1f5d", + "\u1f5f" - "\u1f7d", + "\u1f80" - "\u1fb4", + "\u1fb6" - "\u1fbc", + "\u1fbe", + "\u1fc2" - "\u1fc4", + "\u1fc6" - "\u1fcc", + "\u1fd0" - "\u1fd3", + "\u1fd6" - "\u1fdb", + "\u1fe0" - "\u1fec", + "\u1ff2" - "\u1ff4", + "\u1ff6" - "\u1ffc", + "\u2126", + "\u212a" - "\u212b", + "\u212e", + "\u2180" - "\u2182", + "\u3041" - "\u3094", + "\u30a1" - "\u30fa", + "\u3105" - "\u312c", + "\uac00" - "\ud7a3" + ] > + | < #IDEOGRAPHIC : [ + "\u4e00" - "\u9fa5", + "\u3007", + "\u3021" - "\u3029" + ] > + | < #LETTER : ( | ) > + | < #COMBINING_CHAR : [ + "\u0300" - "\u0345", + "\u0360" - "\u0361", + "\u0483" - "\u0486", + "\u0591" - "\u05a1", + "\u05a3" - "\u05b9", + "\u05bb" - "\u05bd", + "\u05bf", + "\u05c1" - "\u05c2", + "\u05c4", + "\u064b" - "\u0652", + "\u0670", + "\u06d6" - "\u06dc", + "\u06dd" - "\u06df", + "\u06e0" - "\u06e4", + "\u06e7" - "\u06e8", + "\u06ea" - "\u06ed", + "\u0901" - "\u0903", + "\u093c", + "\u093e" - "\u094c", + "\u094d", + "\u0951" - "\u0954", + "\u0962" - "\u0963", + "\u0981" - "\u0983", + "\u09bc", + "\u09be", + "\u09bf", + "\u09c0" - "\u09c4", + "\u09c7" - "\u09c8", + "\u09cb" - "\u09cd", + "\u09d7", + "\u09e2" - "\u09e3", + "\u0a02", + "\u0a3c", + "\u0a3e", + "\u0a3f", + "\u0a40" - "\u0a42", + "\u0a47" - "\u0a48", + "\u0a4b" - "\u0a4d", + "\u0a70" - "\u0a71", + "\u0a81" - "\u0a83", + "\u0abc", + "\u0abe" - "\u0ac5", + "\u0ac7" - "\u0ac9", + "\u0acb" - "\u0acd", + "\u0b01" - "\u0b03", + "\u0b3c", + "\u0b3e" - "\u0b43", + "\u0b47" - "\u0b48", + "\u0b4b" - "\u0b4d", + "\u0b56" - "\u0b57", + "\u0b82" - "\u0b83", + "\u0bbe" - "\u0bc2", + "\u0bc6" - "\u0bc8", + "\u0bca" - "\u0bcd", + "\u0bd7", + "\u0c01" - "\u0c03", + "\u0c3e" - "\u0c44", + "\u0c46" - "\u0c48", + "\u0c4a" - "\u0c4d", + "\u0c55" - "\u0c56", + "\u0c82" - "\u0c83", + "\u0cbe" - "\u0cc4", + "\u0cc6" - "\u0cc8", + "\u0cca" - "\u0ccd", + "\u0cd5" - "\u0cd6", + "\u0d02" - "\u0d03", + "\u0d3e" - "\u0d43", + "\u0d46" - "\u0d48", + "\u0d4a" - "\u0d4d", + "\u0d57", + "\u0e31", + "\u0e34" - "\u0e3a", + "\u0e47" - "\u0e4e", + "\u0eb1", + "\u0eb4" - "\u0eb9", + "\u0ebb" - "\u0ebc", + "\u0ec8" - "\u0ecd", + "\u0f18" - "\u0f19", + "\u0f35", + "\u0f37", + "\u0f39", + "\u0f3e", + "\u0f3f", + "\u0f71" - "\u0f84", + "\u0f86" - "\u0f8b", + "\u0f90" - "\u0f95", + "\u0f97", + "\u0f99" - "\u0fad", + "\u0fb1" - "\u0fb7", + "\u0fb9", + "\u20d0" - "\u20dc", + "\u20e1", + "\u302a" - "\u302f", + "\u3099", + "\u309a" + ] > + | < #DIGIT : [ + "\u0030" - "\u0039", + "\u0660" - "\u0669", + "\u06f0" - "\u06f9", + "\u0966" - "\u096f", + "\u09e6" - "\u09ef", + "\u0a66" - "\u0a6f", + "\u0ae6" - "\u0aef", + "\u0b66" - "\u0b6f", + "\u0be7" - "\u0bef", + "\u0c66" - "\u0c6f", + "\u0ce6" - "\u0cef", + "\u0d66" - "\u0d6f", + "\u0e50" - "\u0e59", + "\u0ed0" - "\u0ed9", + "\u0f20" - "\u0f29" + ] > + | < #EXTENDER : [ + "\u00b7", + "\u02d0", + "\u02d1", + "\u0387", + "\u0640", + "\u0e46", + "\u0ec6", + "\u3005", + "\u3031" - "\u3035", + "\u309d" - "\u309e", + "\u30fc" - "\u30fe" + ] > + | < #NMSTART : ( | "_") > + | < #NMCHAR : ( | | | | "." | "-" | "_") > + | < #NCNAME: ()* > +} + +TOKEN : +{ + < IDENTIFIER: > + | < ESCAPED_IDENTIFIER: "\\" > + | < PREFIX_STAR: ":*" > + | < PREFIXED_NAME: ":" > + | < LITERAL : ("\"" (~["\u0000", "\""])* "\"") + | ("'" (~["\u0000", "'"])* "'") + | ("\"\"\"" (~["\""] + | ("\"" ~["\""]) + | ("\"\"" ~["\""]))* "\"\"\"") + | ("'''" (~["'"] + | ("'" ~["'"]) + | ("''" ~["'"]))* "'''") > + | < FANNOTATE : ">>" > +} + +/* This avoids lexical errors from JavaCC. */ +<*> +TOKEN : +{ + < ILLEGAL_CHAR : [ "\u0000" - "\u0008", "\u000b" - "\uffff" ] > +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.java new file mode 100644 index 0000000..dc5855c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxConstants.java @@ -0,0 +1,100 @@ +/* Generated By:JavaCC: Do not edit this line. CompactSyntaxConstants.java */ +package com.thaiopensource.relaxng.parse.compact; + +public interface CompactSyntaxConstants { + + int EOF = 0; + int NEWLINE = 37; + int NOT_NEWLINE = 38; + int WS = 39; + int DOCUMENTATION = 40; + int DOCUMENTATION_CONTINUE = 41; + int SINGLE_LINE_COMMENT = 42; + int DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT = 43; + int SINGLE_LINE_COMMENT_CONTINUE = 44; + int BASE_CHAR = 45; + int IDEOGRAPHIC = 46; + int LETTER = 47; + int COMBINING_CHAR = 48; + int DIGIT = 49; + int EXTENDER = 50; + int NMSTART = 51; + int NMCHAR = 52; + int NCNAME = 53; + int IDENTIFIER = 54; + int ESCAPED_IDENTIFIER = 55; + int PREFIX_STAR = 56; + int PREFIXED_NAME = 57; + int LITERAL = 58; + int FANNOTATE = 59; + int ILLEGAL_CHAR = 60; + + int DEFAULT = 0; + int AFTER_SINGLE_LINE_COMMENT = 1; + int AFTER_DOCUMENTATION = 2; + + String[] tokenImage = { + "", + "\"[\"", + "\"=\"", + "\"&=\"", + "\"|=\"", + "\"start\"", + "\"div\"", + "\"include\"", + "\"~\"", + "\"]\"", + "\"grammar\"", + "\"{\"", + "\"}\"", + "\"namespace\"", + "\"default\"", + "\"inherit\"", + "\"datatypes\"", + "\"empty\"", + "\"text\"", + "\"notAllowed\"", + "\"|\"", + "\"&\"", + "\",\"", + "\"+\"", + "\"?\"", + "\"*\"", + "\"element\"", + "\"attribute\"", + "\"(\"", + "\")\"", + "\"-\"", + "\"list\"", + "\"mixed\"", + "\"external\"", + "\"parent\"", + "\"string\"", + "\"token\"", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "\">>\"", + "", + }; + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.java new file mode 100644 index 0000000..09572ef --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/CompactSyntaxTokenManager.java @@ -0,0 +1,1803 @@ +/* Generated By:JavaCC: Do not edit this line. CompactSyntaxTokenManager.java */ +package com.thaiopensource.relaxng.parse.compact; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.Context; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import com.thaiopensource.util.Localizer; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.Locator; +import org.xml.sax.helpers.LocatorImpl; +import java.util.Hashtable; +import java.util.Enumeration; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; + +public class CompactSyntaxTokenManager implements CompactSyntaxConstants +{ +private final int jjStopStringLiteralDfa_0(int pos, long active0) +{ + switch (pos) + { + case 0: + if ((active0 & 0x1f8c0fe4e0L) != 0L) + { + jjmatchedKind = 54; + return 43; + } + if ((active0 & 0x800000000000000L) != 0L) + { + jjmatchedKind = 60; + return -1; + } + return -1; + case 1: + if ((active0 & 0x1f8c0fe4e0L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 1; + return 43; + } + if ((active0 & 0x800000000000000L) != 0L) + { + if (jjmatchedPos == 0) + { + jjmatchedKind = 60; + jjmatchedPos = 0; + } + return -1; + } + return -1; + case 2: + if ((active0 & 0x1f8c0fe4a0L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 2; + return 43; + } + if ((active0 & 0x40L) != 0L) + return 43; + return -1; + case 3: + if ((active0 & 0x1f0c0be4a0L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 3; + return 43; + } + if ((active0 & 0x80040000L) != 0L) + return 43; + return -1; + case 4: + if ((active0 & 0xe0c09e480L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 4; + return 43; + } + if ((active0 & 0x1100020020L) != 0L) + return 43; + return -1; + case 5: + if ((active0 & 0x20c09e480L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 5; + return 43; + } + if ((active0 & 0xc00000000L) != 0L) + return 43; + return -1; + case 6: + if ((active0 & 0x208092000L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 6; + return 43; + } + if ((active0 & 0x400c480L) != 0L) + return 43; + return -1; + case 7: + if ((active0 & 0x8092000L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 7; + return 43; + } + if ((active0 & 0x200000000L) != 0L) + return 43; + return -1; + case 8: + if ((active0 & 0x80000L) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 8; + return 43; + } + if ((active0 & 0x8012000L) != 0L) + return 43; + return -1; + default : + return -1; + } +} +private final int jjStartNfa_0(int pos, long active0) +{ + return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); +} +private final int jjStopAtPos(int pos, int kind) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + return pos + 1; +} +private final int jjStartNfaWithStates_0(int pos, int kind, int state) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + try { curChar = input_stream.readChar(); } + catch(EOFException e) { return pos + 1; } + return jjMoveNfa_0(state, pos + 1); +} +private final int jjMoveStringLiteralDfa0_0() +{ + switch(curChar) + { + case 38: + jjmatchedKind = 21; + return jjMoveStringLiteralDfa1_0(0x8L); + case 40: + return jjStopAtPos(0, 28); + case 41: + return jjStopAtPos(0, 29); + case 42: + return jjStopAtPos(0, 25); + case 43: + return jjStopAtPos(0, 23); + case 44: + return jjStopAtPos(0, 22); + case 45: + return jjStopAtPos(0, 30); + case 61: + return jjStopAtPos(0, 2); + case 62: + return jjMoveStringLiteralDfa1_0(0x800000000000000L); + case 63: + return jjStopAtPos(0, 24); + case 91: + return jjStopAtPos(0, 1); + case 93: + return jjStopAtPos(0, 9); + case 97: + return jjMoveStringLiteralDfa1_0(0x8000000L); + case 100: + return jjMoveStringLiteralDfa1_0(0x14040L); + case 101: + return jjMoveStringLiteralDfa1_0(0x204020000L); + case 103: + return jjMoveStringLiteralDfa1_0(0x400L); + case 105: + return jjMoveStringLiteralDfa1_0(0x8080L); + case 108: + return jjMoveStringLiteralDfa1_0(0x80000000L); + case 109: + return jjMoveStringLiteralDfa1_0(0x100000000L); + case 110: + return jjMoveStringLiteralDfa1_0(0x82000L); + case 112: + return jjMoveStringLiteralDfa1_0(0x400000000L); + case 115: + return jjMoveStringLiteralDfa1_0(0x800000020L); + case 116: + return jjMoveStringLiteralDfa1_0(0x1000040000L); + case 123: + return jjStopAtPos(0, 11); + case 124: + jjmatchedKind = 20; + return jjMoveStringLiteralDfa1_0(0x10L); + case 125: + return jjStopAtPos(0, 12); + case 126: + return jjStopAtPos(0, 8); + default : + return jjMoveNfa_0(3, 0); + } +} +private final int jjMoveStringLiteralDfa1_0(long active0) +{ + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(0, active0); + return 1; + } + switch(curChar) + { + case 61: + if ((active0 & 0x8L) != 0L) + return jjStopAtPos(1, 3); + else if ((active0 & 0x10L) != 0L) + return jjStopAtPos(1, 4); + break; + case 62: + if ((active0 & 0x800000000000000L) != 0L) + return jjStopAtPos(1, 59); + break; + case 97: + return jjMoveStringLiteralDfa2_0(active0, 0x400012000L); + case 101: + return jjMoveStringLiteralDfa2_0(active0, 0x44000L); + case 105: + return jjMoveStringLiteralDfa2_0(active0, 0x180000040L); + case 108: + return jjMoveStringLiteralDfa2_0(active0, 0x4000000L); + case 109: + return jjMoveStringLiteralDfa2_0(active0, 0x20000L); + case 110: + return jjMoveStringLiteralDfa2_0(active0, 0x8080L); + case 111: + return jjMoveStringLiteralDfa2_0(active0, 0x1000080000L); + case 114: + return jjMoveStringLiteralDfa2_0(active0, 0x400L); + case 116: + return jjMoveStringLiteralDfa2_0(active0, 0x808000020L); + case 120: + return jjMoveStringLiteralDfa2_0(active0, 0x200000000L); + default : + break; + } + return jjStartNfa_0(0, active0); +} +private final int jjMoveStringLiteralDfa2_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(0, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(1, active0); + return 2; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa3_0(active0, 0x420L); + case 99: + return jjMoveStringLiteralDfa3_0(active0, 0x80L); + case 101: + return jjMoveStringLiteralDfa3_0(active0, 0x4000000L); + case 102: + return jjMoveStringLiteralDfa3_0(active0, 0x4000L); + case 104: + return jjMoveStringLiteralDfa3_0(active0, 0x8000L); + case 107: + return jjMoveStringLiteralDfa3_0(active0, 0x1000000000L); + case 109: + return jjMoveStringLiteralDfa3_0(active0, 0x2000L); + case 112: + return jjMoveStringLiteralDfa3_0(active0, 0x20000L); + case 114: + return jjMoveStringLiteralDfa3_0(active0, 0xc00000000L); + case 115: + return jjMoveStringLiteralDfa3_0(active0, 0x80000000L); + case 116: + return jjMoveStringLiteralDfa3_0(active0, 0x208090000L); + case 118: + if ((active0 & 0x40L) != 0L) + return jjStartNfaWithStates_0(2, 6, 43); + break; + case 120: + return jjMoveStringLiteralDfa3_0(active0, 0x100040000L); + default : + break; + } + return jjStartNfa_0(1, active0); +} +private final int jjMoveStringLiteralDfa3_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(1, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(2, active0); + return 3; + } + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa4_0(active0, 0x80000L); + case 97: + return jjMoveStringLiteralDfa4_0(active0, 0x14000L); + case 101: + return jjMoveStringLiteralDfa4_0(active0, 0x170000a000L); + case 105: + return jjMoveStringLiteralDfa4_0(active0, 0x800000000L); + case 108: + return jjMoveStringLiteralDfa4_0(active0, 0x80L); + case 109: + return jjMoveStringLiteralDfa4_0(active0, 0x4000400L); + case 114: + return jjMoveStringLiteralDfa4_0(active0, 0x8000020L); + case 116: + if ((active0 & 0x40000L) != 0L) + return jjStartNfaWithStates_0(3, 18, 43); + else if ((active0 & 0x80000000L) != 0L) + return jjStartNfaWithStates_0(3, 31, 43); + return jjMoveStringLiteralDfa4_0(active0, 0x20000L); + default : + break; + } + return jjStartNfa_0(2, active0); +} +private final int jjMoveStringLiteralDfa4_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(2, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(3, active0); + return 4; + } + switch(curChar) + { + case 100: + if ((active0 & 0x100000000L) != 0L) + return jjStartNfaWithStates_0(4, 32, 43); + break; + case 101: + return jjMoveStringLiteralDfa5_0(active0, 0x4000000L); + case 105: + return jjMoveStringLiteralDfa5_0(active0, 0x8000000L); + case 108: + return jjMoveStringLiteralDfa5_0(active0, 0x80000L); + case 109: + return jjMoveStringLiteralDfa5_0(active0, 0x400L); + case 110: + if ((active0 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_0(4, 36, 43); + return jjMoveStringLiteralDfa5_0(active0, 0xc00000000L); + case 114: + return jjMoveStringLiteralDfa5_0(active0, 0x200008000L); + case 115: + return jjMoveStringLiteralDfa5_0(active0, 0x2000L); + case 116: + if ((active0 & 0x20L) != 0L) + return jjStartNfaWithStates_0(4, 5, 43); + return jjMoveStringLiteralDfa5_0(active0, 0x10000L); + case 117: + return jjMoveStringLiteralDfa5_0(active0, 0x4080L); + case 121: + if ((active0 & 0x20000L) != 0L) + return jjStartNfaWithStates_0(4, 17, 43); + break; + default : + break; + } + return jjStartNfa_0(3, active0); +} +private final int jjMoveStringLiteralDfa5_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(3, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(4, active0); + return 5; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa6_0(active0, 0x400L); + case 98: + return jjMoveStringLiteralDfa6_0(active0, 0x8000000L); + case 100: + return jjMoveStringLiteralDfa6_0(active0, 0x80L); + case 103: + if ((active0 & 0x800000000L) != 0L) + return jjStartNfaWithStates_0(5, 35, 43); + break; + case 105: + return jjMoveStringLiteralDfa6_0(active0, 0x8000L); + case 108: + return jjMoveStringLiteralDfa6_0(active0, 0x84000L); + case 110: + return jjMoveStringLiteralDfa6_0(active0, 0x204000000L); + case 112: + return jjMoveStringLiteralDfa6_0(active0, 0x2000L); + case 116: + if ((active0 & 0x400000000L) != 0L) + return jjStartNfaWithStates_0(5, 34, 43); + break; + case 121: + return jjMoveStringLiteralDfa6_0(active0, 0x10000L); + default : + break; + } + return jjStartNfa_0(4, active0); +} +private final int jjMoveStringLiteralDfa6_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(4, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(5, active0); + return 6; + } + switch(curChar) + { + case 97: + return jjMoveStringLiteralDfa7_0(active0, 0x200002000L); + case 101: + if ((active0 & 0x80L) != 0L) + return jjStartNfaWithStates_0(6, 7, 43); + break; + case 111: + return jjMoveStringLiteralDfa7_0(active0, 0x80000L); + case 112: + return jjMoveStringLiteralDfa7_0(active0, 0x10000L); + case 114: + if ((active0 & 0x400L) != 0L) + return jjStartNfaWithStates_0(6, 10, 43); + break; + case 116: + if ((active0 & 0x4000L) != 0L) + return jjStartNfaWithStates_0(6, 14, 43); + else if ((active0 & 0x8000L) != 0L) + return jjStartNfaWithStates_0(6, 15, 43); + else if ((active0 & 0x4000000L) != 0L) + return jjStartNfaWithStates_0(6, 26, 43); + break; + case 117: + return jjMoveStringLiteralDfa7_0(active0, 0x8000000L); + default : + break; + } + return jjStartNfa_0(5, active0); +} +private final int jjMoveStringLiteralDfa7_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(5, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(6, active0); + return 7; + } + switch(curChar) + { + case 99: + return jjMoveStringLiteralDfa8_0(active0, 0x2000L); + case 101: + return jjMoveStringLiteralDfa8_0(active0, 0x10000L); + case 108: + if ((active0 & 0x200000000L) != 0L) + return jjStartNfaWithStates_0(7, 33, 43); + break; + case 116: + return jjMoveStringLiteralDfa8_0(active0, 0x8000000L); + case 119: + return jjMoveStringLiteralDfa8_0(active0, 0x80000L); + default : + break; + } + return jjStartNfa_0(6, active0); +} +private final int jjMoveStringLiteralDfa8_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(6, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(7, active0); + return 8; + } + switch(curChar) + { + case 101: + if ((active0 & 0x2000L) != 0L) + return jjStartNfaWithStates_0(8, 13, 43); + else if ((active0 & 0x8000000L) != 0L) + return jjStartNfaWithStates_0(8, 27, 43); + return jjMoveStringLiteralDfa9_0(active0, 0x80000L); + case 115: + if ((active0 & 0x10000L) != 0L) + return jjStartNfaWithStates_0(8, 16, 43); + break; + default : + break; + } + return jjStartNfa_0(7, active0); +} +private final int jjMoveStringLiteralDfa9_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(7, old0); + try { curChar = input_stream.readChar(); } + catch(EOFException e) { + jjStopStringLiteralDfa_0(8, active0); + return 9; + } + switch(curChar) + { + case 100: + if ((active0 & 0x80000L) != 0L) + return jjStartNfaWithStates_0(9, 19, 43); + break; + default : + break; + } + return jjStartNfa_0(8, active0); +} +private final void jjCheckNAdd(int state) +{ + if (jjrounds[state] != jjround) + { + jjstateSet[jjnewStateCnt++] = state; + jjrounds[state] = jjround; + } +} +private final void jjAddStates(int start, int end) +{ + do { + jjstateSet[jjnewStateCnt++] = jjnextStates[start]; + } while (start++ != end); +} +private final void jjCheckNAddTwoStates(int state1, int state2) +{ + jjCheckNAdd(state1); + jjCheckNAdd(state2); +} +private final void jjCheckNAddStates(int start, int end) +{ + do { + jjCheckNAdd(jjnextStates[start]); + } while (start++ != end); +} +private final void jjCheckNAddStates(int start) +{ + jjCheckNAdd(jjnextStates[start]); + jjCheckNAdd(jjnextStates[start + 1]); +} +static final long[] jjbitVec0 = { + 0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL +}; +static final long[] jjbitVec2 = { + 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL +}; +static final long[] jjbitVec3 = { + 0x0L, 0xffffffffffffc000L, 0xfffff0007fffffffL, 0x7fffffL +}; +static final long[] jjbitVec4 = { + 0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL +}; +static final long[] jjbitVec5 = { + 0x7ff3ffffffffffffL, 0x7ffffffffffffdfeL, 0xffffffffffffffffL, 0xfc31ffffffffe00fL +}; +static final long[] jjbitVec6 = { + 0xffffffL, 0xffffffffffff0000L, 0xf80001ffffffffffL, 0x3L +}; +static final long[] jjbitVec7 = { + 0x0L, 0x0L, 0xfffffffbffffd740L, 0xffffd547f7fffL +}; +static final long[] jjbitVec8 = { + 0xffffffffffffdffeL, 0xffffffffdffeffffL, 0xffffffffffff0003L, 0x33fcfffffff199fL +}; +static final long[] jjbitVec9 = { + 0xfffe000000000000L, 0xfffffffe027fffffL, 0x7fL, 0x707ffffff0000L +}; +static final long[] jjbitVec10 = { + 0x7fffffe00000000L, 0xfffe0000000007feL, 0x7cffffffffffffffL, 0x60002f7fffL +}; +static final long[] jjbitVec11 = { + 0x23ffffffffffffe0L, 0x3ff000000L, 0x3c5fdfffff99fe0L, 0x30003b0000000L +}; +static final long[] jjbitVec12 = { + 0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100000000L +}; +static final long[] jjbitVec13 = { + 0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L +}; +static final long[] jjbitVec14 = { + 0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L +}; +static final long[] jjbitVec15 = { + 0x3fffdfffffddfe0L, 0x300000000L, 0x0L, 0x0L +}; +static final long[] jjbitVec16 = { + 0xd7ffffffffffeL, 0x3fL, 0x200d6caefef02596L, 0x1fL +}; +static final long[] jjbitVec17 = { + 0x0L, 0x3fffffffeffL, 0x0L, 0x0L +}; +static final long[] jjbitVec18 = { + 0x0L, 0x0L, 0xffffffff00000000L, 0x7fffffffff003fL +}; +static final long[] jjbitVec19 = { + 0x500000000007daedL, 0x2c62ab82315001L, 0xf580c90040000000L, 0x201080000000007L +}; +static final long[] jjbitVec20 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL +}; +static final long[] jjbitVec21 = { + 0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL +}; +static final long[] jjbitVec22 = { + 0x4c4000000000L, 0x0L, 0x7L, 0x0L +}; +static final long[] jjbitVec23 = { + 0x3fe00000080L, 0xfffffffffffffffeL, 0xfffffffe001fffffL, 0x7ffffffffffffffL +}; +static final long[] jjbitVec24 = { + 0x1fffffffffe0L, 0x0L, 0x0L, 0x0L +}; +static final long[] jjbitVec25 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L +}; +static final long[] jjbitVec26 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L +}; +static final long[] jjbitVec27 = { + 0x0L, 0x0L, 0x80000000000000L, 0xff7fffffff7fffffL +}; +static final long[] jjbitVec28 = { + 0xffffffL, 0xffffffffffff0000L, 0xf80001ffffffffffL, 0x30003L +}; +static final long[] jjbitVec29 = { + 0xffffffffffffffffL, 0x30000003fL, 0xfffffffbffffd7c0L, 0xffffd547f7fffL +}; +static final long[] jjbitVec30 = { + 0xffffffffffffdffeL, 0xffffffffdffeffffL, 0xffffffffffff007bL, 0x33fcfffffff199fL +}; +static final long[] jjbitVec31 = { + 0xfffe000000000000L, 0xfffffffe027fffffL, 0xbbfffffbfffe007fL, 0x707ffffff0016L +}; +static final long[] jjbitVec32 = { + 0x7fffffe00000000L, 0xffff03ff0007ffffL, 0x7cffffffffffffffL, 0x3ff3dffffef7fffL +}; +static final long[] jjbitVec33 = { + 0xf3ffffffffffffeeL, 0xffcfff1e3fffL, 0xd3c5fdfffff99feeL, 0x3ffcfb080399fL +}; +static final long[] jjbitVec34 = { + 0xd36dfdfffff987e4L, 0x1fffc05e003987L, 0xf3edfdfffffbafeeL, 0xffc100003bbfL +}; +static final long[] jjbitVec35 = { + 0xf3cdfdfffff99feeL, 0xffc3b0c0398fL, 0xc3bfc718d63dc7ecL, 0xff8000803dc7L +}; +static final long[] jjbitVec36 = { + 0xc3effdfffffddfeeL, 0xffc300603ddfL, 0xc3effdfffffddfecL, 0xffc340603ddfL +}; +static final long[] jjbitVec37 = { + 0xc3fffdfffffddfecL, 0xffc300803dcfL, 0x0L, 0x0L +}; +static final long[] jjbitVec38 = { + 0x7ff7ffffffffffeL, 0x3ff7fffL, 0x3bff6caefef02596L, 0x3ff3f5fL +}; +static final long[] jjbitVec39 = { + 0xc2a003ff03000000L, 0xfffe03fffffffeffL, 0x2fe3ffffebf0fdfL, 0x0L +}; +static final long[] jjbitVec40 = { + 0x0L, 0x0L, 0x0L, 0x21fff0000L +}; +static final long[] jjbitVec41 = { + 0x3efffe000000a0L, 0xfffffffffffffffeL, 0xfffffffe661fffffL, 0x77ffffffffffffffL +}; +private final int jjMoveNfa_0(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 43; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 3: + if ((0xfffffffffffff9ffL & l) != 0L) + { + if (kind > 60) + kind = 60; + } + if ((0x100000601L & l) != 0L) + { + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + } + else if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 31; + else if (curChar == 34) + jjstateSet[jjnewStateCnt++] = 22; + else if (curChar == 35) + { + if (kind > 42) + kind = 42; + jjCheckNAdd(5); + } + if (curChar == 39) + jjCheckNAddTwoStates(13, 14); + else if (curChar == 34) + jjCheckNAddTwoStates(10, 11); + else if (curChar == 35) + jjstateSet[jjnewStateCnt++] = 1; + break; + case 43: + if ((0x3ff600000000000L & l) != 0L) + jjCheckNAddTwoStates(39, 40); + else if (curChar == 58) + jjstateSet[jjnewStateCnt++] = 41; + if ((0x3ff600000000000L & l) != 0L) + jjCheckNAddTwoStates(36, 38); + else if (curChar == 58) + jjstateSet[jjnewStateCnt++] = 37; + if ((0x3ff600000000000L & l) != 0L) + { + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + } + break; + case 0: + if ((0x100000601L & l) == 0L) + break; + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + break; + case 1: + if (curChar != 35) + break; + if (kind > 40) + kind = 40; + jjCheckNAdd(2); + break; + case 2: + if ((0xfffffffffffffbfeL & l) == 0L) + break; + if (kind > 40) + kind = 40; + jjCheckNAdd(2); + break; + case 4: + if (curChar != 35) + break; + if (kind > 42) + kind = 42; + jjCheckNAdd(5); + break; + case 5: + if ((0xfffffffffffffbfeL & l) == 0L) + break; + if (kind > 42) + kind = 42; + jjCheckNAdd(5); + break; + case 8: + if ((0x3ff600000000000L & l) == 0L) + break; + if (kind > 55) + kind = 55; + jjstateSet[jjnewStateCnt++] = 8; + break; + case 9: + if (curChar == 34) + jjCheckNAddTwoStates(10, 11); + break; + case 10: + if ((0xfffffffbfffffffeL & l) != 0L) + jjCheckNAddTwoStates(10, 11); + break; + case 11: + case 20: + if (curChar == 34 && kind > 58) + kind = 58; + break; + case 12: + if (curChar == 39) + jjCheckNAddTwoStates(13, 14); + break; + case 13: + if ((0xffffff7ffffffffeL & l) != 0L) + jjCheckNAddTwoStates(13, 14); + break; + case 14: + case 29: + if (curChar == 39 && kind > 58) + kind = 58; + break; + case 15: + if (curChar == 34) + jjCheckNAddStates(0, 2); + break; + case 16: + if ((0xfffffffbffffffffL & l) != 0L) + jjCheckNAddStates(0, 2); + break; + case 17: + case 19: + if (curChar == 34) + jjCheckNAdd(16); + break; + case 18: + if (curChar == 34) + jjAddStates(3, 4); + break; + case 21: + if (curChar == 34) + jjstateSet[jjnewStateCnt++] = 20; + break; + case 22: + if (curChar == 34) + jjstateSet[jjnewStateCnt++] = 15; + break; + case 23: + if (curChar == 34) + jjstateSet[jjnewStateCnt++] = 22; + break; + case 24: + if (curChar == 39) + jjCheckNAddStates(5, 7); + break; + case 25: + if ((0xffffff7fffffffffL & l) != 0L) + jjCheckNAddStates(5, 7); + break; + case 26: + case 28: + if (curChar == 39) + jjCheckNAdd(25); + break; + case 27: + if (curChar == 39) + jjAddStates(8, 9); + break; + case 30: + if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 29; + break; + case 31: + if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 24; + break; + case 32: + if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 31; + break; + case 33: + if ((0xfffffffffffff9ffL & l) != 0L && kind > 60) + kind = 60; + break; + case 35: + if ((0x3ff600000000000L & l) == 0L) + break; + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + break; + case 36: + if ((0x3ff600000000000L & l) != 0L) + jjCheckNAddTwoStates(36, 38); + break; + case 37: + if (curChar == 42 && kind > 56) + kind = 56; + break; + case 38: + if (curChar == 58) + jjstateSet[jjnewStateCnt++] = 37; + break; + case 39: + if ((0x3ff600000000000L & l) != 0L) + jjCheckNAddTwoStates(39, 40); + break; + case 40: + if (curChar == 58) + jjstateSet[jjnewStateCnt++] = 41; + break; + case 42: + if ((0x3ff600000000000L & l) == 0L) + break; + if (kind > 57) + kind = 57; + jjstateSet[jjnewStateCnt++] = 42; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 3: + if (kind > 60) + kind = 60; + if ((0x7fffffe87fffffeL & l) != 0L) + { + if (kind > 54) + kind = 54; + jjCheckNAddStates(10, 14); + } + else if (curChar == 92) + jjstateSet[jjnewStateCnt++] = 7; + break; + case 43: + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddTwoStates(39, 40); + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddTwoStates(36, 38); + if ((0x7fffffe87fffffeL & l) != 0L) + { + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + } + break; + case 2: + if (kind > 40) + kind = 40; + jjstateSet[jjnewStateCnt++] = 2; + break; + case 5: + if (kind > 42) + kind = 42; + jjstateSet[jjnewStateCnt++] = 5; + break; + case 6: + if (curChar == 92) + jjstateSet[jjnewStateCnt++] = 7; + break; + case 7: + case 8: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 55) + kind = 55; + jjCheckNAdd(8); + break; + case 10: + jjAddStates(15, 16); + break; + case 13: + jjAddStates(17, 18); + break; + case 16: + jjAddStates(0, 2); + break; + case 25: + jjAddStates(5, 7); + break; + case 33: + if (kind > 60) + kind = 60; + break; + case 34: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 54) + kind = 54; + jjCheckNAddStates(10, 14); + break; + case 35: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + break; + case 36: + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddTwoStates(36, 38); + break; + case 39: + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddTwoStates(39, 40); + break; + case 41: + case 42: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 57) + kind = 57; + jjCheckNAdd(42); + break; + default : break; + } + } while(i != startsAt); + } + else + { + int hiByte = (int)(curChar >> 8); + int i1 = hiByte >> 6; + long l1 = 1L << (hiByte & 077); + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 3: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + { + if (kind > 60) + kind = 60; + } + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + { + if (kind > 54) + kind = 54; + jjCheckNAddStates(10, 14); + } + break; + case 43: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + { + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + } + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + jjCheckNAddTwoStates(36, 38); + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + jjCheckNAddTwoStates(39, 40); + break; + case 2: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 40) + kind = 40; + jjstateSet[jjnewStateCnt++] = 2; + break; + case 5: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 42) + kind = 42; + jjstateSet[jjnewStateCnt++] = 5; + break; + case 7: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) + break; + if (kind > 55) + kind = 55; + jjCheckNAdd(8); + break; + case 8: + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) + break; + if (kind > 55) + kind = 55; + jjCheckNAdd(8); + break; + case 10: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + jjAddStates(15, 16); + break; + case 13: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + jjAddStates(17, 18); + break; + case 16: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + jjAddStates(0, 2); + break; + case 25: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + jjAddStates(5, 7); + break; + case 33: + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 60) + kind = 60; + break; + case 34: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) + break; + if (kind > 54) + kind = 54; + jjCheckNAddStates(10, 14); + break; + case 35: + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) + break; + if (kind > 54) + kind = 54; + jjCheckNAdd(35); + break; + case 36: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + jjCheckNAddTwoStates(36, 38); + break; + case 39: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + jjCheckNAddTwoStates(39, 40); + break; + case 41: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) + break; + if (kind > 57) + kind = 57; + jjCheckNAdd(42); + break; + case 42: + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) + break; + if (kind > 57) + kind = 57; + jjCheckNAdd(42); + break; + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 43 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(EOFException e) { return curPos; } + } +} +private final int jjMoveStringLiteralDfa0_1() +{ + return jjMoveNfa_1(1, 0); +} +private final int jjMoveNfa_1(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 10; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if ((0xfffffffffffff9ffL & l) != 0L) + { + if (kind > 60) + kind = 60; + } + if ((0x100000601L & l) != 0L) + { + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + } + if ((0x401L & l) != 0L) + jjCheckNAddStates(19, 22); + break; + case 0: + if ((0x100000601L & l) == 0L) + break; + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + break; + case 2: + if ((0x401L & l) != 0L) + jjCheckNAddStates(19, 22); + break; + case 3: + if ((0x100000200L & l) != 0L) + jjCheckNAddTwoStates(3, 6); + break; + case 4: + if (curChar != 35) + break; + if (kind > 43) + kind = 43; + jjCheckNAdd(5); + break; + case 5: + if ((0xfffffffffffffbfeL & l) == 0L) + break; + if (kind > 43) + kind = 43; + jjCheckNAdd(5); + break; + case 6: + if (curChar == 35) + jjstateSet[jjnewStateCnt++] = 4; + break; + case 7: + if ((0x100000200L & l) != 0L) + jjCheckNAddTwoStates(7, 8); + break; + case 8: + if (curChar != 35) + break; + if (kind > 44) + kind = 44; + jjCheckNAdd(9); + break; + case 9: + if ((0xfffffffffffffbfeL & l) == 0L) + break; + if (kind > 44) + kind = 44; + jjCheckNAdd(9); + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if (kind > 60) + kind = 60; + break; + case 5: + if (kind > 43) + kind = 43; + jjstateSet[jjnewStateCnt++] = 5; + break; + case 9: + if (kind > 44) + kind = 44; + jjstateSet[jjnewStateCnt++] = 9; + break; + default : break; + } + } while(i != startsAt); + } + else + { + int hiByte = (int)(curChar >> 8); + int i1 = hiByte >> 6; + long l1 = 1L << (hiByte & 077); + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 60) + kind = 60; + break; + case 5: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 43) + kind = 43; + jjstateSet[jjnewStateCnt++] = 5; + break; + case 9: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 44) + kind = 44; + jjstateSet[jjnewStateCnt++] = 9; + break; + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 10 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(EOFException e) { return curPos; } + } +} +private final int jjMoveStringLiteralDfa0_2() +{ + return jjMoveNfa_2(1, 0); +} +private final int jjMoveNfa_2(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 7; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if ((0xfffffffffffff9ffL & l) != 0L) + { + if (kind > 60) + kind = 60; + } + if ((0x100000601L & l) != 0L) + { + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + } + if ((0x401L & l) != 0L) + jjCheckNAddTwoStates(2, 5); + break; + case 0: + if ((0x100000601L & l) == 0L) + break; + if (kind > 39) + kind = 39; + jjCheckNAdd(0); + break; + case 2: + if ((0x100000200L & l) != 0L) + jjCheckNAddTwoStates(2, 5); + break; + case 3: + if (curChar != 35) + break; + if (kind > 41) + kind = 41; + jjCheckNAdd(4); + break; + case 4: + if ((0xfffffffffffffbfeL & l) == 0L) + break; + if (kind > 41) + kind = 41; + jjCheckNAdd(4); + break; + case 5: + if (curChar == 35) + jjstateSet[jjnewStateCnt++] = 3; + break; + case 6: + if ((0xfffffffffffff9ffL & l) != 0L && kind > 60) + kind = 60; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if (kind > 60) + kind = 60; + break; + case 4: + if (kind > 41) + kind = 41; + jjstateSet[jjnewStateCnt++] = 4; + break; + default : break; + } + } while(i != startsAt); + } + else + { + int hiByte = (int)(curChar >> 8); + int i1 = hiByte >> 6; + long l1 = 1L << (hiByte & 077); + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 1: + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 60) + kind = 60; + break; + case 4: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 41) + kind = 41; + jjstateSet[jjnewStateCnt++] = 4; + break; + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 7 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(EOFException e) { return curPos; } + } +} +static final int[] jjnextStates = { + 16, 17, 18, 19, 21, 25, 26, 27, 28, 30, 35, 36, 38, 39, 40, 10, + 11, 13, 14, 3, 6, 7, 8, +}; +private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2) +{ + switch(hiByte) + { + case 0: + return ((jjbitVec2[i2] & l2) != 0L); + default : + if ((jjbitVec0[i1] & l1) != 0L) + return true; + return false; + } +} +private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2) +{ + switch(hiByte) + { + case 0: + return ((jjbitVec4[i2] & l2) != 0L); + case 1: + return ((jjbitVec5[i2] & l2) != 0L); + case 2: + return ((jjbitVec6[i2] & l2) != 0L); + case 3: + return ((jjbitVec7[i2] & l2) != 0L); + case 4: + return ((jjbitVec8[i2] & l2) != 0L); + case 5: + return ((jjbitVec9[i2] & l2) != 0L); + case 6: + return ((jjbitVec10[i2] & l2) != 0L); + case 9: + return ((jjbitVec11[i2] & l2) != 0L); + case 10: + return ((jjbitVec12[i2] & l2) != 0L); + case 11: + return ((jjbitVec13[i2] & l2) != 0L); + case 12: + return ((jjbitVec14[i2] & l2) != 0L); + case 13: + return ((jjbitVec15[i2] & l2) != 0L); + case 14: + return ((jjbitVec16[i2] & l2) != 0L); + case 15: + return ((jjbitVec17[i2] & l2) != 0L); + case 16: + return ((jjbitVec18[i2] & l2) != 0L); + case 17: + return ((jjbitVec19[i2] & l2) != 0L); + case 30: + return ((jjbitVec20[i2] & l2) != 0L); + case 31: + return ((jjbitVec21[i2] & l2) != 0L); + case 33: + return ((jjbitVec22[i2] & l2) != 0L); + case 48: + return ((jjbitVec23[i2] & l2) != 0L); + case 49: + return ((jjbitVec24[i2] & l2) != 0L); + case 159: + return ((jjbitVec25[i2] & l2) != 0L); + case 215: + return ((jjbitVec26[i2] & l2) != 0L); + default : + if ((jjbitVec3[i1] & l1) != 0L) + return true; + return false; + } +} +private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, long l2) +{ + switch(hiByte) + { + case 0: + return ((jjbitVec27[i2] & l2) != 0L); + case 1: + return ((jjbitVec5[i2] & l2) != 0L); + case 2: + return ((jjbitVec28[i2] & l2) != 0L); + case 3: + return ((jjbitVec29[i2] & l2) != 0L); + case 4: + return ((jjbitVec30[i2] & l2) != 0L); + case 5: + return ((jjbitVec31[i2] & l2) != 0L); + case 6: + return ((jjbitVec32[i2] & l2) != 0L); + case 9: + return ((jjbitVec33[i2] & l2) != 0L); + case 10: + return ((jjbitVec34[i2] & l2) != 0L); + case 11: + return ((jjbitVec35[i2] & l2) != 0L); + case 12: + return ((jjbitVec36[i2] & l2) != 0L); + case 13: + return ((jjbitVec37[i2] & l2) != 0L); + case 14: + return ((jjbitVec38[i2] & l2) != 0L); + case 15: + return ((jjbitVec39[i2] & l2) != 0L); + case 16: + return ((jjbitVec18[i2] & l2) != 0L); + case 17: + return ((jjbitVec19[i2] & l2) != 0L); + case 30: + return ((jjbitVec20[i2] & l2) != 0L); + case 31: + return ((jjbitVec21[i2] & l2) != 0L); + case 32: + return ((jjbitVec40[i2] & l2) != 0L); + case 33: + return ((jjbitVec22[i2] & l2) != 0L); + case 48: + return ((jjbitVec41[i2] & l2) != 0L); + case 49: + return ((jjbitVec24[i2] & l2) != 0L); + case 159: + return ((jjbitVec25[i2] & l2) != 0L); + case 215: + return ((jjbitVec26[i2] & l2) != 0L); + default : + if ((jjbitVec3[i1] & l1) != 0L) + return true; + return false; + } +} +public static final String[] jjstrLiteralImages = { +"", "\133", "\75", "\46\75", "\174\75", "\163\164\141\162\164", +"\144\151\166", "\151\156\143\154\165\144\145", "\176", "\135", +"\147\162\141\155\155\141\162", "\173", "\175", "\156\141\155\145\163\160\141\143\145", +"\144\145\146\141\165\154\164", "\151\156\150\145\162\151\164", "\144\141\164\141\164\171\160\145\163", +"\145\155\160\164\171", "\164\145\170\164", "\156\157\164\101\154\154\157\167\145\144", "\174", "\46", +"\54", "\53", "\77", "\52", "\145\154\145\155\145\156\164", +"\141\164\164\162\151\142\165\164\145", "\50", "\51", "\55", "\154\151\163\164", "\155\151\170\145\144", +"\145\170\164\145\162\156\141\154", "\160\141\162\145\156\164", "\163\164\162\151\156\147", +"\164\157\153\145\156", null, null, null, null, null, null, null, null, null, null, null, null, null, +null, null, null, null, null, null, null, null, null, "\76\76", null, }; +public static final String[] lexStateNames = { + "DEFAULT", + "AFTER_SINGLE_LINE_COMMENT", + "AFTER_DOCUMENTATION", +}; +public static final int[] jjnewLexState = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, -1, 1, 2, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static final long[] jjtoToken = { + 0x1fc00b1fffffffffL, +}; +static final long[] jjtoSkip = { + 0x148000000000L, +}; +static final long[] jjtoSpecial = { + 0x140000000000L, +}; +private UCode_UCodeESC_CharStream input_stream; +private final int[] jjrounds = new int[43]; +private final int[] jjstateSet = new int[86]; +StringBuffer image; +int jjimageLen; +int lengthOfMatch; +protected char curChar; +public CompactSyntaxTokenManager(UCode_UCodeESC_CharStream stream) +{ + if (UCode_UCodeESC_CharStream.staticFlag) + throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer."); + input_stream = stream; +} +public CompactSyntaxTokenManager(UCode_UCodeESC_CharStream stream, int lexState) +{ + this(stream); + SwitchTo(lexState); +} +public void ReInit(UCode_UCodeESC_CharStream stream) +{ + jjmatchedPos = jjnewStateCnt = 0; + curLexState = defaultLexState; + input_stream = stream; + ReInitRounds(); +} +private final void ReInitRounds() +{ + int i; + jjround = 0x80000001; + for (i = 43; i-- > 0;) + jjrounds[i] = 0x80000000; +} +public void ReInit(UCode_UCodeESC_CharStream stream, int lexState) +{ + ReInit(stream); + SwitchTo(lexState); +} +public void SwitchTo(int lexState) +{ + if (lexState >= 3 || lexState < 0) + throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); + else + curLexState = lexState; +} + +private final Token jjFillToken() +{ + Token t = Token.newToken(jjmatchedKind); + t.kind = jjmatchedKind; + String im = jjstrLiteralImages[jjmatchedKind]; + t.image = (im == null) ? input_stream.GetImage() : im; + t.beginLine = input_stream.getBeginLine(); + t.beginColumn = input_stream.getBeginColumn(); + t.endLine = input_stream.getEndLine(); + t.endColumn = input_stream.getEndColumn(); + return t; +} + +int curLexState = 0; +int defaultLexState = 0; +int jjnewStateCnt; +int jjround; +int jjmatchedPos; +int jjmatchedKind; + +public final Token getNextToken() +{ + int kind; + Token specialToken = null; + Token matchedToken; + int curPos = 0; + + EOFLoop : + for (;;) + { + try + { + curChar = input_stream.BeginToken(); + } + catch(EOFException e) + { + jjmatchedKind = 0; + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + return matchedToken; + } + image = null; + jjimageLen = 0; + + switch(curLexState) + { + case 0: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_0(); + break; + case 1: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_1(); + break; + case 2: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_2(); + break; + } + if (jjmatchedKind != 0x7fffffff) + { + if (jjmatchedPos + 1 < curPos) + input_stream.backup(curPos - jjmatchedPos - 1); + if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + return matchedToken; + } + else + { + if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + if (specialToken == null) + specialToken = matchedToken; + else + { + matchedToken.specialToken = specialToken; + specialToken = (specialToken.next = matchedToken); + } + SkipLexicalActions(matchedToken); + } + else + SkipLexicalActions(null); + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + continue EOFLoop; + } + } + int error_line = input_stream.getEndLine(); + int error_column = input_stream.getEndColumn(); + String error_after = null; + boolean EOFSeen = false; + try { input_stream.readChar(); input_stream.backup(1); } + catch (EOFException e1) { + EOFSeen = true; + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + if (curChar == '\n' || curChar == '\r') { + error_line++; + error_column = 0; + } + else + error_column++; + } + if (!EOFSeen) { + input_stream.backup(1); + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + } + throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); + } +} + +final void SkipLexicalActions(Token matchedToken) +{ + switch(jjmatchedKind) + { + default : + break; + } +} +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EOFException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EOFException.java new file mode 100644 index 0000000..c374146 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EOFException.java @@ -0,0 +1,4 @@ +package com.thaiopensource.relaxng.parse.compact; + +class EOFException extends Exception { +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.java new file mode 100644 index 0000000..78f0b29 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/EscapeSyntaxException.java @@ -0,0 +1,25 @@ +package com.thaiopensource.relaxng.parse.compact; + +class EscapeSyntaxException extends RuntimeException { + private final String key; + private final int lineNumber; + private final int columnNumber; + + EscapeSyntaxException(String key, int lineNumber, int columnNumber) { + this.key = key; + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + String getKey() { + return key; + } + + int getLineNumber() { + return lineNumber; + } + + int getColumnNumber() { + return columnNumber; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/ParseException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/ParseException.java new file mode 100644 index 0000000..9c5ba9b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/ParseException.java @@ -0,0 +1,191 @@ +/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */ +package com.thaiopensource.relaxng.parse.compact; + +/** + * This exception is thrown when parse errors are encountered. + * You can explicitly create objects of this exception type by + * calling the method generateParseException in the generated + * parser. + * + * You can modify this class to customize your error reporting + * mechanisms so long as you retain the public fields. + */ +public class ParseException extends Exception { + + /** + * This constructor is used by the method "generateParseException" + * in the generated parser. Calling this constructor generates + * a new object of this type with the fields "currentToken", + * "expectedTokenSequences", and "tokenImage" set. The boolean + * flag "specialConstructor" is also set to true to indicate that + * this constructor was used to create this object. + * This constructor calls its super class with the empty string + * to force the "toString" method of parent class "Throwable" to + * print the error message in the form: + * ParseException: + */ + public ParseException(Token currentTokenVal, + int[][] expectedTokenSequencesVal, + String[] tokenImageVal + ) + { + super(""); + specialConstructor = true; + currentToken = currentTokenVal; + expectedTokenSequences = expectedTokenSequencesVal; + tokenImage = tokenImageVal; + } + + /** + * The following constructors are for use by you for whatever + * purpose you can think of. Constructing the exception in this + * manner makes the exception behave in the normal way - i.e., as + * documented in the class "Throwable". The fields "errorToken", + * "expectedTokenSequences", and "tokenImage" do not contain + * relevant information. The JavaCC generated code does not use + * these constructors. + */ + + public ParseException() { + super(); + specialConstructor = false; + } + + public ParseException(String message) { + super(message); + specialConstructor = false; + } + + /** + * This variable determines which constructor was used to create + * this object and thereby affects the semantics of the + * "getMessage" method (see below). + */ + protected boolean specialConstructor; + + /** + * This is the last token that has been consumed successfully. If + * this object has been created due to a parse error, the token + * followng this token will (therefore) be the first error token. + */ + public Token currentToken; + + /** + * Each entry in this array is an array of integers. Each array + * of integers represents a sequence of tokens (by their ordinal + * values) that is expected at this point of the parse. + */ + public int[][] expectedTokenSequences; + + /** + * This is a reference to the "tokenImage" array of the generated + * parser within which the parse error occurred. This array is + * defined in the generated ...Constants interface. + */ + public String[] tokenImage; + + /** + * This method has the standard behavior when this object has been + * created using the standard constructors. Otherwise, it uses + * "currentToken" and "expectedTokenSequences" to generate a parse + * error message and returns it. If this object has been created + * due to a parse error, and you do not catch it (it gets thrown + * from the parser), then this method is called during the printing + * of the final stack trace, and hence the correct error message + * gets displayed. + */ + public String getMessage() { + if (!specialConstructor) { + return super.getMessage(); + } + String expected = ""; + int maxSize = 0; + for (int i = 0; i < expectedTokenSequences.length; i++) { + if (maxSize < expectedTokenSequences[i].length) { + maxSize = expectedTokenSequences[i].length; + } + for (int j = 0; j < expectedTokenSequences[i].length; j++) { + expected += tokenImage[expectedTokenSequences[i][j]] + " "; + } + if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { + expected += "..."; + } + expected += eol + " "; + } + String retval = "Encountered \""; + Token tok = currentToken.next; + for (int i = 0; i < maxSize; i++) { + if (i != 0) retval += " "; + if (tok.kind == 0) { + retval += tokenImage[0]; + break; + } + retval += add_escapes(tok.image); + tok = tok.next; + } + retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol; + if (expectedTokenSequences.length == 1) { + retval += "Was expecting:" + eol + " "; + } else { + retval += "Was expecting one of:" + eol + " "; + } + retval += expected; + return retval; + } + + /** + * The end of line string for this machine. + */ + protected String eol = System.getProperty("line.separator", "\n"); + + /** + * Used to convert raw characters to their escaped version + * when these raw version cannot be used as part of an ASCII + * string literal. + */ + protected String add_escapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/Token.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/Token.java new file mode 100644 index 0000000..b5fad5b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/Token.java @@ -0,0 +1,81 @@ +/* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */ +package com.thaiopensource.relaxng.parse.compact; + +/** + * Describes the input token stream. + */ + +public class Token { + + /** + * An integer that describes the kind of this token. This numbering + * system is determined by JavaCCParser, and a table of these numbers is + * stored in the file ...Constants.java. + */ + public int kind; + + /** + * beginLine and beginColumn describe the position of the first character + * of this token; endLine and endColumn describe the position of the + * last character of this token. + */ + public int beginLine, beginColumn, endLine, endColumn; + + /** + * The string image of the token. + */ + public String image; + + /** + * A reference to the next regular (non-special) token from the input + * stream. If this is the last token from the input stream, or if the + * token manager has not read tokens beyond this one, this field is + * set to null. This is true only if this token is also a regular + * token. Otherwise, see below for a description of the contents of + * this field. + */ + public Token next; + + /** + * This field is used to access special tokens that occur prior to this + * token, but after the immediately preceding regular (non-special) token. + * If there are no such special tokens, this field is set to null. + * When there are more than one such special token, this field refers + * to the last of these special tokens, which in turn refers to the next + * previous special token through its specialToken field, and so on + * until the first special token (whose specialToken field is null). + * The next fields of special tokens refer to other special tokens that + * immediately follow it (without an intervening regular token). If there + * is no such token, this field is null. + */ + public Token specialToken; + + /** + * Returns the image. + */ + public final String toString() + { + return image; + } + + /** + * Returns a new Token object, by default. However, if you want, you + * can create and return subclass objects based on the value of ofKind. + * Simply add the cases to the switch for all those special cases. + * For example, if you have a subclass of Token called IDToken that + * you want to create if ofKind is ID, simlpy add something like : + * + * case MyParserConstants.ID : return new IDToken(); + * + * to the following switch statement. Then you can cast matchedToken + * variable to the appropriate type and use it in your lexical actions. + */ + public static final Token newToken(int ofKind) + { + switch(ofKind) + { + default : return new Token(); + } + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/TokenMgrError.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/TokenMgrError.java new file mode 100644 index 0000000..9556bff --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/TokenMgrError.java @@ -0,0 +1,133 @@ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */ +package com.thaiopensource.relaxng.parse.compact; + +public class TokenMgrError extends Error +{ + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Lexical error occured. + */ + static final int LEXICAL_ERROR = 0; + + /** + * An attempt wass made to create a second instance of a static token manager. + */ + static final int STATIC_LEXER_ERROR = 1; + + /** + * Tried to change to an invalid lexical state. + */ + static final int INVALID_LEXICAL_STATE = 2; + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their espaced (or unicode escaped) + * equivalents in the given string + */ + protected static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexicl error + * curLexState : lexical state in which this error occured + * errorLine : line number when the error occured + * errorColumn : column number when the error occured + * errorAfter : prefix that was seen before this error occured + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } + + /* + * Constructors of various flavors follow. + */ + + public TokenMgrError() { + } + + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } + + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.java new file mode 100644 index 0000000..6b3d8d1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/UCode_UCodeESC_CharStream.java @@ -0,0 +1,549 @@ +/* Generated By:JavaCC: Do not edit this line. UCode_UCodeESC_CharStream.java Version 0.7pre6 */ +/* The previous line keeps JavaCC quiet. In fact, the JavaCC generated file + has been edited to fix some bugs. */ +package com.thaiopensource.relaxng.parse.compact; + +import com.thaiopensource.util.Utf16; +import com.thaiopensource.relaxng.parse.BuildException; + +import java.io.IOException; + +/** + * An implementation of interface CharStream, where the stream is assumed to + * contain 16-bit unicode characters. + */ +public final class UCode_UCodeESC_CharStream { + public static final boolean staticFlag = false; + + static final int hexval(char c) { + switch (c) { + case '0': + return 0; + case '1': + return 1; + case '2': + return 2; + case '3': + return 3; + case '4': + return 4; + case '5': + return 5; + case '6': + return 6; + case '7': + return 7; + case '8': + return 8; + case '9': + return 9; + + case 'a': + case 'A': + return 10; + case 'b': + case 'B': + return 11; + case 'c': + case 'C': + return 12; + case 'd': + case 'D': + return 13; + case 'e': + case 'E': + return 14; + case 'f': + case 'F': + return 15; + } + return -1; + } + + public int bufpos = -1; + int bufsize; + int available; + int tokenBegin; + private int bufline[]; + private int bufcolumn[]; + + private int column = 0; + private int line = 1; + + private java.io.Reader inputStream; + private boolean closed = false; + + private boolean prevCharIsLF = false; + + private char[] nextCharBuf; + private char[] buffer; + private int maxNextCharInd = 0; + private int nextCharInd = -1; + private int inBuf = 0; + + private final void ExpandBuff(boolean wrapAround) { + char[] newbuffer = new char[bufsize + 2048]; + int newbufline[] = new int[bufsize + 2048]; + int newbufcolumn[] = new int[bufsize + 2048]; + + if (wrapAround) { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + System.arraycopy(buffer, 0, newbuffer, + bufsize - tokenBegin, bufpos); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufcolumn = newbufcolumn; + + bufpos += (bufsize - tokenBegin); + } + else { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufcolumn = newbufcolumn; + + bufpos -= tokenBegin; + } + + available = (bufsize += 2048); + tokenBegin = 0; + } + + private final void FillBuff() throws EOFException { + int i; + if (maxNextCharInd == 4096) + maxNextCharInd = nextCharInd = 0; + + if (closed) + throw new EOFException(); + try { + if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 4096 - maxNextCharInd)) == -1) { + closed = true; + inputStream.close(); + throw new EOFException(); + } + else + maxNextCharInd += i; + } + catch (IOException e) { + throw new BuildException(e); + } + } + + private final char ReadChar() throws EOFException { + if (++nextCharInd >= maxNextCharInd) + FillBuff(); + + return nextCharBuf[nextCharInd]; + } + + private final char PeekChar() throws EOFException { + char c = ReadChar(); + --nextCharInd; + return c; + } + + public final char BeginToken() throws EOFException { + if (inBuf > 0) { + --inBuf; + return buffer[tokenBegin = (bufpos == bufsize - 1) ? (bufpos = 0) + : ++bufpos]; + } + + tokenBegin = 0; + bufpos = -1; + + return readChar(); + } + + private final void AdjustBuffSize() { + if (available == bufsize) { + if (tokenBegin > 2048) { + bufpos = 0; + available = tokenBegin; + } + else + ExpandBuff(false); + } + else if (available > tokenBegin) + available = bufsize; + else if ((tokenBegin - available) < 2048) + ExpandBuff(true); + else + available = tokenBegin; + } + + private final void UpdateLineColumn(char c) { + column++; + + if (prevCharIsLF) { + prevCharIsLF = false; + line += (column = 1); + } + + switch (c) { + case NEWLINE_MARKER: + prevCharIsLF = true; + break; + case '\t': + column--; + column += (8 - (column & 07)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; + } + + private final char NEWLINE_MARKER = '\u0000'; + + public final char readChar() throws EOFException { + if (inBuf > 0) { + --inBuf; + return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]; + } + + char c; + try { + c = ReadChar(); + switch (c) { + case '\r': + c = NEWLINE_MARKER; + try { + if (PeekChar() == '\n') + ReadChar(); + } + catch (EOFException e) { + } + break; + case '\n': + c = NEWLINE_MARKER; + break; + case '\t': + break; + default: + if (c >= 0x20) { + if (Utf16.isSurrogate(c)) { + if (Utf16.isSurrogate2(c)) + throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1); + if (++bufpos == available) + AdjustBuffSize(); + buffer[bufpos] = c; + // UpdateLineColumn(c); + try { + c = ReadChar(); + } + catch (EOFException e) { + throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1); + } + if (!Utf16.isSurrogate2(c)) + throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 2); + } + break; + } + // fall through + case '\uFFFE': + case '\uFFFF': + throw new EscapeSyntaxException("illegal_char_code", line, column + 1); + } + } + catch (EOFException e) { + if (bufpos == -1) { + if (++bufpos == available) + AdjustBuffSize(); + bufline[bufpos] = line; + bufcolumn[bufpos] = column; + } + throw e; + } + if (++bufpos == available) + AdjustBuffSize(); + buffer[bufpos] = c; + UpdateLineColumn(c); + try { + if (c != '\\' || PeekChar() != 'x') + return c; + } + catch (EOFException e) { + return c; + } + + int xCnt = 1; + for (;;) { + ReadChar(); + if (++bufpos == available) + AdjustBuffSize(); + buffer[bufpos] = 'x'; + UpdateLineColumn('x'); + try { + c = PeekChar(); + } + catch (EOFException e) { + backup(xCnt); + return '\\'; + } + if (c == '{') { + ReadChar(); + column++; + // backup past the 'x's + bufpos -= xCnt; + if (bufpos < 0) + bufpos += bufsize; + break; + } + if (c != 'x') { + backup(xCnt); + return '\\'; + } + xCnt++; + } + try { + int scalarValue = hexval(ReadChar()); + column++; + if (scalarValue < 0) + throw new EscapeSyntaxException("illegal_hex_digit", line, column); + while ((c = ReadChar()) != '}') { + column++; + int n = hexval(c); + if (n < 0) + throw new EscapeSyntaxException("illegal_hex_digit", line, column); + scalarValue <<= 4; + scalarValue |= n; + if (scalarValue >= 0x110000) + throw new EscapeSyntaxException("char_code_too_big", line, column); + } + column++; // for the '}' + if (scalarValue <= 0xFFFF) { + c = (char)scalarValue; + switch (c) { + case '\n': + case '\r': + case '\t': + break; + default: + if (c >= 0x20 && !Utf16.isSurrogate(c)) + break; + // fall through + case '\uFFFE': + case '\uFFFF': + throw new EscapeSyntaxException("illegal_char_code_ref", line, column); + } + buffer[bufpos] = c; + return c; + } + c = Utf16.surrogate1(scalarValue); + buffer[bufpos] = c; + int bufpos1 = bufpos; + if (++bufpos == bufsize) + bufpos = 0; + buffer[bufpos] = Utf16.surrogate2(scalarValue); + bufline[bufpos] = bufline[bufpos1]; + bufcolumn[bufpos] = bufcolumn[bufpos1]; + backup(1); + return c; + } + catch (EOFException e) { + throw new EscapeSyntaxException("incomplete_escape", line, column); + } + } + + /** + * @deprecated + * @see #getEndColumn + */ + + public final int getColumn() { + return bufcolumn[bufpos]; + } + + /** + * @deprecated + * @see #getEndLine + */ + + public final int getLine() { + return bufline[bufpos]; + } + + public final int getEndColumn() { + return bufcolumn[bufpos]; + } + + public final int getEndLine() { + return bufline[bufpos]; + } + + public final int getBeginColumn() { + return bufcolumn[tokenBegin]; + } + + public final int getBeginLine() { + return bufline[tokenBegin]; + } + + public final void backup(int amount) { + + inBuf += amount; + if ((bufpos -= amount) < 0) + bufpos += bufsize; + } + + public UCode_UCodeESC_CharStream(java.io.Reader dstream, + int startline, int startcolumn, int buffersize) { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + nextCharBuf = new char[4096]; + skipBOM(); + } + + public UCode_UCodeESC_CharStream(java.io.Reader dstream, + int startline, int startcolumn) { + this(dstream, startline, startcolumn, 4096); + } + + public void ReInit(java.io.Reader dstream, + int startline, int startcolumn, int buffersize) { + inputStream = dstream; + closed = false; + line = startline; + column = startcolumn - 1; + + if (buffer == null || buffersize != buffer.length) { + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + nextCharBuf = new char[4096]; + } + prevCharIsLF = false; + tokenBegin = inBuf = maxNextCharInd = 0; + nextCharInd = bufpos = -1; + skipBOM(); + } + + public void ReInit(java.io.Reader dstream, + int startline, int startcolumn) { + ReInit(dstream, startline, startcolumn, 4096); + } + + public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) { + this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + + public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline, + int startcolumn) { + this(dstream, startline, startcolumn, 4096); + } + + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) { + ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn) { + ReInit(dstream, startline, startcolumn, 4096); + } + + static private final char BOM = '\ufeff'; + + private void skipBOM() { + try { + if (PeekChar() == BOM) + ReadChar(); + } + catch (EOFException e) { + } + } + + public final String GetImage() { + if (bufpos >= tokenBegin) + return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); + else + return new String(buffer, tokenBegin, bufsize - tokenBegin) + + new String(buffer, 0, bufpos + 1); + } + + public final char[] GetSuffix(int len) { + char[] ret = new char[len]; + + if ((bufpos + 1) >= len) + System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); + else { + System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, + len - bufpos - 1); + System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); + } + + return ret; + } + + public void Done() { + nextCharBuf = null; + buffer = null; + bufline = null; + bufcolumn = null; + } + + /** + * Method to adjust line and column numbers for the start of a token.
+ */ + public void adjustBeginLineColumn(int newLine, int newCol) { + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) { + len = bufpos - tokenBegin + inBuf + 1; + } + else { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && + bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + } + + if (i < len) { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) { + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + } + } + + line = bufline[j]; + column = bufcolumn[j]; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/resources/Messages.properties new file mode 100644 index 0000000..d1007c3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/compact/resources/Messages.properties @@ -0,0 +1,22 @@ +syntax_error=syntax error +undeclared_prefix=undeclared prefix \"{0}\" +xmlns_prefix=prefix must not be \"xmlns\" +unqualified_annotation_attribute=annotation attribute must have a namespace URI +inherited_annotation_namespace=namespace URI for annotation cannot be inherited +xmlns_annotation_attribute=annotation attribute cannot be named \"xmlns\" +duplicate_attribute=multiple attributes with local name \"{0}\" and namespace URI \"{1}\" +except_missing_parentheses=parentheses required around \"-\" expression +xmlns_annotation_attribute_uri=annotation attribute cannot have namespace URI \"http://www.w3.org/2000/xmlns\" +xml_prefix_bad_uri=prefix \"xml\" can only be bound to namespace URI \"http://www.w3.org/XML/1998/namespace\" +xml_uri_bad_prefix=only prefix \"xml\" can be bound to namespace URI \"http://www.w3.org/XML/1998/namespace\" +illegal_hex_digit=expected hex digit +char_code_too_big=character code must be less than 0x110000 +illegal_char_code=code of character that is not allowed +illegal_char_code_ref=reference to character whose code is not allowed +incomplete_escape=incomplete escape sequence +any_name_except_contains_any_name=\"except\" in \"anyName\" contains \"anyName\" +ns_name_except_contains_any_name=\"except\" in \"nsName\" contains \"anyName\" +ns_name_except_contains_ns_name=\"except\" in \"nsName\" contains \"nsName\" +illegal_surrogate_pair=illegal surrogate pair +relax_ng_namespace=annotations cannot have namespace URI \"http://relaxng.org/ns/structure/1.0\" +top_level_follow_annotation=top-level pattern cannot have following annotations diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/DtdContext.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/DtdContext.java new file mode 100644 index 0000000..b6ff202 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/DtdContext.java @@ -0,0 +1,50 @@ +package com.thaiopensource.relaxng.parse.sax; + +import org.xml.sax.DTDHandler; +import org.xml.sax.SAXException; +import org.relaxng.datatype.ValidationContext; + +import java.util.Hashtable; + +public abstract class DtdContext implements DTDHandler, ValidationContext { + private final Hashtable notationTable; + private final Hashtable unparsedEntityTable; + + public DtdContext() { + notationTable = new Hashtable(); + unparsedEntityTable = new Hashtable(); + } + + public DtdContext(DtdContext dc) { + notationTable = dc.notationTable; + unparsedEntityTable = dc.unparsedEntityTable; + } + + public void notationDecl(String name, + String publicId, + String systemId) + throws SAXException { + notationTable.put(name, name); + } + + public void unparsedEntityDecl(String name, + String publicId, + String systemId, + String notationName) + throws SAXException { + unparsedEntityTable.put(name, name); + } + + public boolean isNotation(String notationName) { + return notationTable.get(notationName) != null; + } + + public boolean isUnparsedEntity(String entityName) { + return unparsedEntityTable.get(entityName) != null; + } + + public void clearDtdContext() { + notationTable.clear(); + unparsedEntityTable.clear(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseReceiver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseReceiver.java new file mode 100644 index 0000000..12546ed --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseReceiver.java @@ -0,0 +1,21 @@ +package com.thaiopensource.relaxng.parse.sax; + +import com.thaiopensource.relaxng.parse.ParseReceiver; +import com.thaiopensource.relaxng.parse.ParsedPatternFuture; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.XMLReader; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; + +public class SAXParseReceiver extends SAXSubParser implements ParseReceiver { + public SAXParseReceiver(XMLReaderCreator xrc, ErrorHandler eh) { + super(xrc, eh); + } + + public ParsedPatternFuture installHandlers(XMLReader xr, SchemaBuilder schemaBuilder, Scope scope) + throws SAXException { + return new SchemaParser(xr, eh, schemaBuilder, null, scope); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseable.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseable.java new file mode 100644 index 0000000..00fb8ef --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXParseable.java @@ -0,0 +1,40 @@ +package com.thaiopensource.relaxng.parse.sax; + +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Scope; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; + +public class SAXParseable extends SAXSubParser implements Parseable { + private final InputSource in; + + public SAXParseable(XMLReaderCreator xrc, InputSource in, ErrorHandler eh) { + super(xrc, eh); + this.in = in; + } + + public ParsedPattern parse(SchemaBuilder schemaBuilder, Scope scope) throws BuildException, IllegalSchemaException { + try { + XMLReader xr = xrc.createXMLReader(); + SchemaParser sp = new SchemaParser(xr, eh, schemaBuilder, null, scope); + xr.parse(in); + return sp.getParsedPattern(); + } + catch (SAXException e) { + throw toBuildException(e); + } + catch (IOException e) { + throw new BuildException(e); + } + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXSubParser.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXSubParser.java new file mode 100644 index 0000000..6081121 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SAXSubParser.java @@ -0,0 +1,76 @@ +package com.thaiopensource.relaxng.parse.sax; + +import com.thaiopensource.relaxng.parse.SubParser; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.BuildException; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.XMLReader; +import org.xml.sax.SAXException; +import org.xml.sax.InputSource; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; + +import java.io.IOException; + +public class SAXSubParser implements SubParser { + final XMLReaderCreator xrc; + final ErrorHandler eh; + + SAXSubParser(XMLReaderCreator xrc, ErrorHandler eh) { + this.xrc = xrc; + this.eh = eh; + } + + public ParsedPattern parseInclude(String uri, SchemaBuilder schemaBuilder, IncludedGrammar g) + throws BuildException, IllegalSchemaException { + try { + XMLReader xr = xrc.createXMLReader(); + SchemaParser sp = new SchemaParser(xr, eh, schemaBuilder, g, g); + xr.parse(makeInputSource(xr, uri)); + return sp.getParsedPattern(); + } + catch (SAXException e) { + throw SAXParseable.toBuildException(e); + } + catch (IOException e) { + throw new BuildException(e); + } + } + + public ParsedPattern parseExternal(String uri, SchemaBuilder schemaBuilder, Scope s) + throws BuildException, IllegalSchemaException { + try { + XMLReader xr = xrc.createXMLReader(); + SchemaParser sp = new SchemaParser(xr, eh, schemaBuilder, null, s); + xr.parse(makeInputSource(xr, uri)); + return sp.getParsedPattern(); + } + catch (SAXException e) { + throw SAXParseable.toBuildException(e); + } + catch (IOException e) { + throw new BuildException(e); + } + } + + private static InputSource makeInputSource(XMLReader xr, String systemId) throws IOException, SAXException { + EntityResolver er = xr.getEntityResolver(); + if (er != null) { + InputSource inputSource = er.resolveEntity(null, systemId); + if (inputSource != null) + return inputSource; + } + return new InputSource(systemId); + } + + static BuildException toBuildException(SAXException e) { + Exception inner = e.getException(); + if (inner instanceof BuildException) + throw (BuildException)inner; + throw new BuildException(e); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SchemaParser.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SchemaParser.java new file mode 100644 index 0000000..9ed0aaa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/SchemaParser.java @@ -0,0 +1,1615 @@ +package com.thaiopensource.relaxng.parse.sax; + +import com.thaiopensource.relaxng.parse.DataPatternBuilder; +import com.thaiopensource.relaxng.parse.Grammar; +import com.thaiopensource.relaxng.parse.GrammarSection; +import com.thaiopensource.relaxng.parse.IllegalSchemaException; +import com.thaiopensource.relaxng.parse.Include; +import com.thaiopensource.relaxng.parse.IncludedGrammar; +import com.thaiopensource.relaxng.parse.Location; +import com.thaiopensource.relaxng.parse.ParsedNameClass; +import com.thaiopensource.relaxng.parse.ParsedPattern; +import com.thaiopensource.relaxng.parse.SchemaBuilder; +import com.thaiopensource.relaxng.parse.Scope; +import com.thaiopensource.relaxng.parse.Annotations; +import com.thaiopensource.relaxng.parse.Context; +import com.thaiopensource.relaxng.parse.CommentList; +import com.thaiopensource.relaxng.parse.Div; +import com.thaiopensource.relaxng.parse.ElementAnnotationBuilder; +import com.thaiopensource.relaxng.parse.ParsedElementAnnotation; +import com.thaiopensource.relaxng.parse.ParsedPatternFuture; +import com.thaiopensource.util.Uri; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.xml.util.Naming; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import com.thaiopensource.xml.sax.XmlBaseHandler; +import com.thaiopensource.xml.sax.AbstractLexicalHandler; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.helpers.DefaultHandler; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.util.Vector; +import java.util.Stack; + +class SchemaParser implements ParsedPatternFuture { + + private static final String relaxngURIPrefix = + WellKnownNamespaces.RELAX_NG.substring(0, WellKnownNamespaces.RELAX_NG.lastIndexOf('/') + 1); + static final String relaxng10URI = WellKnownNamespaces.RELAX_NG; + private static final Localizer localizer = new Localizer(SchemaParser.class); + + private String relaxngURI; + private final XMLReader xr; + private final ErrorHandler eh; + private final SchemaBuilder schemaBuilder; + private ParsedPattern startPattern; + private Locator locator; + private final XmlBaseHandler xmlBaseHandler = new XmlBaseHandler(); + private final ContextImpl context = new ContextImpl(); + + private boolean hadError = false; + + private Hashtable patternTable; + private Hashtable nameClassTable; + + static class PrefixMapping { + final String prefix; + final String uri; + final PrefixMapping next; + + PrefixMapping(String prefix, String uri, PrefixMapping next) { + this.prefix = prefix; + this.uri = uri; + this.next = next; + } + } + + static abstract class AbstractContext extends DtdContext implements Context { + PrefixMapping prefixMapping; + + AbstractContext() { + prefixMapping = new PrefixMapping("xml", WellKnownNamespaces.XML, null); + } + + AbstractContext(AbstractContext context) { + super(context); + prefixMapping = context.prefixMapping; + } + + public String resolveNamespacePrefix(String prefix) { + for (PrefixMapping p = prefixMapping; p != null; p = p.next) + if (p.prefix.equals(prefix)) + return p.uri; + return null; + } + + public Enumeration prefixes() { + Vector v = new Vector(); + for (PrefixMapping p = prefixMapping; p != null; p = p.next) { + if (!v.contains(p.prefix)) + v.addElement(p.prefix); + } + return v.elements(); + } + + public Context copy() { + return new SavedContext(this); + } + } + + static class SavedContext extends AbstractContext { + private final String baseUri; + SavedContext(AbstractContext context) { + super(context); + this.baseUri = context.getBaseUri(); + } + + public String getBaseUri() { + return baseUri; + } + } + + class ContextImpl extends AbstractContext { + public String getBaseUri() { + return xmlBaseHandler.getBaseUri(); + } + } + + static interface CommentHandler { + void comment(String value); + } + + abstract class Handler implements ContentHandler, CommentHandler { + CommentList comments; + + CommentList getComments() { + CommentList tem = comments; + comments = null; + return tem; + } + + public void comment(String value) { + if (comments == null) + comments = schemaBuilder.makeCommentList(); + comments.addComment(value, makeLocation()); + } + public void processingInstruction(String target, String date) { } + public void skippedEntity(String name) { } + public void ignorableWhitespace(char[] ch, int start, int len) { } + public void startDocument() { } + public void endDocument() { } + public void startPrefixMapping(String prefix, String uri) { + context.prefixMapping = new PrefixMapping(prefix, uri, context.prefixMapping); + } + + public void endPrefixMapping(String prefix) { + context.prefixMapping = context.prefixMapping.next; + } + + public void setDocumentLocator(Locator loc) { + locator = loc; + xmlBaseHandler.setLocator(loc); + } + } + + abstract class State extends Handler { + State parent; + String nsInherit; + String ns; + String datatypeLibrary; + Scope scope; + Location startLocation; + Annotations annotations; + + void set() { + xr.setContentHandler(this); + } + + abstract State create(); + abstract State createChildState(String localName) throws SAXException; + + + void setParent(State parent) { + this.parent = parent; + this.nsInherit = parent.getNs(); + this.datatypeLibrary = parent.datatypeLibrary; + this.scope = parent.scope; + this.startLocation = makeLocation(); + if (parent.comments != null) { + annotations = schemaBuilder.makeAnnotations(parent.comments, getContext()); + parent.comments = null; + } + else if (parent instanceof RootState) + annotations = schemaBuilder.makeAnnotations(null, getContext()); + } + + String getNs() { + return ns == null ? nsInherit : ns; + } + + boolean isRelaxNGElement(String uri) throws SAXException { + return uri.equals(relaxngURI); + } + + public void startElement(String namespaceURI, + String localName, + String qName, + Attributes atts) throws SAXException { + xmlBaseHandler.startElement(); + if (isRelaxNGElement(namespaceURI)) { + State state = createChildState(localName); + if (state == null) { + xr.setContentHandler(new Skipper(this)); + return; + } + state.setParent(this); + state.set(); + state.attributes(atts); + } + else { + checkForeignElement(); + ForeignElementHandler feh = new ForeignElementHandler(this, getComments()); + feh.startElement(namespaceURI, localName, qName, atts); + xr.setContentHandler(feh); + } + } + + public void endElement(String namespaceURI, + String localName, + String qName) throws SAXException { + xmlBaseHandler.endElement(); + parent.set(); + end(); + } + + void setName(String name) throws SAXException { + error("illegal_name_attribute"); + } + + void setOtherAttribute(String name, String value) throws SAXException { + error("illegal_attribute_ignored", name); + } + + void endAttributes() throws SAXException { + } + + void checkForeignElement() throws SAXException { + } + + void attributes(Attributes atts) throws SAXException { + int len = atts.getLength(); + for (int i = 0; i < len; i++) { + String uri = atts.getURI(i); + if (uri.length() == 0) { + String name = atts.getLocalName(i); + if (name.equals("name")) + setName(atts.getValue(i).trim()); + else if (name.equals("ns")) + ns = atts.getValue(i); + else if (name.equals("datatypeLibrary")) { + datatypeLibrary = atts.getValue(i); + checkUri(datatypeLibrary); + if (!datatypeLibrary.equals("") + && !Uri.isAbsolute(datatypeLibrary)) + error("relative_datatype_library"); + if (Uri.hasFragmentId(datatypeLibrary)) + error("fragment_identifier_datatype_library"); + datatypeLibrary = Uri.escapeDisallowedChars(datatypeLibrary); + } + else + setOtherAttribute(name, atts.getValue(i)); + } + else if (uri.equals(relaxngURI)) + error("qualified_attribute", atts.getLocalName(i)); + else if (uri.equals(WellKnownNamespaces.XML) + && atts.getLocalName(i).equals("base")) + xmlBaseHandler.xmlBaseAttribute(atts.getValue(i)); + else { + if (annotations == null) + annotations = schemaBuilder.makeAnnotations(null, getContext()); + annotations.addAttribute(uri, atts.getLocalName(i), findPrefix(atts.getQName(i), uri), + atts.getValue(i), startLocation); + } + } + endAttributes(); + } + + abstract void end() throws SAXException; + + void endChild(ParsedPattern pattern) { + // XXX cannot happen; throw exception + } + + void endChild(ParsedNameClass nc) { + // XXX cannot happen; throw exception + } + + public void startDocument() { } + public void endDocument() { + if (comments != null && startPattern != null) { + startPattern = schemaBuilder.commentAfter(startPattern, comments); + comments = null; + } + } + + public void characters(char[] ch, int start, int len) throws SAXException { + for (int i = 0; i < len; i++) { + switch(ch[start + i]) { + case ' ': + case '\r': + case '\n': + case '\t': + break; + default: + error("illegal_characters_ignored"); + break; + } + } + } + + boolean isPatternNamespaceURI(String s) { + return s.equals(relaxngURI); + } + + void endForeignChild(ParsedElementAnnotation ea) { + if (annotations == null) + annotations = schemaBuilder.makeAnnotations(null, getContext()); + annotations.addElement(ea); + } + + void mergeLeadingComments() { + if (comments != null) { + if (annotations == null) + annotations = schemaBuilder.makeAnnotations(comments, getContext()); + else + annotations.addLeadingComment(comments); + comments = null; + } + } + } + + class ForeignElementHandler extends Handler { + final State nextState; + ElementAnnotationBuilder builder; + final Stack builderStack = new Stack(); + StringBuffer textBuf; + Location textLoc; + + ForeignElementHandler(State nextState, CommentList comments) { + this.nextState = nextState; + this.comments = comments; + } + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) { + flushText(); + if (builder != null) + builderStack.push(builder); + Location loc = makeLocation(); + builder = schemaBuilder.makeElementAnnotationBuilder(namespaceURI, + localName, + findPrefix(qName, namespaceURI), + loc, + getComments(), + getContext()); + int len = atts.getLength(); + for (int i = 0; i < len; i++) { + String uri = atts.getURI(i); + builder.addAttribute(uri, atts.getLocalName(i), findPrefix(atts.getQName(i), uri), + atts.getValue(i), loc); + } + } + + public void endElement(String namespaceURI, String localName, + String qName) { + flushText(); + if (comments != null) + builder.addComment(getComments()); + ParsedElementAnnotation ea = builder.makeElementAnnotation(); + if (builderStack.empty()) { + nextState.endForeignChild(ea); + nextState.set(); + } + else { + builder = (ElementAnnotationBuilder)builderStack.pop(); + builder.addElement(ea); + } + } + + public void characters(char ch[], int start, int length) { + if (textBuf == null) + textBuf = new StringBuffer(); + textBuf.append(ch, start, length); + if (textLoc == null) + textLoc = makeLocation(); + } + + public void comment(String value) { + flushText(); + super.comment(value); + } + + void flushText() { + if (textBuf != null && textBuf.length() != 0) { + builder.addText(textBuf.toString(), textLoc, getComments()); + textBuf.setLength(0); + } + textLoc = null; + } + } + + class Skipper extends DefaultHandler implements CommentHandler { + int level = 1; + final State nextState; + + Skipper(State nextState) { + this.nextState = nextState; + } + + public void startElement(String namespaceURI, + String localName, + String qName, + Attributes atts) throws SAXException { + ++level; + } + + public void endElement(String namespaceURI, + String localName, + String qName) throws SAXException { + if (--level == 0) + nextState.set(); + } + + public void comment(String value) { + } + } + + abstract class EmptyContentState extends State { + + State createChildState(String localName) throws SAXException { + error("expected_empty", localName); + return null; + } + + abstract ParsedPattern makePattern() throws SAXException; + + void end() throws SAXException { + if (comments != null) { + if (annotations == null) + annotations = schemaBuilder.makeAnnotations(null, getContext()); + annotations.addComment(comments); + comments = null; + } + parent.endChild(makePattern()); + } + } + + static private final int INIT_CHILD_ALLOC = 5; + + abstract class PatternContainerState extends State { + ParsedPattern[] childPatterns; + int nChildPatterns = 0; + + State createChildState(String localName) throws SAXException { + State state = (State)patternTable.get(localName); + if (state == null) { + error("expected_pattern", localName); + return null; + } + return state.create(); + } + + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + if (nPatterns == 1 && anno == null) + return patterns[0]; + return schemaBuilder.makeGroup(patterns, nPatterns, loc, anno); + } + + void endChild(ParsedPattern pattern) { + if (childPatterns == null) + childPatterns = new ParsedPattern[INIT_CHILD_ALLOC]; + else if (nChildPatterns >= childPatterns.length) { + ParsedPattern[] newChildPatterns = new ParsedPattern[childPatterns.length * 2]; + System.arraycopy(childPatterns, 0, newChildPatterns, 0, childPatterns.length); + childPatterns = newChildPatterns; + } + childPatterns[nChildPatterns++] = pattern; + } + + void endForeignChild(ParsedElementAnnotation ea) { + if (nChildPatterns == 0) + super.endForeignChild(ea); + else + childPatterns[nChildPatterns - 1] = schemaBuilder.annotateAfter(childPatterns[nChildPatterns - 1], ea); + } + + void end() throws SAXException { + if (nChildPatterns == 0) { + error("missing_children"); + endChild(schemaBuilder.makeErrorPattern()); + } + if (comments != null) { + childPatterns[nChildPatterns - 1] = schemaBuilder.commentAfter(childPatterns[nChildPatterns - 1], comments); + comments = null; + } + sendPatternToParent(buildPattern(childPatterns, nChildPatterns, startLocation, annotations)); + } + + void sendPatternToParent(ParsedPattern p) { + parent.endChild(p); + } + } + + class GroupState extends PatternContainerState { + State create() { + return new GroupState(); + } + } + + class ZeroOrMoreState extends PatternContainerState { + State create() { + return new ZeroOrMoreState(); + } + + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeZeroOrMore(super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + } + + class OneOrMoreState extends PatternContainerState { + State create() { + return new OneOrMoreState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeOneOrMore(super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + } + + class OptionalState extends PatternContainerState { + State create() { + return new OptionalState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeOptional(super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + } + + class ListState extends PatternContainerState { + State create() { + return new ListState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeList(super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + } + + class ChoiceState extends PatternContainerState { + State create() { + return new ChoiceState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeChoice(patterns, nPatterns, loc, anno); + } + } + + class InterleaveState extends PatternContainerState { + State create() { + return new InterleaveState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) { + return schemaBuilder.makeInterleave(patterns, nPatterns, loc, anno); + } + } + + class MixedState extends PatternContainerState { + State create() { + return new MixedState(); + } + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeMixed(super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + } + + static interface NameClassRef { + void setNameClass(ParsedNameClass nc); + } + + class ElementState extends PatternContainerState implements NameClassRef { + ParsedNameClass nameClass; + boolean nameClassWasAttribute; + String name; + + void setName(String name) { + this.name = name; + } + + public void setNameClass(ParsedNameClass nc) { + nameClass = nc; + } + + void endAttributes() throws SAXException { + if (name != null) { + nameClass = expandName(name, getNs(), null); + nameClassWasAttribute = true; + } + else + new NameClassChildState(this, this).set(); + } + + State create() { + return new ElementState(); + } + + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeElement(nameClass, super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + + void endForeignChild(ParsedElementAnnotation ea) { + if (nameClassWasAttribute || nChildPatterns > 0 || nameClass == null) + super.endForeignChild(ea); + else + nameClass = schemaBuilder.annotateAfter(nameClass, ea); + } + } + + class RootState extends PatternContainerState { + IncludedGrammar grammar; + + RootState() { + } + + RootState(IncludedGrammar grammar, Scope scope, String ns) { + this.grammar = grammar; + this.scope = scope; + this.nsInherit = ns; + this.datatypeLibrary = ""; + } + + State create() { + return new RootState(); + } + + State createChildState(String localName) throws SAXException { + if (grammar == null) + return super.createChildState(localName); + if (localName.equals("grammar")) + return new MergeGrammarState(grammar); + error("expected_grammar", localName); + return null; + } + + void checkForeignElement() throws SAXException { + error("root_bad_namespace_uri", WellKnownNamespaces.RELAX_NG); + } + + void endChild(ParsedPattern pattern) { + startPattern = pattern; + } + + boolean isRelaxNGElement(String uri) throws SAXException { + if (!uri.startsWith(relaxngURIPrefix)) + return false; + if (!uri.equals(WellKnownNamespaces.RELAX_NG)) + warning("wrong_uri_version", + WellKnownNamespaces.RELAX_NG.substring(relaxngURIPrefix.length()), + uri.substring(relaxngURIPrefix.length())); + relaxngURI = uri; + return true; + } + + } + + class NotAllowedState extends EmptyContentState { + State create() { + return new NotAllowedState(); + } + + ParsedPattern makePattern() { + return schemaBuilder.makeNotAllowed(startLocation, annotations); + } + } + + class EmptyState extends EmptyContentState { + State create() { + return new EmptyState(); + } + + ParsedPattern makePattern() { + return schemaBuilder.makeEmpty(startLocation, annotations); + } + } + + class TextState extends EmptyContentState { + State create() { + return new TextState(); + } + + ParsedPattern makePattern() { + return schemaBuilder.makeText(startLocation, annotations); + } + } + + class ValueState extends EmptyContentState { + final StringBuffer buf = new StringBuffer(); + String type; + + State create() { + return new ValueState(); + } + + void setOtherAttribute(String name, String value) throws SAXException { + if (name.equals("type")) + type = checkNCName(value.trim()); + else + super.setOtherAttribute(name, value); + } + + public void characters(char[] ch, int start, int len) { + buf.append(ch, start, len); + } + + void checkForeignElement() throws SAXException { + error("value_contains_foreign_element"); + } + + ParsedPattern makePattern() throws SAXException { + if (type == null) + return makePattern("", "token"); + else + return makePattern(datatypeLibrary, type); + } + + void end() throws SAXException { + mergeLeadingComments(); + super.end(); + } + + ParsedPattern makePattern(String datatypeLibrary, String type) { + return schemaBuilder.makeValue(datatypeLibrary, + type, + buf.toString(), + getContext(), + getNs(), + startLocation, + annotations); + } + + } + + class DataState extends State { + String type; + ParsedPattern except = null; + DataPatternBuilder dpb = null; + + State create() { + return new DataState(); + } + + State createChildState(String localName) throws SAXException { + if (localName.equals("param")) { + if (except != null) + error("param_after_except"); + return new ParamState(dpb); + } + if (localName.equals("except")) { + if (except != null) + error("multiple_except"); + return new ChoiceState(); + } + error("expected_param_except", localName); + return null; + } + + void setOtherAttribute(String name, String value) throws SAXException { + if (name.equals("type")) + type = checkNCName(value.trim()); + else + super.setOtherAttribute(name, value); + } + + void endAttributes() throws SAXException { + if (type == null) + error("missing_type_attribute"); + else + dpb = schemaBuilder.makeDataPatternBuilder(datatypeLibrary, type, startLocation); + } + + void endForeignChild(ParsedElementAnnotation ea) { + dpb.annotation(ea); + } + + void end() throws SAXException { + ParsedPattern p; + if (dpb != null) { + if (except != null) + p = dpb.makePattern(except, startLocation, annotations); + else + p = dpb.makePattern(startLocation, annotations); + } + else + p = schemaBuilder.makeErrorPattern(); + // XXX need to capture comments + parent.endChild(p); + } + + void endChild(ParsedPattern pattern) { + except = pattern; + } + + } + + class ParamState extends State { + private final StringBuffer buf = new StringBuffer(); + private final DataPatternBuilder dpb; + private String name; + + ParamState(DataPatternBuilder dpb) { + this.dpb = dpb; + } + + State create() { + return new ParamState(null); + } + + void setName(String name) throws SAXException { + this.name = checkNCName(name); + } + + void endAttributes() throws SAXException { + if (name == null) + error("missing_name_attribute"); + } + + State createChildState(String localName) throws SAXException { + error("expected_empty", localName); + return null; + } + + public void characters(char[] ch, int start, int len) { + buf.append(ch, start, len); + } + + void checkForeignElement() throws SAXException { + error("param_contains_foreign_element"); + } + + void end() throws SAXException { + if (name == null) + return; + if (dpb == null) + return; + mergeLeadingComments(); + dpb.addParam(name, buf.toString(), getContext(), getNs(), startLocation, annotations); + } + } + + class AttributeState extends PatternContainerState implements NameClassRef { + ParsedNameClass nameClass; + boolean nameClassWasAttribute; + String name; + + State create() { + return new AttributeState(); + } + + void setName(String name) { + this.name = name; + } + + public void setNameClass(ParsedNameClass nc) { + nameClass = nc; + } + + void endAttributes() throws SAXException { + if (name != null) { + String nsUse; + if (ns != null) + nsUse = ns; + else + nsUse = ""; + nameClass = expandName(name, nsUse, null); + nameClassWasAttribute = true; + } + else + new NameClassChildState(this, this).set(); + } + + void endForeignChild(ParsedElementAnnotation ea) { + if (nameClassWasAttribute || nChildPatterns > 0 || nameClass == null) + super.endForeignChild(ea); + else + nameClass = schemaBuilder.annotateAfter(nameClass, ea); + } + + void end() throws SAXException { + if (nChildPatterns == 0) + endChild(schemaBuilder.makeText(startLocation, null)); + super.end(); + } + + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return schemaBuilder.makeAttribute(nameClass, super.buildPattern(patterns, nPatterns, loc, null), loc, anno); + } + + State createChildState(String localName) throws SAXException { + State tem = super.createChildState(localName); + if (tem != null && nChildPatterns != 0) + error("attribute_multi_pattern"); + return tem; + } + + } + + abstract class SinglePatternContainerState extends PatternContainerState { + State createChildState(String localName) throws SAXException { + if (nChildPatterns == 0) + return super.createChildState(localName); + error("too_many_children"); + return null; + } + } + + class GrammarSectionState extends State { + GrammarSection section; + + GrammarSectionState() { } + + GrammarSectionState(GrammarSection section) { + this.section = section; + } + + State create() { + return new GrammarSectionState(null); + } + + State createChildState(String localName) throws SAXException { + if (localName.equals("define")) + return new DefineState(section); + if (localName.equals("start")) + return new StartState(section); + if (localName.equals("include")) { + Include include = section.makeInclude(); + if (include != null) + return new IncludeState(include); + } + if (localName.equals("div")) + return new DivState(section.makeDiv()); + error("expected_define", localName); + // XXX better errors + return null; + } + + void end() throws SAXException { + if (comments != null) { + section.topLevelComment(comments); + comments = null; + } + } + + void endForeignChild(ParsedElementAnnotation ea) { + section.topLevelAnnotation(ea); + } + } + + class DivState extends GrammarSectionState { + final Div div; + DivState(Div div) { + super(div); + this.div = div; + } + + void end() throws SAXException { + super.end(); + div.endDiv(startLocation, annotations); + } + } + + class IncludeState extends GrammarSectionState { + String href; + final Include include; + + IncludeState(Include include) { + super(include); + this.include = include; + } + + void setOtherAttribute(String name, String value) throws SAXException { + if (name.equals("href")) { + href = value; + checkUri(href); + } + else + super.setOtherAttribute(name, value); + } + + void endAttributes() throws SAXException { + if (href == null) + error("missing_href_attribute"); + else + href = resolve(href); + } + + void end() throws SAXException { + super.end(); + if (href != null) { + try { + include.endInclude(href, getNs(), startLocation, annotations); + } + catch (IllegalSchemaException e) { + } + } + } + } + + class MergeGrammarState extends GrammarSectionState { + final IncludedGrammar grammar; + MergeGrammarState(IncludedGrammar grammar) { + super(grammar); + this.grammar = grammar; + } + + void end() throws SAXException { + super.end(); + parent.endChild(grammar.endIncludedGrammar(startLocation, annotations)); + } + } + + class GrammarState extends GrammarSectionState { + Grammar grammar; + + void setParent(State parent) { + super.setParent(parent); + grammar = schemaBuilder.makeGrammar(scope); + section = grammar; + scope = grammar; + } + + State create() { + return new GrammarState(); + } + + void end() throws SAXException { + super.end(); + parent.endChild(grammar.endGrammar(startLocation, annotations)); + } + } + + class RefState extends EmptyContentState { + String name; + + State create() { + return new RefState(); + } + + void endAttributes() throws SAXException { + if (name == null) + error("missing_name_attribute"); + } + + void setName(String name) throws SAXException { + this.name = checkNCName(name); + } + + ParsedPattern makePattern() { + if (name == null) + return schemaBuilder.makeErrorPattern(); + return scope.makeRef(name, startLocation, annotations); + } + } + + class ParentRefState extends RefState { + State create() { + return new ParentRefState(); + } + + ParsedPattern makePattern() { + if (name == null) + return schemaBuilder.makeErrorPattern(); + return scope.makeParentRef(name, startLocation, annotations); + } + } + + class ExternalRefState extends EmptyContentState { + String href; + ParsedPattern includedPattern; + + State create() { + return new ExternalRefState(); + } + + void setOtherAttribute(String name, String value) throws SAXException { + if (name.equals("href")) { + href = value; + checkUri(href); + } + else + super.setOtherAttribute(name, value); + } + + void endAttributes() throws SAXException { + if (href == null) + error("missing_href_attribute"); + else + href = resolve(href); + } + + ParsedPattern makePattern() { + if (href != null) { + try { + return schemaBuilder.makeExternalRef(href, + getNs(), + scope, + startLocation, + annotations); + } + catch (IllegalSchemaException e) { } + } + return schemaBuilder.makeErrorPattern(); + } + } + + abstract class DefinitionState extends PatternContainerState { + GrammarSection.Combine combine = null; + final GrammarSection section; + + DefinitionState(GrammarSection section) { + this.section = section; + } + + void setOtherAttribute(String name, String value) throws SAXException { + if (name.equals("combine")) { + value = value.trim(); + if (value.equals("choice")) + combine = GrammarSection.COMBINE_CHOICE; + else if (value.equals("interleave")) + combine = GrammarSection.COMBINE_INTERLEAVE; + else + error("combine_attribute_bad_value", value); + } + else + super.setOtherAttribute(name, value); + } + + ParsedPattern buildPattern(ParsedPattern[] patterns, int nPatterns, Location loc, Annotations anno) throws SAXException { + return super.buildPattern(patterns, nPatterns, loc, null); + } + } + + class DefineState extends DefinitionState { + String name; + + DefineState(GrammarSection section) { + super(section); + } + + State create() { + return new DefineState(null); + } + + void setName(String name) throws SAXException { + this.name = checkNCName(name); + } + + void endAttributes() throws SAXException { + if (name == null) + error("missing_name_attribute"); + } + + void sendPatternToParent(ParsedPattern p) { + if (name != null) + section.define(name, combine, p, startLocation, annotations); + } + + } + + class StartState extends DefinitionState { + + StartState(GrammarSection section) { + super(section); + } + + State create() { + return new StartState(null); + } + + void sendPatternToParent(ParsedPattern p) { + section.define(GrammarSection.START, combine, p, startLocation, annotations); + } + + State createChildState(String localName) throws SAXException { + State tem = super.createChildState(localName); + if (tem != null && nChildPatterns != 0) + error("start_multi_pattern"); + return tem; + } + + } + + abstract class NameClassContainerState extends State { + State createChildState(String localName) throws SAXException { + State state = (State)nameClassTable.get(localName); + if (state == null) { + error("expected_name_class", localName); + return null; + } + return state.create(); + } + } + + class NameClassChildState extends NameClassContainerState { + final State prevState; + final NameClassRef nameClassRef; + + State create() { + return null; + } + + NameClassChildState(State prevState, NameClassRef nameClassRef) { + this.prevState = prevState; + this.nameClassRef = nameClassRef; + setParent(prevState.parent); + this.ns = prevState.ns; + } + + void endChild(ParsedNameClass nameClass) { + nameClassRef.setNameClass(nameClass); + prevState.set(); + } + + void endForeignChild(ParsedElementAnnotation ea) { + prevState.endForeignChild(ea); + } + + void end() throws SAXException { + nameClassRef.setNameClass(schemaBuilder.makeErrorNameClass()); + error("missing_name_class"); + prevState.set(); + prevState.end(); + } + } + + abstract class NameClassBaseState extends State { + + abstract ParsedNameClass makeNameClass() throws SAXException; + + void end() throws SAXException { + parent.endChild(makeNameClass()); + } + } + + class NameState extends NameClassBaseState { + final StringBuffer buf = new StringBuffer(); + + State createChildState(String localName) throws SAXException { + error("expected_name", localName); + return null; + } + + State create() { + return new NameState(); + } + + public void characters(char[] ch, int start, int len) { + buf.append(ch, start, len); + } + + void checkForeignElement() throws SAXException { + error("name_contains_foreign_element"); + } + + ParsedNameClass makeNameClass() throws SAXException { + mergeLeadingComments(); + return expandName(buf.toString().trim(), getNs(), annotations); + } + + } + + private static final int PATTERN_CONTEXT = 0; + private static final int ANY_NAME_CONTEXT = 1; + private static final int NS_NAME_CONTEXT = 2; + + class AnyNameState extends NameClassBaseState { + ParsedNameClass except = null; + + State create() { + return new AnyNameState(); + } + + State createChildState(String localName) throws SAXException { + if (localName.equals("except")) { + if (except != null) + error("multiple_except"); + return new NameClassChoiceState(getContext()); + } + error("expected_except", localName); + return null; + } + + int getContext() { + return ANY_NAME_CONTEXT; + } + + ParsedNameClass makeNameClass() { + if (except == null) + return makeNameClassNoExcept(); + else + return makeNameClassExcept(except); + } + + ParsedNameClass makeNameClassNoExcept() { + return schemaBuilder.makeAnyName(startLocation, annotations); + } + + ParsedNameClass makeNameClassExcept(ParsedNameClass except) { + return schemaBuilder.makeAnyName(except, startLocation, annotations); + } + + void endChild(ParsedNameClass nameClass) { + except = nameClass; + } + + } + + class NsNameState extends AnyNameState { + State create() { + return new NsNameState(); + } + + ParsedNameClass makeNameClassNoExcept() { + return schemaBuilder.makeNsName(getNs(), null, null); + } + + ParsedNameClass makeNameClassExcept(ParsedNameClass except) { + return schemaBuilder.makeNsName(getNs(), except, null, null); + } + + int getContext() { + return NS_NAME_CONTEXT; + } + + } + + class NameClassChoiceState extends NameClassContainerState { + private ParsedNameClass[] nameClasses; + private int nNameClasses; + private int context; + + NameClassChoiceState() { + this.context = PATTERN_CONTEXT; + } + + NameClassChoiceState(int context) { + this.context = context; + } + + void setParent(State parent) { + super.setParent(parent); + if (parent instanceof NameClassChoiceState) + this.context = ((NameClassChoiceState)parent).context; + } + + State create() { + return new NameClassChoiceState(); + } + + State createChildState(String localName) throws SAXException { + if (localName.equals("anyName")) { + if (context >= ANY_NAME_CONTEXT) { + error(context == ANY_NAME_CONTEXT + ? "any_name_except_contains_any_name" + : "ns_name_except_contains_any_name"); + return null; + } + } + else if (localName.equals("nsName")) { + if (context == NS_NAME_CONTEXT) { + error("ns_name_except_contains_ns_name"); + return null; + } + } + return super.createChildState(localName); + } + + void endChild(ParsedNameClass nc) { + if (nameClasses == null) + nameClasses = new ParsedNameClass[INIT_CHILD_ALLOC]; + else if (nNameClasses >= nameClasses.length) { + ParsedNameClass[] newNameClasses = new ParsedNameClass[nameClasses.length * 2]; + System.arraycopy(nameClasses, 0, newNameClasses, 0, nameClasses.length); + nameClasses = newNameClasses; + } + nameClasses[nNameClasses++] = nc; + } + + void endForeignChild(ParsedElementAnnotation ea) { + if (nNameClasses == 0) + super.endForeignChild(ea); + else + nameClasses[nNameClasses - 1] = schemaBuilder.annotateAfter(nameClasses[nNameClasses - 1], ea); + } + + void end() throws SAXException { + if (nNameClasses == 0) { + error("missing_name_class"); + parent.endChild(schemaBuilder.makeErrorNameClass()); + return; + } + if (comments != null) { + nameClasses[nNameClasses - 1] = schemaBuilder.commentAfter(nameClasses[nNameClasses - 1], comments); + comments = null; + } + parent.endChild(schemaBuilder.makeChoice(nameClasses, nNameClasses, startLocation, annotations)); + } + } + + private void initPatternTable() { + patternTable = new Hashtable(); + patternTable.put("zeroOrMore", new ZeroOrMoreState()); + patternTable.put("oneOrMore", new OneOrMoreState()); + patternTable.put("optional", new OptionalState()); + patternTable.put("list", new ListState()); + patternTable.put("choice", new ChoiceState()); + patternTable.put("interleave", new InterleaveState()); + patternTable.put("group", new GroupState()); + patternTable.put("mixed", new MixedState()); + patternTable.put("element", new ElementState()); + patternTable.put("attribute", new AttributeState()); + patternTable.put("empty", new EmptyState()); + patternTable.put("text", new TextState()); + patternTable.put("value", new ValueState()); + patternTable.put("data", new DataState()); + patternTable.put("notAllowed", new NotAllowedState()); + patternTable.put("grammar", new GrammarState()); + patternTable.put("ref", new RefState()); + patternTable.put("parentRef", new ParentRefState()); + patternTable.put("externalRef", new ExternalRefState()); + } + + private void initNameClassTable() { + nameClassTable = new Hashtable(); + nameClassTable.put("name", new NameState()); + nameClassTable.put("anyName", new AnyNameState()); + nameClassTable.put("nsName", new NsNameState()); + nameClassTable.put("choice", new NameClassChoiceState()); + } + + public ParsedPattern getParsedPattern() throws IllegalSchemaException { + if (hadError) + throw new IllegalSchemaException(); + return startPattern; + } + + private void error(String key) throws SAXException { + error(key, locator); + } + + private void error(String key, String arg) throws SAXException { + error(key, arg, locator); + } + + void error(String key, String arg1, String arg2) throws SAXException { + error(key, arg1, arg2, locator); + } + + private void error(String key, Locator loc) throws SAXException { + error(new SAXParseException(localizer.message(key), loc)); + } + + private void error(String key, String arg, Locator loc) throws SAXException { + error(new SAXParseException(localizer.message(key, arg), loc)); + } + + private void error(String key, String arg1, String arg2, Locator loc) + throws SAXException { + error(new SAXParseException(localizer.message(key, arg1, arg2), loc)); + } + + private void error(SAXParseException e) throws SAXException { + hadError = true; + if (eh != null) + eh.error(e); + } + + void warning(String key) throws SAXException { + warning(key, locator); + } + + private void warning(String key, String arg) throws SAXException { + warning(key, arg, locator); + } + + private void warning(String key, String arg1, String arg2) throws SAXException { + warning(key, arg1, arg2, locator); + } + + private void warning(String key, Locator loc) throws SAXException { + warning(new SAXParseException(localizer.message(key), loc)); + } + + private void warning(String key, String arg, Locator loc) throws SAXException { + warning(new SAXParseException(localizer.message(key, arg), loc)); + } + + private void warning(String key, String arg1, String arg2, Locator loc) + throws SAXException { + warning(new SAXParseException(localizer.message(key, arg1, arg2), loc)); + } + + private void warning(SAXParseException e) throws SAXException { + if (eh != null) + eh.warning(e); + } + + SchemaParser(XMLReader xr, + ErrorHandler eh, + SchemaBuilder schemaBuilder, + IncludedGrammar grammar, + Scope scope) throws SAXException { + this.xr = xr; + this.eh = eh; + this.schemaBuilder = schemaBuilder; + if (eh != null) + xr.setErrorHandler(eh); + xr.setDTDHandler(context); + if (schemaBuilder.usesComments()) { + try { + xr.setProperty("http://xml.org/sax/properties/lexical-handler", new LexicalHandlerImpl()); + } + catch (SAXNotRecognizedException e) { + warning("no_comment_support", xr.getClass().getName()); + } + catch (SAXNotSupportedException e) { + warning("no_comment_support", xr.getClass().getName()); + } + } + initPatternTable(); + initNameClassTable(); + new RootState(grammar, scope, SchemaBuilder.INHERIT_NS).set(); + } + + + private Context getContext() { + return context; + } + + class LexicalHandlerImpl extends AbstractLexicalHandler { + private boolean inDtd = false; + + public void startDTD(String s, String s1, String s2) throws SAXException { + inDtd = true; + } + + public void endDTD() throws SAXException { + inDtd = false; + } + + public void comment(char[] chars, int start, int length) throws SAXException { + if (!inDtd) + ((CommentHandler)xr.getContentHandler()).comment(new String(chars, start, length)); + } + } + + private ParsedNameClass expandName(String name, String ns, Annotations anno) throws SAXException { + int ic = name.indexOf(':'); + if (ic == -1) + return schemaBuilder.makeName(ns, checkNCName(name), null, null, anno); + String prefix = checkNCName(name.substring(0, ic)); + String localName = checkNCName(name.substring(ic + 1)); + for (PrefixMapping tem = context.prefixMapping; tem != null; tem = tem.next) + if (tem.prefix.equals(prefix)) + return schemaBuilder.makeName(tem.uri, localName, prefix, null, anno); + error("undefined_prefix", prefix); + return schemaBuilder.makeName("", localName, null, null, anno); + } + + private String findPrefix(String qName, String uri) { + String prefix = null; + if (qName == null || qName.equals("")) { + for (PrefixMapping p = context.prefixMapping; p != null; p = p.next) + if (p.uri.equals(uri)) { + prefix = p.prefix; + break; + } + } + else { + int off = qName.indexOf(':'); + if (off > 0) + prefix = qName.substring(0, off); + } + return prefix; + } + private String checkNCName(String str) throws SAXException { + if (!Naming.isNcname(str)) + error("invalid_ncname", str); + return str; + } + + private String resolve(String systemId) throws SAXException { + if (Uri.hasFragmentId(systemId)) + error("href_fragment_id"); + systemId = Uri.escapeDisallowedChars(systemId); + return Uri.resolve(xmlBaseHandler.getBaseUri(), systemId); + } + + private Location makeLocation() { + if (locator == null) + return null; + return schemaBuilder.makeLocation(locator.getSystemId(), + locator.getLineNumber(), + locator.getColumnNumber()); + } + + private void checkUri(String s) throws SAXException { + if (!Uri.isValid(s)) + error("invalid_uri", s); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties new file mode 100644 index 0000000..63d7d7e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/parse/sax/resources/Messages.properties @@ -0,0 +1,38 @@ +no_comment_support=SAX parser \"{0}\" cannot report comments +any_name_except_contains_any_name=\"except\" in \"anyName\" contains \"anyName\" +attribute_multi_pattern=\"attribute\" pattern must contain at most one pattern +combine_attribute_bad_value=bad value \"{0}\" for \"combine\" attribute; value must be \"choice\" or \"interleave\" +expected_define=found \"{0}\" element but expected \"define\" or \"start\" or \"include\" or \"div\" element +expected_empty=found \"{0}\" element but expected empty content +expected_except=found \"{0}\" element but expected \"except\" +expected_grammar=found \"{0}\" element but expected \"grammar\" element +expected_name=found \"{0}\" element but expected a name +expected_name_class=found \"{0}\" element but expected a name-class +expected_param_except=only \"param\" and \"except\" child elements are allowed +expected_pattern=found \"{0}\" element but expected a pattern +fragment_identifier_datatype_library=URI in value of \"datatypeLibrary\" attribute must not have a fragment identifier +href_fragment_id=fragment identifier ignored in value of \"href\" attribute +illegal_attribute_ignored=illegal attribute \"{0}\" ignored +illegal_characters_ignored=illegal characters ignored +illegal_name_attribute=illegal \"name\" attribute +invalid_ncname=\"{0}\" is not a valid local name +invalid_uri=\"{0}\" is not a valid URI reference according to RFC 2396 +missing_children=missing children +missing_href_attribute=missing \"href\" attribute +missing_name_attribute=missing \"name\" attribute +missing_name_class=expected child element specifying name class +missing_type_attribute=missing \"type\" attribute +multiple_except=at most one \"except\" child element is allowed +name_contains_foreign_element=\"name\" element cannot contain foreign elements +ns_name_except_contains_any_name=\"except\" in \"nsName\" contains \"anyName\" +ns_name_except_contains_ns_name=\"except\" in \"nsName\" contains \"nsName\" +param_after_except=\"param\" is not allowed after \"except\" +param_contains_foreign_element=\"param\" element cannot contain foreign elements +qualified_attribute=attribute name \"{0}\" incorrectly qualified with RELAX NG namespace URI +relative_datatype_library=URI in value of \"datatypeLibrary\" attribute must not be relative +root_bad_namespace_uri=namespace URI of document element must be \"{0}\" +start_multi_pattern=\"start\" pattern must contain at most one pattern +too_many_children=too many child elements: only one child element is allowed +undefined_prefix=undefined prefix \"{0}\" +value_contains_foreign_element=\"value\" element cannot contain foreign elements +wrong_uri_version=namespace URI has wrong version: expected \"{0}\" but got \"{1}\" diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/Driver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/Driver.java new file mode 100644 index 0000000..042c87b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/Driver.java @@ -0,0 +1,154 @@ +package com.thaiopensource.relaxng.util; + +import com.thaiopensource.util.OptionParser; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.Version; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.validate.Flag; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.OptionArgumentException; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.ValidationDriver; +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.xml.sax.ErrorHandlerImpl; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; + +class Driver { + static private String usageKey = "usage"; + + static public void setUsageKey(String key) { + usageKey = key; + } + + static public void main(String[] args) { + System.exit(new Driver().doMain(args)); + } + + private boolean timing = false; + private String encoding = null; + private Localizer localizer = new Localizer(Driver.class); + + public int doMain(String[] args) { + ErrorHandlerImpl eh = new ErrorHandlerImpl(System.out); + OptionParser op = new OptionParser("itcdfe:p:", args); + PropertyMapBuilder properties = new PropertyMapBuilder(); + ValidateProperty.ERROR_HANDLER.put(properties, eh); + RngProperty.CHECK_ID_IDREF.add(properties); + SchemaReader sr = null; + boolean compact = false; + + try { + while (op.moveToNextOption()) { + switch (op.getOptionChar()) { + case 'i': + properties.put(RngProperty.CHECK_ID_IDREF, null); + break; + case 'c': + compact = true; + break; + case 'd': + { + if (sr == null) + sr = new AutoSchemaReader(); + Option option = sr.getOption(SchemaReader.BASE_URI + "diagnose"); + if (option == null) { + eh.print(localizer.message("no_schematron", op.getOptionCharString())); + return 2; + } + properties.put(option.getPropertyId(), Flag.PRESENT); + } + break; + case 't': + timing = true; + break; + case 'e': + encoding = op.getOptionArg(); + break; + case 'f': + RngProperty.FEASIBLE.add(properties); + break; + case 'p': + { + if (sr == null) + sr = new AutoSchemaReader(); + Option option = sr.getOption(SchemaReader.BASE_URI + "phase"); + if (option == null) { + eh.print(localizer.message("no_schematron", op.getOptionCharString())); + return 2; + } + try { + properties.put(option.getPropertyId(), option.valueOf(op.getOptionArg())); + } + catch (OptionArgumentException e) { + eh.print(localizer.message("invalid_phase", op.getOptionArg())); + return 2; + } + } + break; + } + } + } + catch (OptionParser.InvalidOptionException e) { + eh.print(localizer.message("invalid_option", op.getOptionCharString())); + return 2; + } + catch (OptionParser.MissingArgumentException e) { + eh.print(localizer.message("option_missing_argument",op.getOptionCharString())); + return 2; + } + if (compact) + sr = CompactSchemaReader.getInstance(); + args = op.getRemainingArgs(); + if (args.length < 1) { + eh.print(localizer.message(usageKey, Version.getVersion(Driver.class))); + return 2; + } + long startTime = System.currentTimeMillis(); + long loadedPatternTime = -1; + boolean hadError = false; + try { + ValidationDriver driver = new ValidationDriver(properties.toPropertyMap(), sr); + InputSource in = ValidationDriver.uriOrFileInputSource(args[0]); + if (encoding != null) + in.setEncoding(encoding); + if (driver.loadSchema(in)) { + loadedPatternTime = System.currentTimeMillis(); + for (int i = 1; i < args.length; i++) { + if (!driver.validate(ValidationDriver.uriOrFileInputSource(args[i]))) + hadError = true; + } + } + else + hadError = true; + } + catch (SAXException e) { + hadError = true; + eh.printException(e); + } + catch (IOException e) { + hadError = true; + eh.printException(e); + } + if (timing) { + long endTime = System.currentTimeMillis(); + if (loadedPatternTime < 0) + loadedPatternTime = endTime; + eh.print(localizer.message("elapsed_time", + new Object[] { + new Long(loadedPatternTime - startTime), + new Long(endTime - loadedPatternTime), + new Long(endTime - startTime) + })); + } + if (hadError) + return 1; + return 0; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ExegenDriver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ExegenDriver.java new file mode 100644 index 0000000..631d4a6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ExegenDriver.java @@ -0,0 +1,8 @@ +package com.thaiopensource.relaxng.util; + +class ExegenDriver { + static public void main(String[] args) { + Driver.setUsageKey("exegen_usage"); + Driver.main(args); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/TestDriver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/TestDriver.java new file mode 100644 index 0000000..b45ce9e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/TestDriver.java @@ -0,0 +1,153 @@ +package com.thaiopensource.relaxng.util; + +import com.thaiopensource.util.OptionParser; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.ValidationDriver; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.xml.sax.ErrorHandlerImpl; +import org.xml.sax.SAXException; +import org.relaxng.datatype.helpers.DatatypeLibraryLoader; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; + +class TestDriver { + static public void main(String[] args) throws IOException { + System.exit(new TestDriver().doMain(args)); + } + + private ValidationDriver driver; + private ErrorHandlerImpl eh; + private Localizer localizer = new Localizer(TestDriver.class); + private int nTests = 0; + + public int doMain(String[] args) throws IOException { + long startTime = System.currentTimeMillis(); + eh = new ErrorHandlerImpl(System.out); + OptionParser op = new OptionParser("i", args); + PropertyMapBuilder properties = new PropertyMapBuilder(); + // This is an optimization. It ensures that all SchemaReaders share a + // single DatatypeLibraryLoader. + RngProperty.DATATYPE_LIBRARY_FACTORY.put(properties, new DatatypeLibraryLoader()); + try { + while (op.moveToNextOption()) { + switch (op.getOptionChar()) { + case 'i': + RngProperty.CHECK_ID_IDREF.add(properties); + break; + } + } + } + catch (OptionParser.InvalidOptionException e) { + eh.print(localizer.message("invalid_option", op.getOptionCharString())); + return 2; + } + catch (OptionParser.MissingArgumentException e) { + eh.print(localizer.message("option_missing_argument", op.getOptionCharString())); + return 2; + } + args = op.getRemainingArgs(); + eh = new ErrorHandlerImpl(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(args[0])))); + ValidateProperty.ERROR_HANDLER.put(properties, eh); + driver = new ValidationDriver(properties.toPropertyMap()); + int result = 0; + for (int i = 1; i < args.length; i++) { + int n = runTestSuite(new File(args[i])); + if (n > result) + result = n; + } + System.err.println("Number of tests: " + nTests); + System.err.println("Elapsed time: " + (System.currentTimeMillis() - startTime)); + eh.close(); + return result; + } + + private static final String CORRECT_SCHEMA_NAME = "c.rng"; + private static final String INCORRECT_SCHEMA_NAME = "i.rng"; + private static final String VALID_INSTANCE_SUFFIX = ".v.xml"; + private static final String INVALID_INSTANCE_SUFFIX = ".i.xml"; + + public int runTestSuite(File dir) throws IOException { + int result = 0; + String[] subdirs = dir.list(); + for (int i = 0; i < subdirs.length; i++) { + File subdir = new File(dir, subdirs[i]); + if (subdir.isDirectory()) { + int n = runTestCase(subdir); + if (n > result) + result = n; + } + } + return result; + } + + private int runTestCase(File dir) throws IOException { + File f = new File(dir, INCORRECT_SCHEMA_NAME); + if (f.exists()) { + if (loadSchema(f)) { + failed(f); + return 1; + } + return 0; + } + f = new File(dir, CORRECT_SCHEMA_NAME); + if (!f.exists()) + return 0; + if (!loadSchema(f)) { + failed(f); + return 1; + } + String[] files = dir.list(); + int result = 0; + for (int i = 0; i < files.length; i++) { + if (files[i].endsWith(VALID_INSTANCE_SUFFIX)) { + f = new File(dir, files[i]); + if (!validateInstance(f)) { + failed(f); + result = 1; + } + } + else if (files[i].endsWith(INVALID_INSTANCE_SUFFIX)) { + f = new File(dir, files[i]); + if (validateInstance(f)) { + failed(f); + result = 1; + } + } + } + return result; + } + + private static void failed(File f) { + System.err.println("Failed: " + f.toString()); + } + + private boolean loadSchema(File schema) throws IOException { + nTests++; + try { + if (driver.loadSchema(ValidationDriver.fileInputSource(schema))) + return true; + } + catch (SAXException e) { + eh.printException(e); + } + return false; + } + + private boolean validateInstance(File instance) throws IOException { + nTests++; + try { + if (driver.validate(ValidationDriver.fileInputSource(instance))) + return true; + } + catch (SAXException e) { + eh.printException(e); + } + return false; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ValidationEngine.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ValidationEngine.java new file mode 100644 index 0000000..c2ce545 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/ValidationEngine.java @@ -0,0 +1,127 @@ +package com.thaiopensource.relaxng.util; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.ValidationDriver; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.xml.sax.Sax2XMLReaderCreator; +import org.xml.sax.ErrorHandler; + +/** + * Provides a compatibility wrapper around ValidationDriver. New applications + * should use ValidationDriver directly. + * + * @author James Clark + * @see ValidationDriver + * @deprecated + */ +public class ValidationEngine extends ValidationDriver { + + /** + * Flag indicating that ID/IDREF/IDREFS should be checked. + * @see RngProperty#CHECK_ID_IDREF + */ + public static final int CHECK_ID_IDREF = 01; + /** + * Flag indicating that the schema is in the RELAX NG compact syntax rather than the XML syntax. + * @see CompactSchemaReader + */ + public static final int COMPACT_SYNTAX = 02; + /** + * @see RngProperty#FEASIBLE + */ + public static final int FEASIBLE = 04; + + /** + * Default constructor. Equivalent to ValidationEngine(null, null, CHECK_ID_IDREF). + */ + public ValidationEngine() { + this(null, null, CHECK_ID_IDREF); + } + /** + * Constructs a ValidationEngine. + * + * @param xrc the XMLReaderCreator to be used for constructing XMLReaders; + * if null uses Sax2XMLReaderCreator + * @param eh the ErrorHandler to be used for reporting errors; if null + * uses DraconianErrorHandler + * @param flags bitwise OR of flags selected from CHECK_ID_IDREF, COMPACT_SYNTAX, + * FEASIBLE, MNS + * @see com.thaiopensource.xml.sax.DraconianErrorHandler + * @see com.thaiopensource.xml.sax.Sax2XMLReaderCreator + * @see #CHECK_ID_IDREF + * @see #COMPACT_SYNTAX + * @see #FEASIBLE + */ + public ValidationEngine(XMLReaderCreator xrc, + ErrorHandler eh, + int flags) { + super(makePropertyMap(xrc, eh, flags), + (flags & COMPACT_SYNTAX) == 0 ? null : CompactSchemaReader.getInstance()); + } + + private static PropertyMap makePropertyMap(XMLReaderCreator xrc, ErrorHandler eh, int flags) { + PropertyMapBuilder builder = new PropertyMapBuilder(); + if (xrc == null) + xrc = new Sax2XMLReaderCreator(); + ValidateProperty.XML_READER_CREATOR.put(builder, xrc); + if (eh != null) + ValidateProperty.ERROR_HANDLER.put(builder, eh); + if ((flags & CHECK_ID_IDREF) != 0) + RngProperty.CHECK_ID_IDREF.add(builder); + if ((flags & FEASIBLE) != 0) + RngProperty.FEASIBLE.add(builder); + return builder.toPropertyMap(); + } + + /** + * Constructs a ValidationEngine. + * + * @param xrc the XMLReaderCreator to be used for constructing XMLReaders; + * if null uses Sax2XMLReaderCreator + * @param eh the ErrorHandler to be used for reporting errors; if null + * uses DraconianErrorHandler + * @param checkIdIdref true if ID/IDREF/IDREFS should be checked; false otherwise + * @see com.thaiopensource.xml.sax.DraconianErrorHandler + * @see com.thaiopensource.xml.sax.Sax2XMLReaderCreator + */ + public ValidationEngine(XMLReaderCreator xrc, + ErrorHandler eh, + boolean checkIdIdref) { + this(xrc, eh, checkIdIdref ? CHECK_ID_IDREF : 0); + } + + /** + * Constructs a ValidationEngine. + * + * @param xrc the XMLReaderCreator to be used for constructing XMLReaders; + * if null uses Sax2XMLReaderCreator + * @param eh the ErrorHandler to be used for reporting errors; if null + * uses DraconianErrorHandler + * @param checkIdIdref true if ID/IDREF/IDREFS should be checked; false otherwise + * @param compactSyntax true if the RELAX NG compact syntax should be used to parse the schema; + * false if the XML syntax should be used + * @see com.thaiopensource.xml.sax.DraconianErrorHandler + * @see com.thaiopensource.xml.sax.Sax2XMLReaderCreator + */ + public ValidationEngine(XMLReaderCreator xrc, ErrorHandler eh, boolean checkIdIdref, boolean compactSyntax) { + this(xrc, + eh, + (checkIdIdref ? CHECK_ID_IDREF : 0) + | (compactSyntax ? COMPACT_SYNTAX : 0)); + } + + + public ValidationEngine(XMLReaderCreator xrc, ErrorHandler eh, boolean checkIdIdref, boolean compactSyntax, + boolean feasible) { + this(xrc, + eh, + (checkIdIdref ? CHECK_ID_IDREF : 0) + | (compactSyntax ? COMPACT_SYNTAX : 0) + | (feasible ? FEASIBLE : 0)); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Messages.properties new file mode 100644 index 0000000..9f5da9b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Messages.properties @@ -0,0 +1,17 @@ +no_schematron=option \"-{0}\" is only applicable to Schematron, but this version of Jing does not support Schematron +invalid_phase=\"{0}\" is not a valid Schematron phase name + +elapsed_time=Elapsed time {0,number,#}+{1,number,#}={2,number,#} milliseconds + +option_missing_argument=option \"-{0}\" requires an argument +invalid_option=invalid option \"-{0}\" + +usage=Jing version {0}\n\ +usage: java com.thaiopensource.relaxng.util.Driver [-i] [-c] [-t] [-e encoding] RNGFile XMLFile...\n\ +RELAX NG is a schema language for XML\n\ +See http://relaxng.org/ for more information. + +exegen_usage=Jing version {0}\n\ +usage: jing [-i] [-c] [-t] [-e encoding] RNGFile XMLFile...\n\ +RELAX NG is a schema language for XML\n\ +See http://relaxng.org/ for more information. diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Version.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Version.properties new file mode 100644 index 0000000..3634f19 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/relaxng/util/resources/Version.properties @@ -0,0 +1 @@ +version=20030619 diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Equal.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Equal.java new file mode 100644 index 0000000..974409c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Equal.java @@ -0,0 +1,9 @@ +package com.thaiopensource.util; + +public class Equal { + private Equal() { } + + static public boolean equal(Object obj1, Object obj2) { + return obj1 == null ? obj2 == null : obj1.equals(obj2); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Localizer.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Localizer.java new file mode 100644 index 0000000..bca7f0f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Localizer.java @@ -0,0 +1,44 @@ +package com.thaiopensource.util; + +import java.util.ResourceBundle; +import java.text.MessageFormat; + +public class Localizer { + private final Class cls; + private ResourceBundle bundle; + + public Localizer(Class cls) { + this.cls = cls; + } + + public String message(String key) { + return MessageFormat.format(getBundle().getString(key), new Object[]{}); + } + + public String message(String key, Object arg) { + return MessageFormat.format(getBundle().getString(key), + new Object[]{arg}); + } + + public String message(String key, Object arg1, Object arg2) { + return MessageFormat.format(getBundle().getString(key), + new Object[]{arg1, arg2}); + } + + public String message(String key, Object[] args) { + return MessageFormat.format(getBundle().getString(key), args); + } + + private ResourceBundle getBundle() { + if (bundle == null){ + String s = cls.getName(); + int i = s.lastIndexOf('.'); + if (i > 0) + s = s.substring(0, i + 1); + else + s = ""; + bundle = ResourceBundle.getBundle(s + "resources.Messages"); + } + return bundle; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/OptionParser.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/OptionParser.java new file mode 100644 index 0000000..c5ae9cb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/OptionParser.java @@ -0,0 +1,108 @@ +package com.thaiopensource.util; + +public class OptionParser { + private final String optionSpec; + private char optionChar = 0; + private String optionArg = null; + private int argIndex = 0; + private int currentOptionIndex = 0; + private final String[] args; + + private static final char OPTION_CHAR = '-'; + + public static class MissingArgumentException extends Exception { } + + public static class InvalidOptionException extends Exception { } + + public OptionParser(String optionSpec, String[] args) { + this.optionSpec = optionSpec; + this.args = new String[args.length]; + System.arraycopy(args, 0, this.args, 0, args.length); + } + + public char getOptionChar() { + return optionChar; + } + + public String getOptionCharString() { + return new String(new char[]{optionChar}); + } + + public String getOptionArg() { + return optionArg; + } + + public boolean moveToNextOption() + throws InvalidOptionException, MissingArgumentException { + if (currentOptionIndex > 0 + && currentOptionIndex == args[argIndex].length()) { + currentOptionIndex = 0; + argIndex++; + } + if (currentOptionIndex == 0) { + if (argIndex >= args.length) + return false; + String arg = args[argIndex]; + if (arg.length() < 2 || arg.charAt(0) != OPTION_CHAR) + return false; + if (arg.length() == 2 && arg.charAt(1) == OPTION_CHAR) { + argIndex++; + return false; + } + currentOptionIndex = 1; + } + optionChar = args[argIndex].charAt(currentOptionIndex++); + optionArg = null; + int i = optionSpec.indexOf(optionChar); + if (i < 0 || (optionChar == ':' && i > 0)) + throw new InvalidOptionException(); + if (i + 1 < optionSpec.length() && optionSpec.charAt(i + 1) == ':') { + if (currentOptionIndex < args[argIndex].length()) { + optionArg = args[argIndex].substring(currentOptionIndex); + currentOptionIndex = 0; + argIndex++; + } + else if (argIndex + 1 < args.length) { + optionArg = args[++argIndex]; + ++argIndex; + currentOptionIndex = 0; + } + else + throw new MissingArgumentException(); + } + return true; + } + + public String[] getRemainingArgs() { + String[] tem = new String[args.length - argIndex]; + System.arraycopy(args, argIndex, tem, 0, tem.length); + return tem; + } + + public static void main(String[] args) { + String optSpec = args[0]; + String[] tem = new String[args.length - 1]; + System.arraycopy(args, 1, tem, 0, tem.length); + args = tem; + OptionParser opts = new OptionParser(optSpec, args); + try { + while (opts.moveToNextOption()) { + System.err.print("option " + opts.getOptionChar()); + String arg = opts.getOptionArg(); + if (arg == null) + System.err.println(" (no argument)"); + else + System.err.println(" arg=" + arg); + } + args = opts.getRemainingArgs(); + for (int i = 0; i < args.length; i++) + System.err.println("arg=" + args[i]); + } + catch (OptionParser.MissingArgumentException e) { + System.err.println("missing argument for option " + opts.getOptionChar()); + } + catch (OptionParser.InvalidOptionException e) { + System.err.println("invalid option " + opts.getOptionChar()); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyId.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyId.java new file mode 100644 index 0000000..86372cb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyId.java @@ -0,0 +1,29 @@ +package com.thaiopensource.util; + +public class PropertyId { + private final String name; + private final Class valueClass; + + public PropertyId(String name, Class valueClass) { + if (name == null || valueClass == null) + throw new NullPointerException(); + this.name = name; + this.valueClass = valueClass; + } + + public Class getValueClass() { + return valueClass; + } + + public final int hashCode() { + return super.hashCode(); + } + + public final boolean equals(Object obj) { + return super.equals(obj); + } + + public String toString() { + return name; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMap.java new file mode 100644 index 0000000..760ab4e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMap.java @@ -0,0 +1,25 @@ +package com.thaiopensource.util; + +public interface PropertyMap { + public static final PropertyMap EMPTY = new PropertyMap() { + public Object get(PropertyId pid) { + return null; + } + + public boolean contains(PropertyId pid) { + return false; + } + + public int size() { + return 0; + } + + public PropertyId getKey(int i) { + throw new IndexOutOfBoundsException(); + } + }; + Object get(PropertyId pid); + boolean contains(PropertyId pid); + int size(); + PropertyId getKey(int i); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMapBuilder.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMapBuilder.java new file mode 100644 index 0000000..1610d9b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/PropertyMapBuilder.java @@ -0,0 +1,95 @@ +package com.thaiopensource.util; + +import java.util.Hashtable; +import java.util.Enumeration; + +public class PropertyMapBuilder { + private Hashtable map; + private PropertyId[] keys; + + private static class PropertyMapImpl implements PropertyMap { + private final Hashtable map; + private final PropertyId[] keys; + + private PropertyMapImpl(Hashtable map, PropertyId[] keys) { + this.map = map; + this.keys = keys; + } + + public Object get(PropertyId pid) { + return map.get(pid); + } + + public int size() { + return keys.length; + } + + public boolean contains(PropertyId pid) { + return map.get(pid) != null; + } + + public PropertyId getKey(int i) { + return keys[i]; + } + } + + public PropertyMapBuilder() { + this.map = new Hashtable(); + } + + public PropertyMapBuilder(PropertyMap pm) { + if (pm instanceof PropertyMapImpl) { + PropertyMapImpl pmi = (PropertyMapImpl)pm; + this.map = pmi.map; + this.keys = pmi.keys; + } + else { + this.map = new Hashtable(); + for (int i = 0, len = pm.size(); i < len; i++) { + PropertyId pid = pm.getKey(i); + put(pid, pm.get(pid)); + } + } + } + + private void lock() { + if (keys != null) + return; + keys = new PropertyId[map.size()]; + int i = 0; + for (Enumeration e = map.keys(); e.hasMoreElements();) + keys[i++] = (PropertyId)e.nextElement(); + } + + private void copyIfLocked() { + if (keys == null) + return; + Hashtable newMap = new Hashtable(); + for (int i = 0; i < keys.length; i++) + newMap.put(keys[i], map.get(keys[i])); + map = newMap; + keys = null; + } + + public PropertyMap toPropertyMap() { + lock(); + return new PropertyMapImpl(map, keys); + } + + public Object put(PropertyId id, Object value) { + copyIfLocked(); + if (value == null) + return map.remove(id); + if (!id.getValueClass().isInstance(value)) + throw new ClassCastException(); + return map.put(id, value); + } + + public Object get(PropertyId pid) { + return map.get(pid); + } + + public boolean contains(PropertyId pid) { + return map.get(pid) != null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Service.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Service.java new file mode 100644 index 0000000..49a6597 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Service.java @@ -0,0 +1,213 @@ +package com.thaiopensource.util; + +import java.util.Enumeration; +import java.util.NoSuchElementException; +import java.util.Vector; +import java.io.Reader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URL; + +public class Service { + private final Class serviceClass; + private final Enumeration configFiles; + private Enumeration classNames = null; + private final Vector providers = new Vector(); + private Loader loader; + + private class ProviderEnumeration implements Enumeration { + private int nextIndex = 0; + + public boolean hasMoreElements() { + return nextIndex < providers.size() || moreProviders(); + } + + public Object nextElement() { + try { + return providers.elementAt(nextIndex++); + } + catch (ArrayIndexOutOfBoundsException e) { + throw new NoSuchElementException(); + } + } + } + + private static class Singleton implements Enumeration { + private Object obj; + private Singleton(Object obj) { + this.obj = obj; + } + + public boolean hasMoreElements() { + return obj != null; + } + + public Object nextElement() { + if (obj == null) + throw new NoSuchElementException(); + Object tem = obj; + obj = null; + return tem; + } + } + + // JDK 1.1 + private static class Loader { + Enumeration getResources(String resName) { + ClassLoader cl = Loader.class.getClassLoader(); + URL url; + if (cl == null) + url = ClassLoader.getSystemResource(resName); + else + url = cl.getResource(resName); + return new Singleton(url); + } + + Class loadClass(String name) throws ClassNotFoundException { + return Class.forName(name); + } + } + + // JDK 1.2+ + private static class Loader2 extends Loader { + private ClassLoader cl; + + Loader2() { + cl = Loader2.class.getClassLoader(); + // If the thread context class loader has the class loader + // of this class as an ancestor, use the thread context class + // loader. Otherwise, the thread context class loader + // probably hasn't been set up properly, so don't use it. + ClassLoader clt = Thread.currentThread().getContextClassLoader(); + for (ClassLoader tem = clt; tem != null; tem = tem.getParent()) + if (tem == cl) { + cl = clt; + break; + } + } + + Enumeration getResources(String resName) { + try { + Enumeration resources = cl.getResources(resName); + if (resources.hasMoreElements()) + return resources; + // Some application servers apparently do not implement findResources + // in their class loaders, so fall back to getResource. + return new Singleton(cl.getResource(resName)); + } + catch (IOException e) { + return new Singleton(null); + } + } + + Class loadClass(String name) throws ClassNotFoundException { + return Class.forName(name, true, cl); + } + } + + public Service(Class cls) { + try { + loader = new Loader2(); + } + catch (NoSuchMethodError e) { + loader = new Loader(); + } + serviceClass = cls; + String resName = "META-INF/services/" + serviceClass.getName(); + configFiles = loader.getResources(resName); + } + + public Enumeration getProviders() { + return new ProviderEnumeration(); + } + + synchronized private boolean moreProviders() { + for (;;) { + while (classNames == null) { + if (!configFiles.hasMoreElements()) + return false; + classNames = parseConfigFile((URL)configFiles.nextElement()); + } + while (classNames.hasMoreElements()) { + String className = (String)classNames.nextElement(); + try { + Class cls = loader.loadClass(className); + Object obj = cls.newInstance(); + if (serviceClass.isInstance(obj)) { + providers.addElement(obj); + return true; + } + } + catch (ClassNotFoundException e) { } + catch (InstantiationException e) { } + catch (IllegalAccessException e) { } + catch (LinkageError e) { } + } + classNames = null; + } + } + + private static final int START = 0; + private static final int IN_NAME = 1; + private static final int IN_COMMENT = 2; + + private static Enumeration parseConfigFile(URL url) { + try { + InputStream in = url.openStream(); + Reader r; + try { + r = new InputStreamReader(in, "UTF-8"); + } + catch (UnsupportedEncodingException e) { + r = new InputStreamReader(in, "UTF8"); + } + r = new BufferedReader(r); + Vector tokens = new Vector(); + StringBuffer tokenBuf = new StringBuffer(); + int state = START; + for (;;) { + int n = r.read(); + if (n < 0) + break; + char c = (char)n; + switch (c) { + case '\r': + case '\n': + state = START; + break; + case ' ': + case '\t': + break; + case '#': + state = IN_COMMENT; + break; + default: + if (state != IN_COMMENT) { + state = IN_NAME; + tokenBuf.append(c); + } + break; + } + if (tokenBuf.length() != 0 && state != IN_NAME) { + tokens.addElement(tokenBuf.toString()); + tokenBuf.setLength(0); + } + } + if (tokenBuf.length() != 0) + tokens.addElement(tokenBuf.toString()); + return tokens.elements(); + } + catch (IOException e) { + return null; + } + } + + public static void main(String[] args) throws ClassNotFoundException { + Service svc = new Service(Class.forName(args[0])); + for (Enumeration e = svc.getProviders(); e.hasMoreElements();) + System.out.println(e.nextElement().getClass().getName()); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/SinglePropertyMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/SinglePropertyMap.java new file mode 100644 index 0000000..8c1013b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/SinglePropertyMap.java @@ -0,0 +1,36 @@ +package com.thaiopensource.util; + +public class SinglePropertyMap implements PropertyMap { + private final PropertyId pid; + private final Object value; + + public SinglePropertyMap(PropertyId pid, Object value) { + if (!(pid.getValueClass().isInstance(value))) { + if (value == null) + throw new NullPointerException(); + throw new ClassCastException(); + } + this.pid = pid; + this.value = value; + } + + public Object get(PropertyId pid) { + if (pid != this.pid) + return null; + return value; + } + + public boolean contains(PropertyId pid) { + return pid == this.pid; + } + + public int size() { + return 1; + } + + public PropertyId getKey(int i) { + if (i != 0) + throw new IndexOutOfBoundsException(); + return pid; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Uri.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Uri.java new file mode 100644 index 0000000..f894b9a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Uri.java @@ -0,0 +1,149 @@ +package com.thaiopensource.util; + +import java.net.URL; +import java.net.MalformedURLException; +import java.io.UnsupportedEncodingException; + +public class Uri { + private static String utf8 = "UTF-8"; + + public static boolean isValid(String s) { + return isValidPercent(s) && isValidFragment(s) && isValidScheme(s); + } + + private static final String HEX_DIGITS = "0123456789abcdef"; + + public static String escapeDisallowedChars(String s) { + StringBuffer buf = null; + int len = s.length(); + int done = 0; + for (;;) { + int i = done; + for (;;) { + if (i == len) { + if (done == 0) + return s; + break; + } + if (isExcluded(s.charAt(i))) + break; + i++; + } + if (buf == null) + buf = new StringBuffer(); + if (i > done) { + buf.append(s.substring(done, i)); + done = i; + } + if (i == len) + break; + for (i++; i < len && isExcluded(s.charAt(i)); i++) + ; + String tem = s.substring(done, i); + byte[] bytes; + try { + bytes = tem.getBytes(utf8); + } + catch (UnsupportedEncodingException e) { + utf8 = "UTF8"; + try { + bytes = tem.getBytes(utf8); + } + catch (UnsupportedEncodingException e2) { + // Give up + return s; + } + } + for (int j = 0; j < bytes.length; j++) { + buf.append('%'); + buf.append(HEX_DIGITS.charAt((bytes[j] & 0xFF) >> 4)); + buf.append(HEX_DIGITS.charAt(bytes[j] & 0xF)); + } + done = i; + } + return buf.toString(); + } + + private static final String excluded = "<>\"{}|\\^`"; + + private static boolean isExcluded(char c) { + return c <= 0x20 || c >= 0x7F || excluded.indexOf(c) >= 0; + } + + private static boolean isAlpha(char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); + } + + private static boolean isHexDigit(char c) { + return ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') || isDigit(c); + } + + private static boolean isDigit(char c) { + return '0' <= c && c <= '9'; + } + + private static boolean isSchemeChar(char c) { + return isAlpha(c) || isDigit(c) || c == '+' || c == '-' || c =='.'; + } + + private static boolean isValidPercent(String s) { + int len = s.length(); + for (int i = 0; i < len; i++) + if (s.charAt(i) == '%') { + if (i + 2 >= len) + return false; + else if (!isHexDigit(s.charAt(i + 1)) + || !isHexDigit(s.charAt(i + 2))) + return false; + } + return true; + } + + private static boolean isValidFragment(String s) { + int i = s.indexOf('#'); + return i < 0 || s.indexOf('#', i + 1) < 0; + } + + private static boolean isValidScheme(String s) { + if (!isAbsolute(s)) + return true; + int i = s.indexOf(':'); + if (i == 0 + || i + 1 == s.length() + || !isAlpha(s.charAt(0))) + return false; + while (--i > 0) + if (!isSchemeChar(s.charAt(i))) + return false; + return true; + } + + public static String resolve(String baseUri, String uriReference) { + if (!isAbsolute(uriReference) && baseUri != null && isAbsolute(baseUri)) { + try { + return new URL(new URL(baseUri), uriReference).toString(); + } + catch (MalformedURLException e) { } + } + return uriReference; + } + + public static boolean hasFragmentId(String uri) { + return uri.indexOf('#') >= 0; + } + + public static boolean isAbsolute(String uri) { + int i = uri.indexOf(':'); + if (i < 0) + return false; + while (--i >= 0) { + switch (uri.charAt(i)) { + case '#': + case '/': + case '?': + return false; + } + } + return true; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/UriOrFile.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/UriOrFile.java new file mode 100644 index 0000000..00dfcff --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/UriOrFile.java @@ -0,0 +1,80 @@ +package com.thaiopensource.util; + +import java.net.URL; +import java.net.MalformedURLException; +import java.io.File; + +public class UriOrFile { + private UriOrFile() { + } + + public static String toUri(String uriOrFile) { + if (!hasScheme(uriOrFile)) { + try { + return fileToUri(uriOrFile); + } + catch (MalformedURLException e) { } + } + return uriOrFile; + } + + private static boolean hasScheme(String str) { + int len = str.length(); + if (len == 0) + return false; + if (!isAlpha(str.charAt(0))) + return false; + for (int i = 1; i < len; i++) { + char c = str.charAt(i); + switch (c) { + case ':': + // Don't recognize single letters as schemes + return i == 1 ? false : true; + case '+': + case '-': + break; + default: + if (!isAlnum(c)) + return false; + break; + } + } + return false; + } + + private static boolean isAlpha(char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); + } + + private static boolean isAlnum(char c) { + return isAlpha(c) || ('0' <= c && c <= '9'); + } + + public static String fileToUri(String file) throws MalformedURLException { + return fileToUri(new File(file)); + } + + public static String fileToUri(File file) throws MalformedURLException { + String path = file.getAbsolutePath().replace(File.separatorChar, '/'); + if (path.length() > 0 && path.charAt(0) != '/') + path = '/' + path; + return new URL("file", "", path).toString(); + } + + public static String uriToUriOrFile(String uri) { + if (!uri.startsWith("file:")) + return uri; + uri = uri.substring(5); + int nSlashes = 0; + while (nSlashes < uri.length() && uri.charAt(nSlashes) == '/') + nSlashes++; + File f = new File(uri.substring(nSlashes).replace('/', File.separatorChar)); + if (f.isAbsolute()) + return f.toString(); + return uri.replace('/', File.separatorChar); + } + + static public void main(String[] args) { + System.err.println(uriToUriOrFile(args[0])); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Utf16.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Utf16.java new file mode 100644 index 0000000..7b5f4d0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Utf16.java @@ -0,0 +1,24 @@ +package com.thaiopensource.util; + +public abstract class Utf16 { + // 110110XX XXXXXX 110111XX XXXXXX + static public boolean isSurrogate(char c) { + return (c & 0xF800) == 0xD800; + } + static public boolean isSurrogate1(char c) { + return (c & 0xFC00) == 0xD800; + } + static public boolean isSurrogate2(char c) { + return (c & 0xFC00) == 0xDC00; + } + static public int scalarValue(char c1, char c2) { + return (((c1 & 0x3FF) << 10) | (c2 & 0x3FF)) + 0x10000; + } + static public char surrogate1(int c) { + return (char)(((c - 0x10000) >> 10) | 0xD800); + } + static public char surrogate2(int c) { + return (char)(((c - 0x10000) & 0x3FF) | 0xDC00); + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Version.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Version.java new file mode 100644 index 0000000..bca7890 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/util/Version.java @@ -0,0 +1,28 @@ +package com.thaiopensource.util; + +import java.io.InputStream; +import java.io.IOException; +import java.util.Properties; +import java.util.MissingResourceException; + +public class Version { + private Version() { } + + public static String getVersion(Class cls) { + InputStream in = cls.getResourceAsStream("resources/Version.properties"); + if (in != null) { + Properties props = new Properties(); + try { + props.load(in); + String version = props.getProperty("version"); + if (version != null) + return version; + } + catch (IOException e) { } + } + throw new MissingResourceException("no version property", + cls.getName(), + "version"); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/AbstractSchema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/AbstractSchema.java new file mode 100644 index 0000000..813d045 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/AbstractSchema.java @@ -0,0 +1,35 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMapBuilder; + +public abstract class AbstractSchema implements Schema { + private final PropertyMap properties; + + public AbstractSchema() { + this(PropertyMap.EMPTY); + } + + public AbstractSchema(PropertyMap properties) { + this.properties = properties; + } + + public AbstractSchema(PropertyMap properties, PropertyId[] supportedPropertyIds) { + this(filterProperties(properties, supportedPropertyIds)); + } + + public PropertyMap getProperties() { + return properties; + } + + static public PropertyMap filterProperties(PropertyMap properties, PropertyId[] supportedPropertyIds) { + PropertyMapBuilder builder = new PropertyMapBuilder(); + for (int i = 0; i < supportedPropertyIds.length; i++) { + Object value = properties.get(supportedPropertyIds[i]); + if (value != null) + builder.put(supportedPropertyIds[i], value); + } + return builder.toPropertyMap(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Flag.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Flag.java new file mode 100644 index 0000000..442b99e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Flag.java @@ -0,0 +1,14 @@ +package com.thaiopensource.validate; + +/** + * A class with a unique value, used as the value of properties whose + * significance is purely whether or not they are present in the + * PropertyMap. + */ +public class Flag { + private Flag() { } + /** + * The unique value of this class. + */ + public static final Flag PRESENT = new Flag(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagOption.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagOption.java new file mode 100644 index 0000000..f0631b6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagOption.java @@ -0,0 +1,24 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyId; + +public class FlagOption implements Option { + private final FlagPropertyId pid; + public FlagOption(FlagPropertyId pid) { + this.pid = pid; + } + + public PropertyId getPropertyId() { + return pid; + } + + public Object valueOf(String arg) throws OptionArgumentException { + if (arg != null) + throw new OptionArgumentPresenceException(); + return Flag.PRESENT; + } + + public Object combine(Object[] values) { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagPropertyId.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagPropertyId.java new file mode 100644 index 0000000..a4c0a76 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/FlagPropertyId.java @@ -0,0 +1,29 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.validate.Flag; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMapBuilder; + +/** + * A PropertyId whose value is not significant. Its significance + * rests purely on whether it is present in a PropertyMap. The + * value is constrained to be Flag.PRESENT. + * + * @see Flag + */ +public class FlagPropertyId extends PropertyId { + public FlagPropertyId(String name) { + super(name, Flag.class); + } + + /** + * Adds this property to a PropertyMapBuilder. Modifies + * the PropertyMapBuilder so that this PropertyId is + * mapped to Flag.PRESENT. + * + * @param builder the PropertyMapBuilder to be modified + */ + public void add(PropertyMapBuilder builder) { + builder.put(this, Flag.PRESENT); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/IncorrectSchemaException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/IncorrectSchemaException.java new file mode 100644 index 0000000..d35d2a2 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/IncorrectSchemaException.java @@ -0,0 +1,13 @@ +package com.thaiopensource.validate; + +/** + * Thrown to indicate an XML document is not a correct schema, either because the + * XML document is not well-formed or because it fails to be correct in some other + * way. + * + * @see SchemaReader#createSchema + * + * @author James Clark + */ +public class IncorrectSchemaException extends Exception { +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Option.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Option.java new file mode 100644 index 0000000..05c72a5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Option.java @@ -0,0 +1,18 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyId; + +public interface Option { + PropertyId getPropertyId(); + Object valueOf(String arg) throws OptionArgumentException; + /** + * Combines multiple values of an option into a single value. A property + * whose value is logically a sequence may be represented by multiple options + * each representing a single member of the sequence. + * + * @param values an array of values to be combined + * @return an Object representing the combination, or null + * if they cannot be combined + */ + Object combine(Object[] values); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentException.java new file mode 100644 index 0000000..db32af0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentException.java @@ -0,0 +1,10 @@ +package com.thaiopensource.validate; + +public class OptionArgumentException extends Exception { + public OptionArgumentException() { + } + + public OptionArgumentException(String message) { + super(message); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentFormatException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentFormatException.java new file mode 100644 index 0000000..99eca1c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentFormatException.java @@ -0,0 +1,10 @@ +package com.thaiopensource.validate; + +public class OptionArgumentFormatException extends OptionArgumentException { + public OptionArgumentFormatException() { + } + + public OptionArgumentFormatException(String message) { + super(message); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentPresenceException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentPresenceException.java new file mode 100644 index 0000000..6c54f42 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/OptionArgumentPresenceException.java @@ -0,0 +1,6 @@ +package com.thaiopensource.validate; + +public class OptionArgumentPresenceException extends OptionArgumentException { + public OptionArgumentPresenceException() { + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Schema.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Schema.java new file mode 100644 index 0000000..3b12d75 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Schema.java @@ -0,0 +1,33 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyMap; + +/** + * A schema that can be used to validate an XML document. A single Schema object + * is safe for concurrent access by multiple threads. + * + * @see SchemaReader + * @see Validator + * + * @author James Clark + */ +public interface Schema { + /** + * Creates a new Validator that can be used to validate XML documents with + * respect to this schema. The PropertyMap should contain a + * ValidateProperty.ERROR_HANDLER property, which will be + * used to report errors. If it does not, then an ErrorHandler + * will be used that ignores warnings and throws its argument on errors and fatal errors. + * Common properties are defined in ValidateProperty. Implementations + * may support additional properties. + * + * @param properties a PropertyMap specifying the properties of the + * Validator to be created + * @return a new Validator that can be used to validate an XML document + * with respect to this schema; never null + * + * @see ValidateProperty#ERROR_HANDLER + */ + Validator createValidator(PropertyMap properties); + PropertyMap getProperties(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReader.java new file mode 100644 index 0000000..44ea048 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReader.java @@ -0,0 +1,34 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.IncorrectSchemaException; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/** + * A SchemaReader object is immutable and can thus be safely accessed + * concurrently from multiple threads. + */ +public interface SchemaReader { + public static final String BASE_URI = "http://www.thaiopensource.com/validate/"; + /** + * Creates a Schema by reading it from an InputSource. + * + * @param in the InputSource from which to read the schema; + * must not be null + * @param properties a PropertyMap to control the schema creation; + * must not be null + * @return a newly created Schema, never null + * @throws IOException if an I/O error occurs + * @throws SAXException + * @throws IncorrectSchemaException + * + * @see ValidateProperty + */ + Schema createSchema(InputSource in, PropertyMap properties) + throws IOException, SAXException, IncorrectSchemaException; + + Option getOption(String uri); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderFactory.java new file mode 100644 index 0000000..5b4a06f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderFactory.java @@ -0,0 +1,29 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.validate.SchemaReader; + +/** + * A factory for SchemaReader. A class that implements this interface can be + * automatically discovered by SchemaReaderLoader, if it has + * a 0-argument constructor and if its name is listed in the file + * META-INF/services/com.thaiopensource.validate.SchemaReaderFactory. + * + * @see SchemaReaderLoader + * @see SchemaReader + */ +public interface SchemaReaderFactory { + /** + * Creates a SchemaReader for a particular schema language. + * + * @param namespaceUri a String identifing the schema language; must not be null; + * for schema languages that use XML, this should be the namespace URI + * of the root element if the root element has a non-absent namespace URI + * + * @return a SchemaReader for the specified schema language, or null, + * if this SchemaReaderFactory cannot create a SchemaReader for the specified + * schema language + */ + public SchemaReader createSchemaReader(String namespaceUri); + + Option getOption(String uri); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderLoader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderLoader.java new file mode 100644 index 0000000..4ac88d6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/SchemaReaderLoader.java @@ -0,0 +1,35 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.util.Service; + +import java.util.Enumeration; +/** + * A SchemaReaderFactory that automatically discovers SchemaReader implementations. + * For a SchemeaReader implementation to be discoverable by this class, it must have + * a factory class with a no-argument constructor implementing SchemaReaderFactory, + * and the fully-qualified name of this factory class must be listed in the file + * META-INF/services/com.thaiopensource.validate.SchemaReaderFactory. + */ +public class SchemaReaderLoader implements SchemaReaderFactory { + private final Service service = new Service(SchemaReaderFactory.class); + public SchemaReader createSchemaReader(String namespaceUri) { + for (Enumeration enumList = service.getProviders(); enumList.hasMoreElements();) { + SchemaReaderFactory srf = (SchemaReaderFactory)enumList.nextElement(); + SchemaReader sr = srf.createSchemaReader(namespaceUri); + if (sr != null) + return sr; + } + return null; + } + + public Option getOption(String uri) { + for (Enumeration enumList = service.getProviders(); enumList.hasMoreElements();) { + SchemaReaderFactory srf = (SchemaReaderFactory)enumList.nextElement(); + Option option = srf.getOption(uri); + if (option != null) + return option; + } + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringOption.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringOption.java new file mode 100644 index 0000000..1e764e6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringOption.java @@ -0,0 +1,33 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyId; + +public class StringOption implements Option { + private final StringPropertyId pid; + + public StringOption(StringPropertyId pid) { + this.pid = pid; + } + + public PropertyId getPropertyId() { + return pid; + } + + public Object valueOf(String arg) throws OptionArgumentException { + if (arg == null) + return defaultValue(); + return normalize(arg); + } + + public String defaultValue() throws OptionArgumentPresenceException { + throw new OptionArgumentPresenceException(); + } + + public String normalize(String value) throws OptionArgumentFormatException { + return value; + } + + public Object combine(Object[] values) { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringPropertyId.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringPropertyId.java new file mode 100644 index 0000000..3ae8d50 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/StringPropertyId.java @@ -0,0 +1,47 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; + +/** + * A PropertyId whose value is constrained to be an instance of + * String. + * + * @see String + */ + +public class StringPropertyId extends PropertyId { + public StringPropertyId(String name) { + super(name, String.class); + } + + /** + * Returns the value of the property. This is a typesafe + * version of PropertyMap.get. + * + * @param properties the PropertyMap to be used + * @return the String to which the PropertyMap maps this PropertyId, + * or null if this PropertyId is not in the PropertyMap + * @see com.thaiopensource.util.PropertyMap#get + */ + public String get(PropertyMap properties) { + return (String)properties.get(this); + } + + /** + * Sets the value of the property. Modifies the PropertyMapBuilder + * so that this PropertyId is mapped to the specified value. This + * is a typesafe version of PropertyMapBuilder.put. + * + * @param builder the PropertyMapBuilder to be modified + * @param value the String to which this PropertyId is to be mapped + * @return the String to which this PropertyId was mapped before, + * or null if it was not mapped + * + * @see com.thaiopensource.util.PropertyMapBuilder#put + */ + public String put(PropertyMapBuilder builder, String value) { + return (String)builder.put(this, value); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidateProperty.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidateProperty.java new file mode 100644 index 0000000..23c2f28 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidateProperty.java @@ -0,0 +1,169 @@ +package com.thaiopensource.validate; + +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.ErrorHandler; +import org.xml.sax.EntityResolver; + +/** + * Provides common properties to control reading schemas and validation. + * + * @see Schema#createValidator + * @see SchemaReader#createSchema + * @see PropertyMap + * @see PropertyId + * @see com.thaiopensource.validate.rng.RngProperty + * @see com.thaiopensource.validate.schematron.SchematronProperty + */ +public class ValidateProperty { + /** + * Property specifying ErrorHandler to be used for reporting errors. The value + * to which this PropertyId maps must be an instance of ErrorHandler. + * + * @see ErrorHandler + */ + public static final ErrorHandlerPropertyId ERROR_HANDLER = new ErrorHandlerPropertyId("ERROR_HANDLER"); + + /** + * Property specifying EntityResolver to be used for resolving entities. The value + * to which this PropertyId maps must be an instance of EntityResolver. + * + * @see EntityResolver + */ + public static final EntityResolverPropertyId ENTITY_RESOLVER = new EntityResolverPropertyId("ENTITY_RESOLVER"); + + /** + * Property specifying XMLReaderCreator used to create XMLReader objects needed for + * parsing XML documents. The value to which this PropertyId maps must be an + * instance of XMLReaderCreator. + */ + public static final XMLReaderCreatorPropertyId XML_READER_CREATOR + = new XMLReaderCreatorPropertyId("XML_READER_CREATOR"); + + private ValidateProperty() { } + + /** + * A PropertyId whose value is constrained to be an instance of + * ErrorHandler. + * + * @see ErrorHandler + */ + public static class ErrorHandlerPropertyId extends PropertyId { + public ErrorHandlerPropertyId(String name) { + super(name, ErrorHandler.class); + } + + /** + * Returns the value of the property. This is a typesafe + * version of PropertyMap.get. + * + * @param properties the PropertyMap to be used + * @return the ErrorHandler to which the PropertyMap maps this PropertyId, + * or null if this PropertyId is not in the PropertyMap + * @see PropertyMap#get + */ + public ErrorHandler get(PropertyMap properties) { + return (ErrorHandler)properties.get(this); + } + + /** + * Sets the value of the property. Modifies the PropertyMapBuilder + * so that this PropertyId is mapped to the specified value. This + * is a typesafe version of PropertyMapBuilder.put. + * + * @param builder the PropertyMapBuilder to be modified + * @param value the ErrorHandler to which this PropertyId is to be mapped + * @return the ErrorHandler to which this PropertyId was mapped before, + * or null if it was not mapped + * + * @see PropertyMapBuilder#put + */ + public ErrorHandler put(PropertyMapBuilder builder, ErrorHandler value) { + return (ErrorHandler)builder.put(this, value); + } + } + + /** + * A PropertyId whose value is constrained to be an instance of + * EntityResolver. + * + * @see EntityResolver + */ + public static class EntityResolverPropertyId extends PropertyId { + public EntityResolverPropertyId(String name) { + super(name, EntityResolver.class); + } + + /** + * Returns the value of the property. This is a typesafe + * version of PropertyMap.get. + * + * @param properties the PropertyMap to be used + * @return the EntityResolver to which the PropertyMap maps this PropertyId, + * or null if this PropertyId is not in the PropertyMap + * @see PropertyMap#get + */ + public EntityResolver get(PropertyMap properties) { + return (EntityResolver)properties.get(this); + } + + /** + * Sets the value of the property. Modifies the PropertyMapBuilder + * so that this PropertyId is mapped to the specified value. This + * is a typesafe version of PropertyMapBuilder.put. + * + * @param builder the PropertyMapBuilder to be modified + * @param value the EntityResolver to which this PropertyId is to be mapped + * @return the EntityResolver to which this PropertyId was mapped before, + * or null if it was not mapped + * + * @see PropertyMapBuilder#put + */ + public EntityResolver put(PropertyMapBuilder builder, EntityResolver value) { + return (EntityResolver)builder.put(this, value); + } + } + + /** + * A PropertyId whose value is constrained to be an instance of + * XMLReaderCreator. + * + * @see XMLReaderCreator + */ + public static class XMLReaderCreatorPropertyId extends PropertyId { + public XMLReaderCreatorPropertyId(String name) { + super(name, XMLReaderCreator.class); + } + + /** + * Returns the value of the property. This is a typesafe + * version of PropertyMap.get. + * + * @param properties the PropertyMap to be used + * @return the XMLReaderCreator to which the PropertyMap maps this PropertyId, + * or null if this PropertyId is not in the PropertyMap + * @see PropertyMap#get + */ + public XMLReaderCreator get(PropertyMap properties) { + return (XMLReaderCreator)properties.get(this); + } + + /** + * Sets the value of the property. Modifies the PropertyMapBuilder + * so that this PropertyId is mapped to the specified value. This + * is a typesafe version of PropertyMapBuilder.put. + * + * @param builder the PropertyMapBuilder to be modified + * @param value the XMLReaderCreator to which this PropertyId is to be mapped + * @return the XMLReaderCreator to which this PropertyId was mapped before, + * or null if it was not mapped + * + * @see PropertyMapBuilder#put + */ + public XMLReaderCreator put(PropertyMapBuilder builder, XMLReaderCreator value) { + return (XMLReaderCreator)builder.put(this, value); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidationDriver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidationDriver.java new file mode 100644 index 0000000..189f8a3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/ValidationDriver.java @@ -0,0 +1,221 @@ +package com.thaiopensource.validate; + +import org.xml.sax.SAXException; +import org.xml.sax.InputSource; +import org.xml.sax.DTDHandler; +import org.xml.sax.XMLReader; +import org.xml.sax.ErrorHandler; + +import java.io.IOException; +import java.io.File; +import java.net.MalformedURLException; + +import com.thaiopensource.util.UriOrFile; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.xml.sax.CountingErrorHandler; +import com.thaiopensource.xml.sax.Jaxp11XMLReaderCreator; +import com.thaiopensource.xml.sax.ErrorHandlerImpl; +import com.thaiopensource.validate.auto.AutoSchemaReader; + +/** + * Provides a simplified API for validating XML documents against schemas. + * This class is neither reentrant nor safe for access from multiple threads. + * + * @author James Clark + */ + +public class ValidationDriver { + private static final PropertyId[] requiredProperties = { + ValidateProperty.XML_READER_CREATOR, + ValidateProperty.ERROR_HANDLER + }; + + private static final Class[] defaultClasses = { + Jaxp11XMLReaderCreator.class, + ErrorHandlerImpl.class + }; + + private final XMLReaderCreator xrc; + private XMLReader xr; + private final CountingErrorHandler eh; + private final SchemaReader sr; + private final PropertyMap schemaProperties; + private final PropertyMap instanceProperties; + private Validator validator; + private Schema schema; + + /** + * Creates and initializes a ValidationDriver. + * + * @param schemaProperties a PropertyMap specifying properties controlling schema creation; + * must not be null + * @param instanceProperties a PropertyMap specifying properties controlling validation; + * must not be null + * @param schemaReader the SchemaReader to use; if this is null, then the schema + * must be in XML, and the namespace URI of the root element will be used to determine what + * the schema language is + */ + public ValidationDriver(PropertyMap schemaProperties, + PropertyMap instanceProperties, + SchemaReader schemaReader) { + PropertyMapBuilder builder = new PropertyMapBuilder(schemaProperties); + for (int i = 0; i < requiredProperties.length; i++) { + if (!builder.contains(requiredProperties[i])) { + try { + builder.put(requiredProperties[i], + defaultClasses[i].newInstance()); + } + catch (InstantiationException e) { + } + catch (IllegalAccessException e) { + } + } + } + this.schemaProperties = builder.toPropertyMap(); + builder = new PropertyMapBuilder(instanceProperties); + for (int i = 0; i < requiredProperties.length; i++) { + if (!builder.contains(requiredProperties[i])) + builder.put(requiredProperties[i], + this.schemaProperties.get(requiredProperties[i])); + } + eh = new CountingErrorHandler((ErrorHandler)builder.get(ValidateProperty.ERROR_HANDLER)); + ValidateProperty.ERROR_HANDLER.put(builder, eh); + this.instanceProperties = builder.toPropertyMap(); + this.xrc = ValidateProperty.XML_READER_CREATOR.get(this.instanceProperties); + this.sr = schemaReader == null ? new AutoSchemaReader() : schemaReader; + } + + /** + * Equivalent to ValidationDriver(schemaProperties, instanceProperties, null). + * + * @see #ValidationDriver(PropertyMap,PropertyMap,SchemaReader) + */ + public ValidationDriver(PropertyMap schemaProperties, PropertyMap instanceProperties) { + this(schemaProperties, instanceProperties, null); + } + + /** + * Equivalent to ValidationDriver(properties, properties, sr). + * + * @see #ValidationDriver(PropertyMap,PropertyMap,SchemaReader) + */ + public ValidationDriver(PropertyMap properties, SchemaReader sr) { + this(properties, properties, sr); + } + + /** + * Equivalent to ValidationDriver(properties, properties, null). + * + * @see #ValidationDriver(PropertyMap,PropertyMap,SchemaReader) + */ + public ValidationDriver(PropertyMap properties) { + this(properties, properties, null); + } + + /** + * Equivalent to ValidationDriver(PropertyMap.EMPTY, PropertyMap.EMPTY, null). + * + * @see #ValidationDriver(PropertyMap,PropertyMap,SchemaReader) + */ + public ValidationDriver(SchemaReader sr) { + this(PropertyMap.EMPTY, sr); + } + + /** + * Equivalent to ValidationDriver(PropertyMap.EMPTY, PropertyMap.EMPTY, null). + * + * @see #ValidationDriver(PropertyMap,PropertyMap,SchemaReader) + */ + public ValidationDriver() { + this(PropertyMap.EMPTY, PropertyMap.EMPTY, null); + } + + /** + * Loads a schema. Subsequent calls to validate will validate with + * respect the loaded schema. This can be called more than once to allow + * multiple documents to be validated against different schemas. + * + * @param in the InputSource for the schema + * @return true if the schema was loaded successfully; false otherwise + * @throws IOException if an I/O error occurred + * @throws SAXException if an XMLReader or ErrorHandler threw a SAXException + */ + public boolean loadSchema(InputSource in) throws SAXException, IOException { + try { + schema = sr.createSchema(in, schemaProperties); + validator = null; + return true; + } + catch (IncorrectSchemaException e) { + return false; + } + } + + /** + * Validates a document against the currently loaded schema. This can be called + * multiple times in order to validate multiple documents. + * + * @param in the InputSource for the document to be validated + * @return true if the document is valid; false otherwise + * @throws java.lang.IllegalStateException if there is no currently loaded schema + * @throws java.io.IOException if an I/O error occurred + * @throws org.xml.sax.SAXException if an XMLReader or ErrorHandler threw a SAXException + */ + public boolean validate(InputSource in) throws SAXException, IOException { + if (schema == null) + throw new IllegalStateException("cannot validate without schema"); + if (validator == null) + validator = schema.createValidator(instanceProperties); + if (xr == null) { + xr = xrc.createXMLReader(); + xr.setErrorHandler(eh); + } + eh.reset(); + xr.setContentHandler(validator.getContentHandler()); + DTDHandler dh = validator.getDTDHandler(); + if (dh != null) + xr.setDTDHandler(dh); + try { + xr.parse(in); + return !eh.getHadErrorOrFatalError(); + } + finally { + validator.reset(); + } + } + + /** + * Returns an InputSource for a filename. + * + * @param filename a String specifying the filename + * @return an InputSource for the filename + */ + static public InputSource fileInputSource(String filename) throws MalformedURLException { + return ValidationDriver.fileInputSource(new File(filename)); + } + + /** + * Returns an InputSource for a File. + * + * @param file the File + * @return an InputSource for the filename + */ + static public InputSource fileInputSource(File file) throws MalformedURLException { + return new InputSource(UriOrFile.fileToUri(file)); + } + + /** + * Returns an InputSource for a string that represents either a file + * or an absolute URI. If the string looks like an absolute URI, it will be + * treated as an absolute URI, otherwise it will be treated as a filename. + * + * @param uriOrFile a String representing either a file or an absolute URI + * @return an InputSource for the file or absolute URI + */ + static public InputSource uriOrFileInputSource(String uriOrFile) throws MalformedURLException { + return new InputSource(UriOrFile.toUri(uriOrFile)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Validator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Validator.java new file mode 100644 index 0000000..47c77fa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/Validator.java @@ -0,0 +1,80 @@ +package com.thaiopensource.validate; + +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; + +/** + * Validates an XML document with respect to a schema. The schema is + * determined when the Validator is created and cannot be + * changed. The XML document is provided to the Validator + * by calling methods of the ContentHandler object returned + * by getContentHandler; the methods must be called in + * the sequence specified by the ContentHandler + * interface. If the getDTDHandler method returns + * a non-null object, then method calls must be made on it + * reporting DTD information. + * + *

Any errors will be reported to the ErrorHandler + * specified when the Validator was created. If, after the + * call to the endDocument method, no errors have been + * reported, then the XML document is valid. + * + *

A single Validator object is not safe for + * concurrent access from multiple threads. A single + * ValidatorHandler can be used to validate only a single + * document at a time. + * + *

After completing validation of an XML document (i.e. after calling + * the endDocument on the ContentHandler), + * reset can be called to allow validation of another + * document. The reset method may create new ContentHandler + * and DTDHandler objects or may simply reinitialize the + * state of the existing objects. Therefore, getContentHandler + * and getDTDHandler must be called after reset + * to retrieve the objects to which the XML document to be validated + * must be provided. + * + * @author James Clark + */ +public interface Validator { + /** + * Returns the ContentHandler that will receive the XML document. + * Information about the XML document to be validated must be + * reported by calling methods on the returned ContentHandler. + * When validation of an XML document has been completed (either + * endDocument() has been called or validation has been abandoned + * prematurely), reset() must be called. If no calls are made + * on the ContentHandler, then reset() need not be called. + * Implementations should allocate resources that require + * cleanup (e.g. threads, open files) lazily, typically + * in startDocument(). + * + * This method does not change the state of the Validator: the same + * object will always be returned unless reset is called. + * + * @see #reset() + * @return a ContentHandler, never null + */ + ContentHandler getContentHandler(); + + /** + * Returns a DTDHandler. Information about the DTD must be reported + * by calling methods on the returned object, unless null + * is returned. The same object will always be returned unless + * reset is called: this method does not change the state + * of the Validator. + * + * @return a DTDHandler, maybe null if DTD information is + * not significant to the Validator + */ + DTDHandler getDTDHandler(); + + /** + * Cleans up after validating a document. After completing validation + * of a document, reset must be called. After calling + * reset(), another document may be validated. Calling this method + * may create new ContentHandler and DTDHandler objects or may simply + * reinitialize the state of the existing objects. + */ + void reset(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReader.java new file mode 100644 index 0000000..22f241f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReader.java @@ -0,0 +1,95 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Option; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class AutoSchemaReader implements SchemaReader { + private final SchemaReceiverFactory srf; + + public AutoSchemaReader() { + this(new SchemaReceiverLoader()); + } + + public AutoSchemaReader(SchemaReceiverFactory srf) { + this.srf = srf == null ? new SchemaReceiverLoader() : srf; + } + + public Schema createSchema(InputSource in, PropertyMap properties) + throws IOException, SAXException, IncorrectSchemaException { + if (SchemaReceiverFactory.PROPERTY.get(properties) != srf) { + PropertyMapBuilder builder = new PropertyMapBuilder(properties); + SchemaReceiverFactory.PROPERTY.put(builder, srf); + properties = builder.toPropertyMap(); + } + InputSource in2 = new InputSource(); + in2.setSystemId(in.getSystemId()); + in2.setPublicId(in.getPublicId()); + in2.setEncoding(in.getEncoding()); + Rewindable rewindable; + if (in.getCharacterStream() != null) + throw new IllegalArgumentException("character stream input sources not supported for auto-detection"); + else { + InputStream byteStream = in.getByteStream(); + if (byteStream == null) { + String systemId = in.getSystemId(); + if (systemId == null) + throw new IllegalArgumentException("null systemId and null byteStream"); + byteStream = new URL(systemId).openStream(); + // XXX should use encoding from MIME header + } + RewindableInputStream rewindableByteStream = new RewindableInputStream(byteStream); + in.setByteStream(rewindableByteStream); + in2.setByteStream(rewindableByteStream); + rewindable = rewindableByteStream; + } + SchemaReceiver sr = new AutoSchemaReceiver(properties, rewindable); + XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties); + XMLReader xr = xrc.createXMLReader(); + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + if (eh != null) + xr.setErrorHandler(eh); + SchemaFuture sf = sr.installHandlers(xr); + try { + try { + xr.parse(in); + return sf.getSchema(); + } + catch (ReparseException e) { + rewindable.rewind(); + rewindable.willNotRewind(); + return e.reparse(in2); + } + finally { + rewindable.willNotRewind(); + } + } + catch (SAXException e) { + // Work around broken SAX parsers that catch and wrap runtime exceptions thrown by handlers + Exception nested = e.getException(); + if (nested instanceof RuntimeException) + sf.unwrapException((RuntimeException)nested); + throw e; + } + catch (RuntimeException e) { + throw sf.unwrapException(e); + } + } + + public Option getOption(String uri) { + return srf.getOption(uri); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReceiver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReceiver.java new file mode 100644 index 0000000..24a269c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/AutoSchemaReceiver.java @@ -0,0 +1,96 @@ +package com.thaiopensource.validate.auto; + +import org.xml.sax.XMLReader; +import org.xml.sax.SAXException; +import org.xml.sax.Locator; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +import java.io.IOException; +import java.util.Vector; + +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyMap; + +public class AutoSchemaReceiver implements SchemaReceiver { + private final PropertyMap properties; + private final Rewindable rewindable; + + private class Handler extends DefaultHandler implements SchemaFuture { + private final XMLReader xr; + private SchemaFuture sf = null; + private Locator locator = null; + private final Vector prefixMappings = new Vector(); + + private Handler(XMLReader xr) { + this.xr = xr; + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + public void startPrefixMapping(String prefix, String uri) { + prefixMappings.addElement(prefix); + prefixMappings.addElement(uri); + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + SchemaReceiverFactory srf = SchemaReceiverFactory.PROPERTY.get(properties); + SchemaReceiver sr = srf.createSchemaReceiver(uri, properties); + if (sr == null) { + Localizer localizer = new Localizer(AutoSchemaReceiver.class); + String detail = ("".equals(uri) + ? localizer.message("no_namespace") + : localizer.message("unknown_namespace", uri)); + throw new SAXParseException(detail, locator); + } + sf = sr.installHandlers(xr); + rewindable.willNotRewind(); + ContentHandler contentHandler = xr.getContentHandler(); + if (contentHandler == null) + return; + if (locator != null) { + contentHandler.setDocumentLocator(locator); + contentHandler = xr.getContentHandler(); + } + contentHandler.startDocument(); + contentHandler = xr.getContentHandler(); + for (int i = 0, len = prefixMappings.size(); i < len; i += 2) { + contentHandler.startPrefixMapping((String)prefixMappings.elementAt(i), + (String)prefixMappings.elementAt(i + 1)); + contentHandler = xr.getContentHandler(); + } + contentHandler.startElement(uri, localName, qName, attributes); + } + + public Schema getSchema() throws IncorrectSchemaException, SAXException, IOException { + if (sf == null) + throw new IncorrectSchemaException(); + return sf.getSchema(); + } + + public RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException { + if (sf == null) + return e; + return sf.unwrapException(e); + } + } + + public AutoSchemaReceiver(PropertyMap properties, Rewindable rewindable) { + this.properties = properties; + this.rewindable = rewindable; + } + + public SchemaFuture installHandlers(XMLReader xr) { + Handler h = new Handler(xr); + xr.setContentHandler(h); + return h; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/ReparseException.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/ReparseException.java new file mode 100644 index 0000000..81b1668 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/ReparseException.java @@ -0,0 +1,16 @@ +package com.thaiopensource.validate.auto; + +import org.xml.sax.SAXException; +import org.xml.sax.InputSource; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.IncorrectSchemaException; + +import java.io.IOException; + +public abstract class ReparseException extends SAXException { + public ReparseException() { + super((Exception)null); + } + + public abstract Schema reparse(InputSource in) throws IncorrectSchemaException, SAXException, IOException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/Rewindable.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/Rewindable.java new file mode 100644 index 0000000..ed0465c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/Rewindable.java @@ -0,0 +1,7 @@ +package com.thaiopensource.validate.auto; + +public interface Rewindable { + void willNotRewind(); + void rewind(); + boolean canRewind(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/RewindableInputStream.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/RewindableInputStream.java new file mode 100644 index 0000000..ffe9c92 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/RewindableInputStream.java @@ -0,0 +1,192 @@ +package com.thaiopensource.validate.auto; + +import java.io.InputStream; +import java.io.IOException; + +public class RewindableInputStream extends InputStream implements Rewindable { + static class Block { + Block next; + final byte[] buf; + int used = 0; + static final int MIN_SIZE = 1024; + Block(int minSize) { + buf = new byte[Math.max(MIN_SIZE, minSize)]; + } + + Block() { + this(0); + } + + void append(byte b) { + buf[used++] = b; + } + + void append(byte[] b, int off, int len) { + System.arraycopy(b, off, buf, used, len); + used += len; + } + } + + private Block head; + /** + * If curBlockAvail > 0, then there are curBlockAvail bytes available to be + * returned starting at curBlockPos in curBlock.buf. + */ + private int curBlockAvail; + private Block curBlock; + private int curBlockPos; + private Block lastBlock; + /** + * true unless willNotRewind has been called + */ + private boolean saving = true; + private final InputStream in; + private boolean pretendClosed = false; + /** + * true if we have got an EOF from the underlying InputStream + */ + private boolean eof; + + public RewindableInputStream(InputStream in) { + if (in == null) + throw new NullPointerException(); + this.in = in; + } + + public void close() throws IOException { + if (saving) { + curBlockAvail = 0; + curBlock = null; + pretendClosed = true; + } + else { + head = null; + curBlock = null; + lastBlock = null; + saving = false; + curBlockAvail = 0; + in.close(); + } + } + + public void rewind() { + if (!saving) + throw new IllegalStateException("rewind() after willNotRewind()"); + pretendClosed = false; + if (head == null) + return; + curBlock = head; + curBlockPos = 0; + curBlockAvail = curBlock.used; + } + + public boolean canRewind() { + return saving; + } + + public void willNotRewind() { + saving = false; + head = null; + lastBlock = null; + if (pretendClosed) { + pretendClosed = false; + try { + in.close(); + } + catch (IOException e) { } + } + } + + public int read() throws IOException { + if (curBlockAvail > 0) { + int c = curBlock.buf[curBlockPos++] & 0xFF; + --curBlockAvail; + if (curBlockAvail == 0) { + curBlock = curBlock.next; + if (curBlock != null) { + curBlockPos = 0; + curBlockAvail = curBlock.used; + } + } + return c; + } + int c = in.read(); + if (saving && c != -1) { + if (lastBlock == null) + lastBlock = head = new Block(); + else if (lastBlock.used == lastBlock.buf.length) + lastBlock = lastBlock.next = new Block(); + lastBlock.append((byte)c); + } + return c; + } + + public int read(byte b[], int off, int len) throws IOException { + if (curBlockAvail == 0 && !saving) + return in.read(b, off, len); + if (b == null) + throw new NullPointerException(); + if (len < 0) + throw new IndexOutOfBoundsException(); + int nRead = 0; + if (curBlockAvail != 0) { + for (;;) { + if (len == 0) + return nRead; + b[off++] = curBlock.buf[curBlockPos++]; + --len; + nRead++; + --curBlockAvail; + if (curBlockAvail == 0) { + curBlock = curBlock.next; + if (curBlock == null) + break; + curBlockAvail = curBlock.used; + curBlockPos = 0; + } + } + } + if (len == 0) + return nRead; + if (eof) + return nRead > 0 ? nRead : -1; + try { + int n = in.read(b, off, len); + if (n < 0) { + eof = true; + return nRead > 0 ? nRead : -1; + } + nRead += n; + if (saving) { + if (lastBlock == null) + lastBlock = head = new Block(n); + else if (lastBlock.buf.length - lastBlock.used < n) { + if (lastBlock.used != lastBlock.buf.length) { + int free = lastBlock.buf.length - lastBlock.used; + lastBlock.append(b, off, free); + off += free; + n -= free; + } + lastBlock = lastBlock.next = new Block(n); + } + lastBlock.append(b, off, n); + } + } + catch (IOException e) { + eof = true; + if (nRead == 0) + throw e; + } + return nRead; + } + + public int available() throws IOException { + if (curBlockAvail == 0) + return in.available(); + int n = curBlockAvail; + for (Block b = curBlock.next; b != null; b = b.next) + n += b.used; + return n + in.available(); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaFuture.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaFuture.java new file mode 100644 index 0000000..fabd895 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaFuture.java @@ -0,0 +1,13 @@ +package com.thaiopensource.validate.auto; + +import org.xml.sax.SAXException; + +import java.io.IOException; + +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.IncorrectSchemaException; + +public interface SchemaFuture { + Schema getSchema() throws IncorrectSchemaException, SAXException, IOException; + RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderFactorySchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderFactorySchemaReceiverFactory.java new file mode 100644 index 0000000..4562d17 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderFactorySchemaReceiverFactory.java @@ -0,0 +1,26 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.SchemaReaderFactory; +import com.thaiopensource.validate.Option; + +public class SchemaReaderFactorySchemaReceiverFactory implements SchemaReceiverFactory { + private final SchemaReaderFactory srf; + + public SchemaReaderFactorySchemaReceiverFactory(SchemaReaderFactory srf) { + this.srf = srf; + } + + public SchemaReceiver createSchemaReceiver(String namespaceUri, + PropertyMap properties) { + SchemaReader sr = srf.createSchemaReader(namespaceUri); + if (sr == null) + return null; + return new SchemaReaderSchemaReceiver(sr, properties); + } + + public Option getOption(String uri) { + return srf.getOption(uri); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.java new file mode 100644 index 0000000..97f2da4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderLoaderSchemaReceiverFactory.java @@ -0,0 +1,10 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.validate.SchemaReaderLoader; +import com.thaiopensource.validate.auto.SchemaReaderFactorySchemaReceiverFactory; + +public class SchemaReaderLoaderSchemaReceiverFactory extends SchemaReaderFactorySchemaReceiverFactory { + public SchemaReaderLoaderSchemaReceiverFactory() { + super(new SchemaReaderLoader()); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver.java new file mode 100644 index 0000000..19de882 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReaderSchemaReceiver.java @@ -0,0 +1,31 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.auto.ReparseException; +import com.thaiopensource.validate.auto.SchemaFuture; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; + +public class SchemaReaderSchemaReceiver implements SchemaReceiver { + private final SchemaReader schemaLanguage; + private final PropertyMap properties; + + public SchemaReaderSchemaReceiver(SchemaReader schemaLanguage, PropertyMap properties) { + this.schemaLanguage = schemaLanguage; + this.properties = properties; + } + + public SchemaFuture installHandlers(XMLReader xr) throws SAXException { + throw new ReparseException() { + public Schema reparse(InputSource in) throws IncorrectSchemaException, SAXException, IOException { + return schemaLanguage.createSchema(in, properties); + } + }; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiver.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiver.java new file mode 100644 index 0000000..f130caa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiver.java @@ -0,0 +1,9 @@ +package com.thaiopensource.validate.auto; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import com.thaiopensource.validate.auto.SchemaFuture; + +public interface SchemaReceiver { + SchemaFuture installHandlers(XMLReader xr) throws SAXException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverFactory.java new file mode 100644 index 0000000..2b681f0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverFactory.java @@ -0,0 +1,30 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.Option; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMapBuilder; + +public interface SchemaReceiverFactory { + public static class SchemaReceiverFactoryPropertyId extends PropertyId { + public SchemaReceiverFactoryPropertyId(String name) { + super(name, SchemaReceiverFactory.class); + } + + public SchemaReceiverFactory get(PropertyMap properties) { + return (SchemaReceiverFactory)properties.get(this); + } + + public SchemaReceiverFactory put(PropertyMapBuilder builder, SchemaReceiverFactory value) { + return (SchemaReceiverFactory)builder.put(this, value); + } + } + + static final SchemaReceiverFactoryPropertyId PROPERTY + = new SchemaReceiverFactoryPropertyId("SCHEMA_RECEIVER_FACTORY"); + SchemaReceiver createSchemaReceiver(String namespaceUri, + PropertyMap properties); + Option getOption(String uri); + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverLoader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverLoader.java new file mode 100644 index 0000000..6af945e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/SchemaReceiverLoader.java @@ -0,0 +1,34 @@ +package com.thaiopensource.validate.auto; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.Service; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.validate.Option; + +import java.util.Enumeration; + +public class SchemaReceiverLoader implements SchemaReceiverFactory { + private final Service service = new Service(SchemaReceiverFactory.class); + public SchemaReceiver createSchemaReceiver(String namespaceUri, + PropertyMap properties) { + for (Enumeration enumList = service.getProviders(); enumList.hasMoreElements();) { + SchemaReceiverFactory srf = (SchemaReceiverFactory)enumList.nextElement(); + SchemaReceiver sr = srf.createSchemaReceiver(namespaceUri, properties); + if (sr != null) + return sr; + } + return null; + } + + public Option getOption(String uri) { + for (Enumeration enumList = service.getProviders(); enumList.hasMoreElements();) { + SchemaReceiverFactory srf = (SchemaReceiverFactory)enumList.nextElement(); + Option option = srf.getOption(uri); + if (option != null) + return option; + } + return null; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/resources/Messages.properties new file mode 100644 index 0000000..8e444b4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/auto/resources/Messages.properties @@ -0,0 +1,2 @@ +unknown_namespace=no implementation available for schema language with namespace URI \"{0}\" +no_namespace=root element of schema must have a namespace diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ContextMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ContextMap.java new file mode 100644 index 0000000..f22ff2f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ContextMap.java @@ -0,0 +1,59 @@ +package com.thaiopensource.validate.mns; + +import com.thaiopensource.xml.util.Name; + +import java.util.Vector; +import java.util.Hashtable; + +class ContextMap { + private Object rootValue; + private Object otherValue; + private final Hashtable nameTable = new Hashtable(); + + Object get(Vector context) { + return get(context, context.size()); + } + + boolean put(boolean isRoot, Vector names, Object value) { + return put(isRoot, names, names.size(), value); + } + + private Object get(Vector context, int len) { + if (len > 0) { + ContextMap nestedMap = (ContextMap)nameTable.get(context.elementAt(len - 1)); + if (nestedMap != null) { + Object value = nestedMap.get(context, len - 1); + if (value != null) + return value; + } + } + if (rootValue != null && len == 0) + return rootValue; + return otherValue; + } + + private boolean put(boolean isRoot, Vector names, int len, Object value) { + if (len == 0) { + if (isRoot) { + if (rootValue != null) + return false; + rootValue = value; + } + else { + if (otherValue != null) + return false; + otherValue = value; + } + return true; + } + else { + Name name = (Name)names.elementAt(len - 1); + ContextMap nestedMap = (ContextMap)nameTable.get(name); + if (nestedMap == null) { + nestedMap = new ContextMap(); + nameTable.put(name, nestedMap); + } + return nestedMap.put(isRoot, names, len - 1, value); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ElementsOrAttributes.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ElementsOrAttributes.java new file mode 100644 index 0000000..8f4d40f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ElementsOrAttributes.java @@ -0,0 +1,41 @@ +package com.thaiopensource.validate.mns; + +class ElementsOrAttributes { + private static final int ELEMENTS_FLAG = 01; + private static final int ATTRIBUTES_FLAG = 02; + + static final ElementsOrAttributes NEITHER = new ElementsOrAttributes(0); + static final ElementsOrAttributes ELEMENTS = new ElementsOrAttributes(ELEMENTS_FLAG); + static final ElementsOrAttributes ATTRIBUTES = new ElementsOrAttributes(ATTRIBUTES_FLAG); + static final ElementsOrAttributes BOTH = new ElementsOrAttributes(ELEMENTS_FLAG|ATTRIBUTES_FLAG); + + private static final ElementsOrAttributes values[] = { + NEITHER, + ELEMENTS, + ATTRIBUTES, + BOTH + }; + + private int flags = 0; + + private ElementsOrAttributes(int flags) { + this.flags = flags; + } + + ElementsOrAttributes addElements() { + return values[flags | ELEMENTS_FLAG]; + } + + ElementsOrAttributes addAttributes() { + return values[flags | ATTRIBUTES_FLAG]; + } + + boolean containsAttributes() { + return (flags & ATTRIBUTES_FLAG) != 0; + } + + boolean containsElements() { + return (flags & ELEMENTS_FLAG) != 0; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/Hashset.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/Hashset.java new file mode 100644 index 0000000..5182cdc --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/Hashset.java @@ -0,0 +1,19 @@ +package com.thaiopensource.validate.mns; + +import java.util.Hashtable; + +class Hashset { + private final Hashtable table = new Hashtable(); + + boolean contains(Object key) { + return table.get(key) != null; + } + + void add(Object key) { + table.put(key, key); + } + + void clear() { + table.clear(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/MnsSchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/MnsSchemaReceiverFactory.java new file mode 100644 index 0000000..d629b94 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/MnsSchemaReceiverFactory.java @@ -0,0 +1,18 @@ +package com.thaiopensource.validate.mns; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.validate.Option; + +public class MnsSchemaReceiverFactory implements SchemaReceiverFactory { + public SchemaReceiver createSchemaReceiver(String namespaceUri, PropertyMap properties) { + if (!SchemaImpl.MNS_URI.equals(namespaceUri)) + return null; + return new SchemaReceiverImpl(properties); + } + + public Option getOption(String uri) { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.java new file mode 100644 index 0000000..e0d23bd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/NamespaceFilteredAttributes.java @@ -0,0 +1,110 @@ +package com.thaiopensource.validate.mns; + +import org.xml.sax.Attributes; + +class NamespaceFilteredAttributes implements Attributes { + private final String ns; + private final boolean keepLocal; + private final Attributes attributes; + private final int[] indexMap; + private final int[] reverseIndexMap; + + public NamespaceFilteredAttributes(String ns, boolean keepLocal, Attributes attributes) { + this.ns = ns; + this.keepLocal = keepLocal; + this.attributes = attributes; + int n = 0; + for (int i = 0, len = attributes.getLength(); i < len; i++) + if (keepAttribute(attributes.getURI(i))) + n++; + indexMap = new int[n]; + reverseIndexMap = new int[attributes.getLength()]; + n = 0; + for (int i = 0, len = attributes.getLength(); i < len; i++) { + if (keepAttribute(attributes.getURI(i))) { + reverseIndexMap[i] = n; + indexMap[n++] = i; + } + else + reverseIndexMap[i] = -1; + } + } + + private boolean keepAttribute(String uri) { + return uri.equals(ns) || (keepLocal && uri.equals("")); + } + + public int getLength() { + return indexMap.length; + } + + public String getURI(int index) { + if (index < 0 || index >= indexMap.length) + return null; + return attributes.getURI(indexMap[index]); + } + + public String getLocalName(int index) { + if (index < 0 || index >= indexMap.length) + return null; + return attributes.getLocalName(indexMap[index]); + } + + public String getQName(int index) { + if (index < 0 || index >= indexMap.length) + return null; + return attributes.getQName(indexMap[index]); + } + + public String getType(int index) { + if (index < 0 || index >= indexMap.length) + return null; + return attributes.getType(indexMap[index]); + } + + public String getValue(int index) { + if (index < 0 || index >= indexMap.length) + return null; + return attributes.getValue(indexMap[index]); + } + + public int getIndex(String uri, String localName) { + int n = attributes.getIndex(uri, localName); + if (n < 0) + return n; + return reverseIndexMap[n]; + } + + public int getIndex(String qName) { + int n = attributes.getIndex(qName); + if (n < 0) + return n; + return reverseIndexMap[n]; + } + + public String getType(String uri, String localName) { + if (keepAttribute(uri)) + return attributes.getType(uri, localName); + return null; + } + + public String getValue(String uri, String localName) { + if (keepAttribute(uri)) + return attributes.getValue(uri, localName); + return null; + } + + public String getType(String qName) { + int i = getIndex(qName); + if (i < 0) + return null; + return getType(i); + } + + public String getValue(String qName) { + int i = getIndex(qName); + if (i < 0) + return null; + return getValue(i); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaImpl.java new file mode 100644 index 0000000..cfeeef8 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaImpl.java @@ -0,0 +1,464 @@ +package com.thaiopensource.validate.mns; + +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.Uri; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.auto.SchemaFuture; +import com.thaiopensource.xml.sax.XmlBaseHandler; +import com.thaiopensource.xml.sax.DelegatingContentHandler; +import com.thaiopensource.xml.sax.CountingErrorHandler; +import com.thaiopensource.xml.util.Name; +import com.thaiopensource.xml.util.StringSplitter; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.LocatorImpl; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Stack; + +class SchemaImpl extends AbstractSchema { + static final String MNS_URI = "http://www.thaiopensource.com/ns/mns"; + private final Hashtable modeMap = new Hashtable(); + private Mode startMode; + private static final String DEFAULT_MODE_NAME = "#default"; + private final boolean attributesSchema; + + static private final class WrappedIOException extends RuntimeException { + private final IOException exception; + + private WrappedIOException(IOException exception) { + this.exception = exception; + } + + private IOException getException() { + return exception; + } + } + + static class ElementAction { + private final Schema schema; + private final Mode mode; + private final ContextMap contextMap; + private final ElementsOrAttributes prune; + private final Hashset covered = new Hashset(); + + ElementAction(String ns, Schema schema, Mode mode, ContextMap contextMap, ElementsOrAttributes prune) { + this.schema = schema; + this.mode = mode; + this.contextMap = contextMap; + this.prune = prune; + covered.add(ns); + } + + Mode getMode() { + return mode; + } + + ContextMap getContextMap() { + return contextMap; + } + + Schema getSchema() { + return schema; + } + + ElementsOrAttributes getPrune() { + return prune; + } + + Hashset getCoveredNamespaces() { + return covered; + } + } + + static class Mode { + private Locator whereDefined; + private boolean defined = false; + private ElementsOrAttributes lax; + private boolean strictDefined = false; + private final Hashtable elementMap = new Hashtable(); + private final Hashtable attributesMap = new Hashtable(); + + Mode(ElementsOrAttributes lax) { + this.lax = lax; + } + + ElementsOrAttributes getLax() { + return lax; + } + + Schema getAttributesSchema(String ns) { + return (Schema)attributesMap.get(ns); + } + + ElementAction getElementAction(String ns) { + return (ElementAction)elementMap.get(ns); + } + } + + private class Handler extends DelegatingContentHandler implements SchemaFuture { + private final SchemaReceiverImpl sr; + private ElementAction currentElementAction; + private boolean hadError = false; + private final ErrorHandler eh; + private final CountingErrorHandler ceh; + private final Localizer localizer = new Localizer(SchemaImpl.class); + private Locator locator; + private final XmlBaseHandler xmlBaseHandler = new XmlBaseHandler(); + private int foreignDepth = 0; + private String contextNs; + private Mode contextMode; + private String elementNs; + private String defaultSchemaType; + private final Stack nameStack = new Stack(); + private boolean isRoot; + private int pathDepth = 0; + private Validator validator; + + + Handler(SchemaReceiverImpl sr) { + this.sr = sr; + this.eh = ValidateProperty.ERROR_HANDLER.get(sr.getProperties()); + this.ceh = new CountingErrorHandler(eh); + } + + public void setDocumentLocator(Locator locator) { + xmlBaseHandler.setLocator(locator); + this.locator = locator; + } + + public void startDocument() throws SAXException { + try { + PropertyMapBuilder builder = new PropertyMapBuilder(sr.getProperties()); + ValidateProperty.ERROR_HANDLER.put(builder, ceh); + validator = sr.getMnsSchema().createValidator(builder.toPropertyMap()); + } + catch (IOException e) { + throw new WrappedIOException(e); + } + catch (IncorrectSchemaException e) { + throw new RuntimeException("internal error in RNG schema for MNS"); + } + setDelegate(validator.getContentHandler()); + if (locator != null) + super.setDocumentLocator(locator); + super.startDocument(); + } + + public Schema getSchema() throws IncorrectSchemaException, SAXException { + if (validator == null || ceh.getHadErrorOrFatalError()) + throw new IncorrectSchemaException(); + for (Enumeration enumList = modeMap.keys(); enumList.hasMoreElements();) { + String modeName = (String)enumList.nextElement(); + Mode mode = (Mode)modeMap.get(modeName); + if (!mode.defined && !modeName.equals(DEFAULT_MODE_NAME)) + error("undefined_mode", modeName, mode.whereDefined); + } + if (hadError) + throw new IncorrectSchemaException(); + return SchemaImpl.this; + } + + public RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException { + if (e instanceof WrappedIOException) + throw ((WrappedIOException)e).getException(); + return e; + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + super.startElement(uri, localName, qName, attributes); + xmlBaseHandler.startElement(); + String xmlBase = attributes.getValue(WellKnownNamespaces.XML, "base"); + if (xmlBase != null) + xmlBaseHandler.xmlBaseAttribute(xmlBase); + if (!MNS_URI.equals(uri) || foreignDepth > 0) { + foreignDepth++; + return; + } + if (ceh.getHadErrorOrFatalError()) + return; + if (localName.equals("rules")) + parseRules(attributes); + else if (localName.equals("cover")) + parseCover(attributes); + else if (localName.equals("context")) + parseContext(attributes); + else if (localName.equals("root")) + parseRoot(attributes); + else if (localName.equals("element")) + parseElement(attributes); + else if (localName.equals("lax")) + parseLax(attributes); + else + parseValidate(localName.equals("validateAttributes"), attributes); + } + + public void endElement(String namespaceURI, String localName, + String qName) + throws SAXException { + super.endElement(namespaceURI, localName, qName); + xmlBaseHandler.endElement(); + if (foreignDepth > 0) { + foreignDepth--; + return; + } + if (pathDepth > 0) { + pathDepth--; + if (pathDepth == 0) + endPath(); + } + } + + + private void parseRules(Attributes attributes) { + String modeName = attributes.getValue("", "startMode"); + if (modeName == null) + modeName = DEFAULT_MODE_NAME; + defaultSchemaType = getSchemaType(attributes); + startMode = lookupCreateMode(modeName); + } + + private void parseCover(Attributes attributes) throws SAXException { + String ns = getNs(attributes, false); + currentElementAction.covered.add(ns); + } + + private void parseLax(Attributes attributes) throws SAXException { + String[] modeNames = getInModes(attributes); + Mode[] modes = getModes(modeNames); + ElementsOrAttributes lax = toElementsOrAttributes(attributes.getValue("", "allow"), + ElementsOrAttributes.BOTH); + for (int i = 0; i < modes.length; i++) { + if (modes[i].strictDefined) + error("lax_multiply_defined", modeNames[i]); + else { + modes[i].lax = lax; + modes[i].strictDefined = true; + } + } + } + + private void parseValidate(boolean isAttribute, Attributes attributes) throws SAXException { + String[] modeNames = getInModes(attributes); + Mode[] modes = getModes(modeNames); + String ns = getNs(attributes, isAttribute); + String schemaUri = getSchema(attributes); + String schemaType = getSchemaType(attributes); + if (schemaType == null) + schemaType = defaultSchemaType; + try { + if (isAttribute) { + Schema schema = sr.createChildSchema(new InputSource(schemaUri), schemaType, true); + for (int i = 0; i < modes.length; i++) { + if (modes[i].attributesMap.get(ns) != null) + error("validate_attributes_multiply_defined", modeNames[i], ns); + else + modes[i].attributesMap.put(ns, schema); + } + } + else { + Schema schema = sr.createChildSchema(new InputSource(schemaUri), schemaType, false); + currentElementAction = new ElementAction(ns, + schema, + getUseMode(attributes), + new ContextMap(), + getPrune(attributes)); + contextNs = ns; + for (int i = 0; i < modes.length; i++) { + if (modes[i].elementMap.get(ns) != null) + error("validate_element_multiply_defined", modeNames[i], ns); + else + modes[i].elementMap.put(ns, currentElementAction); + } + } + } + catch (IncorrectSchemaException e) { + hadError = true; + } + catch (IOException e) { + throw new WrappedIOException(e); + } + } + + private void parseContext(Attributes attributes) throws SAXException { + String ns = getNs(attributes, false); + if (ns != null) + contextNs = ns; + elementNs = contextNs; + contextMode = getUseMode(attributes); + } + + private void parseRoot(Attributes attributes) throws SAXException { + String ns = getNs(attributes, false); + if (ns != null) + elementNs = ns; + isRoot = true; + pathDepth++; + } + + private void parseElement(Attributes attributes) throws SAXException { + String ns = getNs(attributes, false); + if (ns != null) + elementNs = ns; + if (!currentElementAction.covered.contains(elementNs)) + error("context_ns_not_covered", elementNs); + nameStack.push(new Name(elementNs, attributes.getValue("", "name").trim())); + pathDepth++; + } + + private void endPath() throws SAXException { + if (!currentElementAction.contextMap.put(isRoot, nameStack, contextMode)) + error("path_multiply_defined", displayPath(isRoot, nameStack)); + elementNs = contextNs; + isRoot = false; + nameStack.setSize(0); + } + + private String displayPath(boolean isRoot, Stack nameStack) { + StringBuffer buf = new StringBuffer(); + for (int i = 0, len = nameStack.size(); i < len; i++) { + if (i > 0 || isRoot) + buf.append('/'); + Name name = (Name)nameStack.elementAt(i); + if (name.getNamespaceUri().length() > 0) { + buf.append('{'); + buf.append(name.getNamespaceUri()); + buf.append('}'); + } + buf.append(name.getLocalName()); + } + return buf.toString(); + } + + private String getSchema(Attributes attributes) throws SAXException { + String schemaUri = attributes.getValue("", "schema"); + if (Uri.hasFragmentId(schemaUri)) + error("schema_fragment_id"); + return Uri.resolve(xmlBaseHandler.getBaseUri(), + Uri.escapeDisallowedChars(schemaUri)); + } + + private String getSchemaType(Attributes attributes) { + return attributes.getValue("", "schemaType"); + } + + private ElementsOrAttributes getPrune(Attributes attributes) { + return toElementsOrAttributes(attributes.getValue("", "prune"), + ElementsOrAttributes.NEITHER); + } + + private ElementsOrAttributes toElementsOrAttributes(String value, ElementsOrAttributes defaultValue) { + if (value == null) + return defaultValue; + ElementsOrAttributes eoa = ElementsOrAttributes.NEITHER; + if (value.indexOf("elements") >= 0) + eoa = eoa.addElements(); + if (value.indexOf("attributes") >= 0) + eoa = eoa.addAttributes(); + return eoa; + } + + private Mode getUseMode(Attributes attributes) { + String modeName = attributes.getValue("", "useMode"); + if (modeName == null) + modeName = DEFAULT_MODE_NAME; + Mode mode = lookupCreateMode(modeName); + if (mode.whereDefined == null && locator != null) + mode.whereDefined = new LocatorImpl(locator); + return mode; + } + + private String getNs(Attributes attributes, boolean forbidEmpty) throws SAXException { + String ns = attributes.getValue("", "ns"); + if (ns != null && !Uri.isAbsolute(ns) && (forbidEmpty || !ns.equals(""))) + error("ns_absolute"); + return ns; + } + + private Mode[] getModes(String[] modeNames) { + Mode[] modes = new Mode[modeNames.length]; + for (int i = 0; i < modes.length; i++) { + modes[i] = lookupCreateMode(modeNames[i]); + modes[i].defined = true; + } + return modes; + } + + private String[] getInModes(Attributes attributes) { + String inModes = attributes.getValue("", "inModes"); + if (inModes == null) + return new String[] { DEFAULT_MODE_NAME }; + return StringSplitter.split(inModes); + } + + + void error(String key) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key), locator)); + } + + void error(String key, String arg) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg), locator)); + } + + void error(String key, String arg, Locator locator) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg), locator)); + } + + void error(String key, String arg1, String arg2) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg1, arg2), locator)); + } + + } + + SchemaImpl(boolean attributesSchema) { + this.attributesSchema = attributesSchema; + } + + SchemaFuture installHandlers(XMLReader in, SchemaReceiverImpl sr) { + Handler h = new Handler(sr); + in.setContentHandler(h); + return h; + } + + public Validator createValidator(PropertyMap properties) { + return new ValidatorImpl(startMode, properties); + } + + private Mode lookupCreateMode(String name) { + Mode mode = (Mode)modeMap.get(name); + if (mode == null) { + mode = new Mode(attributesSchema ? ElementsOrAttributes.ELEMENTS : ElementsOrAttributes.NEITHER); + modeMap.put(name, mode); + } + return mode; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaReceiverImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaReceiverImpl.java new file mode 100644 index 0000000..766f4cc --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/SchemaReceiverImpl.java @@ -0,0 +1,92 @@ +package com.thaiopensource.validate.mns; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.validate.rng.SAXSchemaReader; +import com.thaiopensource.validate.nrl.NrlSchemaReceiverFactory; +import com.thaiopensource.validate.nrl.NrlProperty; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.validate.auto.SchemaFuture; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; +import java.net.URL; + +class SchemaReceiverImpl implements SchemaReceiver { + private static final String MNS_SCHEMA = "mns.rng"; + private static final String RNC_MEDIA_TYPE = "application/x-rnc"; + private final PropertyMap properties; + private final PropertyMap attributeSchemaProperties; + private final boolean attributesSchema; + private final SchemaReader autoSchemaLanguage; + private Schema mnsSchema = null; + + public SchemaReceiverImpl(PropertyMap properties) { + this.attributesSchema = properties.contains(NrlProperty.ATTRIBUTES_SCHEMA); + PropertyMapBuilder builder = new PropertyMapBuilder(properties); + if (attributesSchema) { + attributeSchemaProperties = properties; + builder.put(NrlProperty.ATTRIBUTES_SCHEMA, null); + this.properties = builder.toPropertyMap(); + } + else { + this.properties = properties; + NrlProperty.ATTRIBUTES_SCHEMA.add(builder); + attributeSchemaProperties = builder.toPropertyMap(); + } + this.autoSchemaLanguage = new AutoSchemaReader(SchemaReceiverFactory.PROPERTY.get(properties)); + } + + public SchemaFuture installHandlers(XMLReader xr) { + return new SchemaImpl(attributesSchema).installHandlers(xr, this); + } + + Schema getMnsSchema() throws IOException, IncorrectSchemaException, SAXException { + if (mnsSchema == null) { + String className = SchemaReceiverImpl.class.getName(); + String resourceName = className.substring(0, className.lastIndexOf('.')).replace('.', '/') + "/resources/" + MNS_SCHEMA; + URL mnsSchemaUrl = getResource(resourceName); + mnsSchema = SAXSchemaReader.getInstance().createSchema( + new InputSource(mnsSchemaUrl.toString()), + properties); + } + return mnsSchema; + } + + private static URL getResource(String resourceName) { + ClassLoader cl = SchemaReceiverImpl.class.getClassLoader(); + // XXX see if we should borrow 1.2 code from Service + if (cl == null) + return ClassLoader.getSystemResource(resourceName); + else + return cl.getResource(resourceName); + } + + PropertyMap getProperties() { + return properties; + } + + Schema createChildSchema(InputSource inputSource, String schemaType, boolean isAttributesSchema) throws IOException, IncorrectSchemaException, SAXException { + SchemaReader lang = isRnc(schemaType) ? CompactSchemaReader.getInstance() : autoSchemaLanguage; + return lang.createSchema(inputSource, + isAttributesSchema ? attributeSchemaProperties : properties); + } + + private static boolean isRnc(String schemaType) { + if (schemaType == null) + return false; + schemaType = schemaType.trim(); + return schemaType.equals(RNC_MEDIA_TYPE); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ValidatorImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ValidatorImpl.java new file mode 100644 index 0000000..8287656 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/ValidatorImpl.java @@ -0,0 +1,263 @@ +package com.thaiopensource.validate.mns; + +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.mns.ContextMap; +import com.thaiopensource.validate.mns.Hashset; +import com.thaiopensource.validate.mns.ElementsOrAttributes; +import com.thaiopensource.xml.util.Name; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyMap; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.helpers.DefaultHandler; + +import java.util.Stack; +import java.util.Hashtable; + +class ValidatorImpl extends DefaultHandler implements Validator { + private static final String BEARER_URI = ""; + private static final String BEARER_LOCAL_NAME = "#bearer"; + private SchemaImpl.Mode currentMode; + private int laxDepth = 0; + private final ErrorHandler eh; + private final PropertyMap properties; + private Locator locator; + private Subtree subtrees = null; + private final Hashset attributeNamespaces = new Hashset(); + private PrefixMapping prefixMapping = null; + private final Localizer localizer = new Localizer(ValidatorImpl.class); + private final Hashtable validatorCache = new Hashtable(); + + static private class Subtree { + final Subtree parent; + final Validator validator; + final Schema schema; + final Hashset coveredNamespaces; + final ElementsOrAttributes prune; + final SchemaImpl.Mode parentMode; + final int parentLaxDepth; + final Stack context = new Stack(); + final ContextMap contextMap; + + Subtree(Hashset coveredNamespaces, ContextMap contextMap, + ElementsOrAttributes prune, Validator validator, + Schema schema, SchemaImpl.Mode parentMode, int parentLaxDepth, Subtree parent) { + this.coveredNamespaces = coveredNamespaces; + this.contextMap = contextMap; + this.prune = prune; + this.validator = validator; + this.schema = schema; + this.parentMode = parentMode; + this.parentLaxDepth = parentLaxDepth; + this.parent = parent; + } + } + + static private class PrefixMapping { + final String prefix; + final String uri; + final PrefixMapping parent; + + PrefixMapping(String prefix, String uri, PrefixMapping parent) { + this.prefix = prefix; + this.uri = uri; + this.parent = parent; + } + } + + ValidatorImpl(SchemaImpl.Mode mode, PropertyMap properties) { + this.currentMode = mode; + this.properties = properties; + this.eh = ValidateProperty.ERROR_HANDLER.get(properties); + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + public void characters(char ch[], int start, int length) + throws SAXException { + for (Subtree st = subtrees; wantsEvent(st); st = st.parent) + st.validator.getContentHandler().characters(ch, start, length); + } + + public void ignorableWhitespace(char ch[], int start, int length) + throws SAXException { + for (Subtree st = subtrees; wantsEvent(st); st = st.parent) + st.validator.getContentHandler().ignorableWhitespace(ch, start, length); + } + + private SchemaImpl.Mode getMode() { + if (subtrees != null) { + SchemaImpl.Mode mode = (SchemaImpl.Mode)subtrees.contextMap.get(subtrees.context); + if (mode != null) + return mode; + } + return currentMode; + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + if (namespaceCovered(uri)) + subtrees.context.push(new Name(uri, localName)); + else { + SchemaImpl.Mode mode = getMode(); + SchemaImpl.ElementAction elementAction = mode.getElementAction(uri); + if (elementAction == null) { + if (laxDepth == 0 && !mode.getLax().containsElements()) + error("element_undeclared_namespace", uri); + laxDepth++; + } + else { + subtrees = new Subtree(elementAction.getCoveredNamespaces(), + elementAction.getContextMap(), + elementAction.getPrune(), + createValidator(elementAction.getSchema()), + elementAction.getSchema(), + currentMode, + laxDepth, + subtrees); + subtrees.context.push(new Name(uri, localName)); + currentMode = elementAction.getMode(); + laxDepth = 0; + startSubtree(subtrees.validator.getContentHandler()); + } + } + for (Subtree st = subtrees; wantsEvent(st); st = st.parent) { + Attributes prunedAtts; + if (st.prune.containsAttributes()) + prunedAtts = new NamespaceFilteredAttributes(uri, true, attributes); + else + prunedAtts = attributes; + st.validator.getContentHandler().startElement(uri, localName, qName, prunedAtts); + } + for (int i = 0, len = attributes.getLength(); i < len; i++) { + String ns = attributes.getURI(i); + if (!ns.equals("") + && !ns.equals(uri) + && !namespaceCovered(ns) + && !attributeNamespaces.contains(ns)) { + attributeNamespaces.add(ns); + validateAttributes(ns, attributes); + } + } + attributeNamespaces.clear(); + } + + private boolean namespaceCovered(String ns) { + return (laxDepth == 0 + && subtrees != null + && subtrees.coveredNamespaces.contains(ns)); + } + + private boolean wantsEvent(Subtree st) { + return st != null && (!st.prune.containsElements() || (laxDepth == 0 && st == subtrees)); + } + + private void validateAttributes(String ns, Attributes attributes) throws SAXException { + SchemaImpl.Mode mode = getMode(); + Schema attributesSchema = mode.getAttributesSchema(ns); + if (attributesSchema == null) { + if (!mode.getLax().containsAttributes()) + error("attributes_undeclared_namespace", ns); + return; + } + Validator validator = createValidator(attributesSchema); + ContentHandler ch = validator.getContentHandler(); + startSubtree(ch); + ch.startElement(BEARER_URI, BEARER_LOCAL_NAME, BEARER_LOCAL_NAME, + new NamespaceFilteredAttributes(ns, false, attributes)); + ch.endElement(BEARER_URI, BEARER_LOCAL_NAME, BEARER_LOCAL_NAME); + endSubtree(ch); + releaseValidator(attributesSchema, validator); + } + + private void startSubtree(ContentHandler ch) throws SAXException { + if (locator != null) + ch.setDocumentLocator(locator); + ch.startDocument(); + for (PrefixMapping pm = prefixMapping; pm != null; pm = pm.parent) + ch.startPrefixMapping(pm.prefix, pm.uri); + } + + private void endSubtree(ContentHandler ch) throws SAXException { + for (PrefixMapping pm = prefixMapping; pm != null; pm = pm.parent) + ch.endPrefixMapping(pm.prefix); + ch.endDocument(); + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + for (Subtree st = subtrees; wantsEvent(st); st = st.parent) + st.validator.getContentHandler().endElement(uri, localName, qName); + if (laxDepth > 0) + laxDepth--; + else if (!subtrees.context.empty()) { + subtrees.context.pop(); + if (subtrees.context.empty()) { + endSubtree(subtrees.validator.getContentHandler()); + releaseValidator(subtrees.schema, subtrees.validator); + currentMode = subtrees.parentMode; + laxDepth = subtrees.parentLaxDepth; + subtrees = subtrees.parent; + } + } + } + + private Validator createValidator(Schema schema) { + Stack stack = (Stack)validatorCache.get(schema); + if (stack == null) { + stack = new Stack(); + validatorCache.put(schema, stack); + } + if (stack.empty()) + return schema.createValidator(properties); + return (Validator)stack.pop(); + } + + private void releaseValidator(Schema schema, Validator validator) { + validator.reset(); + ((Stack)validatorCache.get(schema)).push(validator); + } + + public void endDocument() + throws SAXException { + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + super.startPrefixMapping(prefix, uri); + prefixMapping = new PrefixMapping(prefix, uri, prefixMapping); + } + + public void endPrefixMapping(String prefix) + throws SAXException { + super.endPrefixMapping(prefix); + prefixMapping = prefixMapping.parent; + } + + public void reset() { + subtrees = null; + locator = null; + } + + public ContentHandler getContentHandler() { + return this; + } + + public DTDHandler getDTDHandler() { + return null; + } + + private void error(String key, String arg) throws SAXException { + eh.error(new SAXParseException(localizer.message(key, arg), locator)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/Messages.properties new file mode 100644 index 0000000..6cc1d91 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/Messages.properties @@ -0,0 +1,10 @@ +element_undeclared_namespace=no applicable schema for element with namespace \"{0}\" in this context +attributes_undeclared_namespace=no applicable schema for one or more attributes with namespace \"{0}\" in this context +lax_multiply_defined=laxness for mode \"{0}\" already defined +undefined_mode=mode \"{0}\" not defined +schema_fragment_id=schema URI must not have a fragment identifier +ns_absolute=namespace URI must be absolute URI +validate_attributes_multiply_defined=multiple applicable \"validateAttributes\" elements in mode \"{0}\" for namespace \"{1}\" +validate_element_multiply_defined=multiple applicable \"validateElement\" elements in mode \"{0}\" for namespace \"{1}\" +path_multiply_defined=mode for context \"{0}\" already defined +context_ns_not_covered=namespace of contextual element not covered diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/mns.rng b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/mns.rng new file mode 100644 index 0000000..ee9c633 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/mns/resources/mns.rng @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #default + + + + + + + elements + attributes + + + attributes + elements + + elements + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Action.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Action.java new file mode 100644 index 0000000..4b271f4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Action.java @@ -0,0 +1,21 @@ +package com.thaiopensource.validate.nrl; + +abstract class Action { + private final ModeUsage modeUsage; + + Action(ModeUsage modeUsage) { + this.modeUsage = modeUsage; + } + + ModeUsage getModeUsage() { + return modeUsage; + } + + public boolean equals(Object obj) { + return obj != null && obj.getClass() == getClass() && ((Action)obj).modeUsage.equals(modeUsage); + } + + public int hashCode() { + return getClass().hashCode() ^ modeUsage.hashCode(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ActionSet.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ActionSet.java new file mode 100644 index 0000000..874ed59 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ActionSet.java @@ -0,0 +1,35 @@ +package com.thaiopensource.validate.nrl; + +class ActionSet { + private ResultAction resultAction; + private NoResultAction[] noResultActions = new NoResultAction[0]; + + ResultAction getResultAction() { + return resultAction; + } + + void setResultAction(ResultAction resultAction) { + this.resultAction = resultAction; + } + + void addNoResultAction(NoResultAction action) { + NoResultAction[] actions = new NoResultAction[noResultActions.length + 1]; + System.arraycopy(noResultActions, 0, actions, 0, noResultActions.length); + actions[noResultActions.length] = action; + noResultActions = actions; + } + + NoResultAction[] getNoResultActions() { + return noResultActions; + } + + ActionSet changeCurrentMode(Mode mode) { + ActionSet actions = new ActionSet(); + if (this.resultAction != null) + actions.resultAction = this.resultAction.changeCurrentMode(mode); + actions.noResultActions = new NoResultAction[this.noResultActions.length]; + for (int i = 0; i < actions.noResultActions.length; i++) + actions.noResultActions[i] = this.noResultActions[i].changeCurrentMode(mode); + return actions; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AllowAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AllowAction.java new file mode 100644 index 0000000..1f33ca4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AllowAction.java @@ -0,0 +1,16 @@ +package com.thaiopensource.validate.nrl; + +class AllowAction extends NoResultAction { + AllowAction(ModeUsage modeUsage) { + super(modeUsage); + } + + void perform(SectionState state) { + state.addChildMode(getModeUsage(), null); + state.addAttributeValidationModeUsage(getModeUsage()); + } + + NoResultAction changeCurrentMode(Mode mode) { + return new AllowAction(getModeUsage().changeCurrentMode(mode)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttachAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttachAction.java new file mode 100644 index 0000000..2c162ab --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttachAction.java @@ -0,0 +1,25 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import org.xml.sax.ContentHandler; + +class AttachAction extends ResultAction { + AttachAction(ModeUsage modeUsage) { + super(modeUsage); + } + + void perform(ContentHandler handler, SectionState state) { + final ModeUsage modeUsage = getModeUsage(); + if (handler != null) + state.addActiveHandler(handler, modeUsage); + else + state.addAttributeValidationModeUsage(modeUsage); + state.addChildMode(modeUsage, handler); + } + + ResultAction changeCurrentMode(Mode mode) { + return new AttachAction(getModeUsage().changeCurrentMode(mode)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttributeActionSet.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttributeActionSet.java new file mode 100644 index 0000000..596fa6f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/AttributeActionSet.java @@ -0,0 +1,36 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Schema; + +class AttributeActionSet { + private boolean attach; + private boolean reject; + private Schema[] schemas = new Schema[0]; + + boolean getAttach() { + return attach; + } + + void setAttach(boolean attach) { + this.attach = attach; + } + + boolean getReject() { + return reject; + } + + void setReject(boolean reject) { + this.reject = reject; + } + + Schema[] getSchemas() { + return schemas; + } + + void addSchema(Schema schema) { + Schema[] s = new Schema[schemas.length + 1]; + System.arraycopy(schemas, 0, s, 0, schemas.length); + s[schemas.length] = schema; + schemas = s; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ContextMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ContextMap.java new file mode 100644 index 0000000..f947040 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ContextMap.java @@ -0,0 +1,137 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.util.Equal; + +import java.util.Vector; +import java.util.Hashtable; +import java.util.Enumeration; +import java.util.NoSuchElementException; + +class ContextMap { + private Object rootValue; + private Object otherValue; + private final Hashtable nameTable = new Hashtable(); + + Object get(Vector context) { + return get(context, context.size()); + } + + boolean put(boolean isRoot, Vector names, Object value) { + return put(isRoot, names, names.size(), value); + } + + private Object get(Vector context, int len) { + if (len > 0) { + ContextMap nestedMap = (ContextMap)nameTable.get(context.elementAt(len - 1)); + if (nestedMap != null) { + Object value = nestedMap.get(context, len - 1); + if (value != null) + return value; + } + } + if (rootValue != null && len == 0) + return rootValue; + return otherValue; + } + + private boolean put(boolean isRoot, Vector names, int len, Object value) { + if (len == 0) { + if (isRoot) { + if (rootValue != null) + return false; + rootValue = value; + } + else { + if (otherValue != null) + return false; + otherValue = value; + } + return true; + } + else { + Object name = names.elementAt(len - 1); + ContextMap nestedMap = (ContextMap)nameTable.get(name); + if (nestedMap == null) { + nestedMap = new ContextMap(); + nameTable.put(name, nestedMap); + } + return nestedMap.put(isRoot, names, len - 1, value); + } + } + + public boolean equals(Object obj) { + if (!(obj instanceof ContextMap)) + return false; + ContextMap other = (ContextMap)obj; + if (!Equal.equal(this.rootValue, other.rootValue) + || !Equal.equal(this.otherValue, other.otherValue)) + return false; + // We want jing to work with JDK 1.1 so we cannot use Hashtable.equals + if (this.nameTable.size() != other.nameTable.size()) + return false; + for (Enumeration e = nameTable.keys(); e.hasMoreElements();) { + Object key = e.nextElement(); + if (!nameTable.get(key).equals(other.nameTable.get(key))) + return false; + } + return true; + } + + public int hashCode() { + int hc = 0; + if (rootValue != null) + hc ^= rootValue.hashCode(); + if (otherValue != null) + hc ^= otherValue.hashCode(); + for (Enumeration e = nameTable.keys(); e.hasMoreElements();) { + Object key = e.nextElement(); + hc ^= key.hashCode(); + hc ^= nameTable.get(key).hashCode(); + } + return hc; + } + + static private class Enumerator implements Enumeration { + private Object rootValue; + private Object otherValue; + private Enumeration subMapValues; + private final Enumeration subMaps; + + private Enumerator(ContextMap map) { + rootValue = map.rootValue; + otherValue = map.otherValue; + subMaps = map.nameTable.elements(); + } + + private void prep() { + while ((subMapValues == null || !subMapValues.hasMoreElements()) && subMaps.hasMoreElements()) + subMapValues = ((ContextMap)subMaps.nextElement()).values(); + } + + public boolean hasMoreElements() { + prep(); + return rootValue != null || otherValue != null || (subMapValues != null && subMapValues.hasMoreElements()); + } + + public Object nextElement() { + if (rootValue != null) { + Object tem = rootValue; + rootValue = null; + return tem; + } + if (otherValue != null) { + Object tem = otherValue; + otherValue = null; + return tem; + } + prep(); + if (subMapValues == null) + throw new NoSuchElementException(); + return subMapValues.nextElement(); + } + } + + Enumeration values() { + return new Enumerator(this); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ElementsOrAttributes.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ElementsOrAttributes.java new file mode 100644 index 0000000..96e5bd5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ElementsOrAttributes.java @@ -0,0 +1,41 @@ +package com.thaiopensource.validate.nrl; + +class ElementsOrAttributes { + private static final int ELEMENTS_FLAG = 01; + private static final int ATTRIBUTES_FLAG = 02; + + static final ElementsOrAttributes NEITHER = new ElementsOrAttributes(0); + static final ElementsOrAttributes ELEMENTS = new ElementsOrAttributes(ELEMENTS_FLAG); + static final ElementsOrAttributes ATTRIBUTES = new ElementsOrAttributes(ATTRIBUTES_FLAG); + static final ElementsOrAttributes BOTH = new ElementsOrAttributes(ELEMENTS_FLAG|ATTRIBUTES_FLAG); + + private static final ElementsOrAttributes values[] = { + NEITHER, + ELEMENTS, + ATTRIBUTES, + BOTH + }; + + private int flags = 0; + + private ElementsOrAttributes(int flags) { + this.flags = flags; + } + + ElementsOrAttributes addElements() { + return values[flags | ELEMENTS_FLAG]; + } + + ElementsOrAttributes addAttributes() { + return values[flags | ATTRIBUTES_FLAG]; + } + + boolean containsAttributes() { + return (flags & ATTRIBUTES_FLAG) != 0; + } + + boolean containsElements() { + return (flags & ELEMENTS_FLAG) != 0; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/FilteredAttributes.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/FilteredAttributes.java new file mode 100644 index 0000000..5cd4fab --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/FilteredAttributes.java @@ -0,0 +1,102 @@ +package com.thaiopensource.validate.nrl; + +import org.xml.sax.Attributes; + +class FilteredAttributes implements Attributes { + private final Attributes attributes; + private final IntSet indexSet; + private int[] reverseIndexMap; + + public FilteredAttributes(IntSet indexSet, Attributes attributes) { + this.indexSet = indexSet; + this.attributes = attributes; + } + + private int reverseIndex(int k) { + if (reverseIndexMap == null) { + reverseIndexMap = new int[attributes.getLength()]; + for (int i = 0, len = indexSet.size(); i < len; i++) + reverseIndexMap[indexSet.get(i)] = i + 1; + } + return reverseIndexMap[k] - 1; + } + + public int getLength() { + return indexSet.size(); + } + + public String getURI(int index) { + if (index < 0 || index >= indexSet.size()) + return null; + return attributes.getURI(indexSet.get(index)); + } + + public String getLocalName(int index) { + if (index < 0 || index >= indexSet.size()) + return null; + return attributes.getLocalName(indexSet.get(index)); + } + + public String getQName(int index) { + if (index < 0 || index >= indexSet.size()) + return null; + return attributes.getQName(indexSet.get(index)); + } + + public String getType(int index) { + if (index < 0 || index >= indexSet.size()) + return null; + return attributes.getType(indexSet.get(index)); + } + + public String getValue(int index) { + if (index < 0 || index >= indexSet.size()) + return null; + return attributes.getValue(indexSet.get(index)); + } + + public int getIndex(String uri, String localName) { + int n = attributes.getIndex(uri, localName); + if (n < 0) + return n; + return reverseIndex(n); + } + + public int getIndex(String qName) { + int n = attributes.getIndex(qName); + if (n < 0) + return n; + return reverseIndex(n); + } + + private int getRealIndex(String uri, String localName) { + int index = attributes.getIndex(uri, localName); + if (index < 0 || reverseIndex(index) < 0) + return -1; + return index; + } + + private int getRealIndex(String qName) { + int index = attributes.getIndex(qName); + if (index < 0 || reverseIndex(index) < 0) + return -1; + return index; + } + + public String getType(String uri, String localName) { + return attributes.getType(getRealIndex(uri, localName)); + } + + public String getValue(String uri, String localName) { + return attributes.getValue(getRealIndex(uri, localName)); + } + + public String getType(String qName) { + return attributes.getType(getRealIndex(qName)); + } + + public String getValue(String qName) { + return attributes.getValue(getRealIndex(qName)); + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Hashset.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Hashset.java new file mode 100644 index 0000000..1e448ae --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Hashset.java @@ -0,0 +1,29 @@ +package com.thaiopensource.validate.nrl; + +import java.util.Hashtable; +import java.util.Enumeration; + +class Hashset { + private final Hashtable table = new Hashtable(); + + boolean contains(Object key) { + return table.get(key) != null; + } + + void add(Object key) { + table.put(key, key); + } + + void addAll(Hashset set) { + for (Enumeration enumList = set.table.keys(); enumList.hasMoreElements();) + add(enumList.nextElement()); + } + + void clear() { + table.clear(); + } + + Enumeration members() { + return table.keys(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/IntSet.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/IntSet.java new file mode 100644 index 0000000..4912e4b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/IntSet.java @@ -0,0 +1,75 @@ +package com.thaiopensource.validate.nrl; + +class IntSet { + static private final int INIT_SIZE = 4; + private int[] v = null; + private int len = 0; + + void add(int n) { + if (v == null) { + v = new int[INIT_SIZE]; + v[0] = n; + len = 1; + return; + } + if (len == v.length) { + int[] newv = new int[len*2]; + System.arraycopy(v, 0, newv, 0, len); + v = newv; + } + if (n > v[len - 1]) { + v[len++] = n; + return; + } + int i = 0; + for (; i < len; i++) { + if (n <= v[i]) { + if (n == v[i]) + return; + break; + } + } + for (int j = len; j >= i; j--) + v[j + 1] = v[j]; + v[i] = n; + ++len; + } + + void addAll(IntSet is) { + if (is.len == 0) + return; + int[] newv = new int[len + is.len]; + int i = 0, j = 0, k = 0; + while (i < len && j < is.len) { + if (v[i] < is.v[j]) + newv[k++] = v[i++]; + else if (is.v[j] < v[i]) + newv[k++] = is.v[j++]; + else { + newv[k++] = v[i++]; + j++; + } + } + while (i < len) + newv[k++] = v[i++]; + while (j < is.len) + newv[k++] = is.v[j++]; + v = newv; + len = k; + } + + int size() { + return len; + } + + int get(int i) { + if (i >= len) + throw new IndexOutOfBoundsException(); + try { + return v[i]; + } + catch (NullPointerException e) { + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Mode.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Mode.java new file mode 100644 index 0000000..a3d087c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Mode.java @@ -0,0 +1,144 @@ +package com.thaiopensource.validate.nrl; + +import org.xml.sax.Locator; +import org.xml.sax.helpers.LocatorImpl; + +import java.util.Hashtable; +import java.util.Enumeration; + +import com.thaiopensource.validate.nrl.ActionSet; +import com.thaiopensource.validate.nrl.AttributeActionSet; + +class Mode { + static final String ANY_NAMESPACE = "##any"; + static final int ATTRIBUTE_PROCESSING_NONE = 0; + static final int ATTRIBUTE_PROCESSING_QUALIFIED = 1; + static final int ATTRIBUTE_PROCESSING_FULL = 2; + static final Mode CURRENT = new Mode("#current", null); + + private final String name; + private Mode baseMode; + private boolean defined; + private Locator whereDefined; + private Locator whereUsed; + private final Hashtable elementMap = new Hashtable(); + private final Hashtable attributeMap = new Hashtable(); + private int attributeProcessing = -1; + + Mode(String name, Mode baseMode) { + this.name = name; + this.baseMode = baseMode; + } + + String getName() { + return name; + } + + Mode getBaseMode() { + return baseMode; + } + + void setBaseMode(Mode baseMode) { + this.baseMode = baseMode; + } + + ActionSet getElementActions(String ns) { + ActionSet actions = getElementActionsExplicit(ns); + if (actions == null) { + actions = getElementActionsExplicit(ANY_NAMESPACE); + // this is not correct: it breaks a derived mode that use anyNamespace + // elementMap.put(ns, actions); + } + return actions; + } + + private ActionSet getElementActionsExplicit(String ns) { + ActionSet actions = (ActionSet)elementMap.get(ns); + if (actions == null && baseMode != null) { + actions = baseMode.getElementActionsExplicit(ns); + if (actions != null) { + actions = actions.changeCurrentMode(this); + elementMap.put(ns, actions); + } + } + return actions; + } + + AttributeActionSet getAttributeActions(String ns) { + AttributeActionSet actions = getAttributeActionsExplicit(ns); + if (actions == null) { + actions = getAttributeActionsExplicit(ANY_NAMESPACE); + // this is not correct: it breaks a derived mode that use anyNamespace + // attributeMap.put(ns, actions); + } + return actions; + } + + private AttributeActionSet getAttributeActionsExplicit(String ns) { + AttributeActionSet actions = (AttributeActionSet)attributeMap.get(ns); + if (actions == null && baseMode != null) { + actions = baseMode.getAttributeActionsExplicit(ns); + if (actions != null) + attributeMap.put(ns, actions); + } + return actions; + } + + int getAttributeProcessing() { + if (attributeProcessing == -1) { + if (baseMode != null) + attributeProcessing = baseMode.getAttributeProcessing(); + else + attributeProcessing = ATTRIBUTE_PROCESSING_NONE; + for (Enumeration enumList = attributeMap.keys(); enumList.hasMoreElements() && attributeProcessing != ATTRIBUTE_PROCESSING_FULL;) { + String ns = (String)enumList.nextElement(); + AttributeActionSet actions = (AttributeActionSet)attributeMap.get(ns); + if (!actions.getAttach() + || actions.getReject() + || actions.getSchemas().length > 0) + attributeProcessing = ((ns.equals("") || ns.equals(ANY_NAMESPACE)) + ? ATTRIBUTE_PROCESSING_FULL + : ATTRIBUTE_PROCESSING_QUALIFIED); + } + } + return attributeProcessing; + } + + Locator getWhereDefined() { + return whereDefined; + } + + boolean isDefined() { + return defined; + } + + Locator getWhereUsed() { + return whereUsed; + } + + void noteUsed(Locator locator) { + if (whereUsed == null && locator != null) + whereUsed = new LocatorImpl(locator); + } + + void noteDefined(Locator locator) { + defined = true; + if (whereDefined == null && locator != null) + whereDefined = new LocatorImpl(locator); + } + + boolean bindElement(String ns, ActionSet actions) { + if (elementMap.get(ns) != null) + return false; + elementMap.put(ns, actions); + return true; + } + + boolean bindAttribute(String ns, AttributeActionSet actions) { + if (attributeMap.get(ns) != null) + return false; + attributeMap.put(ns, actions); + return true; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ModeUsage.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ModeUsage.java new file mode 100644 index 0000000..4415b6d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ModeUsage.java @@ -0,0 +1,80 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.util.Equal; +import com.thaiopensource.validate.nrl.ContextMap; +import com.thaiopensource.validate.nrl.Mode; + +import java.util.Vector; +import java.util.Enumeration; + +class ModeUsage { + private final Mode mode; + private final Mode currentMode; + private ContextMap modeMap; + private int attributeProcessing = -1; + + ModeUsage(Mode mode, Mode currentMode) { + this(mode, currentMode, null); + } + + private ModeUsage(Mode mode, Mode currentMode, ContextMap modeMap) { + this.mode = mode; + this.currentMode = currentMode; + this.modeMap = modeMap; + } + + ModeUsage changeCurrentMode(Mode currentMode) { + return new ModeUsage(mode, currentMode, modeMap); + } + + public boolean equals(Object obj) { + if (!(obj instanceof ModeUsage)) + return false; + ModeUsage other = (ModeUsage)obj; + return this.mode == other.mode && this.currentMode == other.currentMode && Equal.equal(this.modeMap, other.modeMap); + } + + public int hashCode() { + int hc = mode.hashCode() ^ currentMode.hashCode(); + if (modeMap != null) + hc ^= modeMap.hashCode(); + return hc; + } + + private Mode resolve(Mode mode) { + return mode == Mode.CURRENT ? currentMode : mode; + } + + int getAttributeProcessing() { + if (attributeProcessing == -1) { + attributeProcessing = resolve(mode).getAttributeProcessing(); + if (modeMap != null) { + for (Enumeration enumList = modeMap.values(); + enumList.hasMoreElements() + && attributeProcessing != Mode.ATTRIBUTE_PROCESSING_FULL;) + attributeProcessing = Math.max(resolve((Mode)enumList.nextElement()).getAttributeProcessing(), + attributeProcessing); + } + } + return attributeProcessing; + } + + boolean isContextDependent() { + return modeMap != null; + } + + Mode getMode(Vector context) { + if (modeMap != null) { + Mode m = (Mode)modeMap.get(context); + if (m != null) + return resolve(m); + } + return resolve(mode); + } + + boolean addContext(boolean isRoot, Vector names, Mode mode) { + if (modeMap == null) + modeMap = new ContextMap(); + return modeMap.put(isRoot, names, mode); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NoResultAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NoResultAction.java new file mode 100644 index 0000000..1979e60 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NoResultAction.java @@ -0,0 +1,16 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.nrl.Action; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import org.xml.sax.SAXException; + +abstract class NoResultAction extends Action { + NoResultAction(ModeUsage modeUsage) { + super(modeUsage); + } + + abstract void perform(SectionState state) throws SAXException; + abstract NoResultAction changeCurrentMode(Mode mode); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlProperty.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlProperty.java new file mode 100644 index 0000000..f6e32f1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlProperty.java @@ -0,0 +1,9 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.FlagPropertyId; + +public class NrlProperty { + private NrlProperty() { } + + public static final FlagPropertyId ATTRIBUTES_SCHEMA = new FlagPropertyId("ATTRIBUTES_SCHEMA"); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlSchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlSchemaReceiverFactory.java new file mode 100644 index 0000000..86363da --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/NrlSchemaReceiverFactory.java @@ -0,0 +1,22 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.xml.sax.XMLReaderCreator; + +public class NrlSchemaReceiverFactory implements SchemaReceiverFactory { + public SchemaReceiver createSchemaReceiver(String namespaceUri, PropertyMap properties) { + if (!SchemaImpl.NRL_URI.equals(namespaceUri)) + return null; + // modified for ePubCheck + XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties); + return new SchemaReceiverImpl(properties, xrc); + } + + public Option getOption(String uri) { + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Path.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Path.java new file mode 100644 index 0000000..ad5d778 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/Path.java @@ -0,0 +1,151 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.xml.util.Naming; + +import java.util.Vector; + +class Path { + private final boolean root; + private final Vector names; + + Path(boolean root, Vector names) { + this.root = root; + this.names = names; + } + + boolean isRoot() { + return root; + } + + Vector getNames() { + return names; + } + + public String toString() { + StringBuffer buf = new StringBuffer(); + if (root) + buf.append('/'); + for (int i = 0, len = names.size(); i < len; i++) { + if (i != 0) + buf.append('/'); + buf.append((String)names.elementAt(i)); + } + return buf.toString(); + } + + static class ParseException extends Exception { + private final String messageKey; + + ParseException(String messageKey) { + super(messageKey); + this.messageKey = messageKey; + } + + public String getMessageKey() { + return messageKey; + } + } + + private static final int START = 0; + private static final int IN_NAME = 1; + private static final int AFTER_NAME = 2; + private static final int AFTER_SLASH = 3; + + static Vector parse(String str) throws ParseException { + int state = START; + int nameStartIndex = -1; + Vector paths = new Vector(); + Vector names = new Vector(); + boolean root = false; + for (int i = 0, len = str.length(); i < len; i++) { + char c = str.charAt(i); + switch (c) { + case ' ': + case '\r': + case '\n': + case '\t': + if (state == IN_NAME) { + names.addElement(makeName(str, nameStartIndex, i)); + state = AFTER_NAME; + } + break; + case '/': + switch (state) { + case IN_NAME: + names.addElement(makeName(str, nameStartIndex, i)); + break; + case START: + root = true; + break; + case AFTER_SLASH: + throw new ParseException("unexpected_slash"); + } + state = AFTER_SLASH; + break; + case '|': + switch (state) { + case START: + throw new ParseException("empty_path"); + case AFTER_NAME: + break; + case AFTER_SLASH: + throw new ParseException("expected_name"); + case IN_NAME: + names.addElement(makeName(str, nameStartIndex, i)); + break; + } + paths.addElement(new Path(root, names)); + root = false; + names = new Vector(); + state = START; + break; + default: + switch (state) { + case AFTER_NAME: + throw new ParseException("expected_slash"); + case AFTER_SLASH: + case START: + nameStartIndex = i; + state = IN_NAME; + break; + case IN_NAME: + break; + } + break; + } + } + switch (state) { + case START: + throw new ParseException("empty_path"); + case AFTER_NAME: + break; + case AFTER_SLASH: + throw new ParseException("expected_name"); + case IN_NAME: + names.addElement(makeName(str, nameStartIndex, str.length())); + break; + } + paths.addElement(new Path(root, names)); + return paths; + } + + private static String makeName(String str, int start, int end) throws ParseException { + String name = str.substring(start, end); + if (!Naming.isNcname(name)) + throw new ParseException("invalid_name"); + return name; + } + + static public void main(String[] args) throws ParseException { + Vector paths = parse(args[0]); + for (int i = 0; i < paths.size(); i++) { + if (i != 0) + System.out.println("---"); + Path path = (Path)paths.elementAt(i); + if (path.isRoot()) + System.out.println("/"); + for (int j = 0; j < path.getNames().size(); j++) + System.out.println(path.getNames().elementAt(j)); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/RejectAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/RejectAction.java new file mode 100644 index 0000000..c49f3e1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/RejectAction.java @@ -0,0 +1,23 @@ +package com.thaiopensource.validate.nrl; + +import org.xml.sax.SAXException; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import com.thaiopensource.validate.nrl.NoResultAction; + +class RejectAction extends NoResultAction { + RejectAction(ModeUsage modeUsage) { + super(modeUsage); + } + + void perform(SectionState state) throws SAXException { + final ModeUsage modeUsage = getModeUsage(); + state.reject(); + state.addChildMode(modeUsage, null); + state.addAttributeValidationModeUsage(modeUsage); + } + + NoResultAction changeCurrentMode(Mode mode) { + return new RejectAction(getModeUsage().changeCurrentMode(mode)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ResultAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ResultAction.java new file mode 100644 index 0000000..4f2df3a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ResultAction.java @@ -0,0 +1,17 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.nrl.Action; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import org.xml.sax.SAXException; +import org.xml.sax.ContentHandler; + +abstract class ResultAction extends Action { + ResultAction(ModeUsage modeUsage) { + super(modeUsage); + } + + abstract void perform(ContentHandler handler, SectionState state) throws SAXException; + abstract ResultAction changeCurrentMode(Mode mode); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaImpl.java new file mode 100644 index 0000000..3dce5f5 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaImpl.java @@ -0,0 +1,582 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.Uri; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.OptionArgumentException; +import com.thaiopensource.validate.OptionArgumentPresenceException; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.auto.SchemaFuture; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.xml.sax.XmlBaseHandler; +import com.thaiopensource.xml.sax.DelegatingContentHandler; +import com.thaiopensource.xml.sax.CountingErrorHandler; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import org.xml.sax.Attributes; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.LocatorImpl; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +class SchemaImpl extends AbstractSchema { + static private final String IMPLICIT_MODE_NAME = "#implicit"; + static private final String WRAPPER_MODE_NAME = "#wrapper"; + static final String NRL_URI = SchemaReader.BASE_URI + "nrl"; + private final Hashtable modeMap = new Hashtable(); + private Mode startMode; + private final Mode defaultBaseMode; + private final boolean attributesSchema; + private final XMLReaderCreator xrc; // added for ePubCheck + + static private final class WrappedIOException extends RuntimeException { + private final IOException exception; + + private WrappedIOException(IOException exception) { + this.exception = exception; + } + + private IOException getException() { + return exception; + } + } + + static private class MustSupportOption { + private final String name; + private final PropertyId pid; + private final Locator locator; + + MustSupportOption(String name, PropertyId pid, Locator locator) { + this.name = name; + this.pid = pid; + this.locator = locator; + } + } + + private class Handler extends DelegatingContentHandler implements SchemaFuture { + private final SchemaReceiverImpl sr; + private boolean hadError = false; + private final ErrorHandler eh; + private final CountingErrorHandler ceh; + private final Localizer localizer = new Localizer(SchemaImpl.class); + private Locator locator; + private final XmlBaseHandler xmlBaseHandler = new XmlBaseHandler(); + private int foreignDepth = 0; + private Mode currentMode = null; + private String defaultSchemaType; + private Validator validator; + private ElementsOrAttributes match; + private ActionSet actions; + private AttributeActionSet attributeActions; + private String schemaUri; + private String schemaType; + private PropertyMapBuilder options; + private final Vector mustSupportOptions = new Vector(); + private ModeUsage modeUsage; + private boolean anyNamespace; + + Handler(SchemaReceiverImpl sr) { + this.sr = sr; + this.eh = ValidateProperty.ERROR_HANDLER.get(sr.getProperties()); + this.ceh = new CountingErrorHandler(this.eh); + } + + public void setDocumentLocator(Locator locator) { + xmlBaseHandler.setLocator(locator); + this.locator = locator; + } + + public void startDocument() throws SAXException { + try { + PropertyMapBuilder builder = new PropertyMapBuilder(sr.getProperties()); + ValidateProperty.ERROR_HANDLER.put(builder, ceh); + validator = sr.getNrlSchema().createValidator(builder.toPropertyMap()); + } + catch (IOException e) { + throw new WrappedIOException(e); + } + catch (IncorrectSchemaException e) { + throw new RuntimeException("internal error in RNG schema for NRL"); + } + setDelegate(validator.getContentHandler()); + if (locator != null) + super.setDocumentLocator(locator); + super.startDocument(); + } + + public Schema getSchema() throws IncorrectSchemaException, SAXException { + if (validator == null || ceh.getHadErrorOrFatalError()) + throw new IncorrectSchemaException(); + Hashset openModes = new Hashset(); + Hashset checkedModes = new Hashset(); + for (Enumeration enumList = modeMap.keys(); enumList.hasMoreElements();) { + String modeName = (String)enumList.nextElement(); + Mode mode = (Mode)modeMap.get(modeName); + if (!mode.isDefined()) + error("undefined_mode", modeName, mode.getWhereUsed()); + for (Mode tem = mode; tem != null; tem = tem.getBaseMode()) { + if (checkedModes.contains(tem)) + break; + if (openModes.contains(tem)) { + error("mode_cycle", tem.getName(), tem.getWhereDefined()); + break; + } + openModes.add(tem); + } + checkedModes.addAll(openModes); + openModes.clear(); + } + if (hadError) + throw new IncorrectSchemaException(); + return SchemaImpl.this; + } + + public RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException { + if (e instanceof WrappedIOException) + throw ((WrappedIOException)e).getException(); + return e; + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + super.startElement(uri, localName, qName, attributes); + xmlBaseHandler.startElement(); + String xmlBase = attributes.getValue(WellKnownNamespaces.XML, "base"); + if (xmlBase != null) + xmlBaseHandler.xmlBaseAttribute(xmlBase); + if (!NRL_URI.equals(uri) || foreignDepth > 0) { + foreignDepth++; + return; + } + if (ceh.getHadErrorOrFatalError()) + return; + if (localName.equals("rules")) + parseRules(attributes); + else if (localName.equals("mode")) + parseMode(attributes); + else if (localName.equals("namespace")) + parseNamespace(attributes); + else if (localName.equals("anyNamespace")) + parseAnyNamespace(attributes); + else if (localName.equals("validate")) + parseValidate(attributes); + else if (localName.equals("reject")) + parseReject(attributes); + else if (localName.equals("attach")) + parseAttach(attributes); + else if (localName.equals("unwrap")) + parseUnwrap(attributes); + else if (localName.equals("allow")) + parseAllow(attributes); + else if (localName.equals("context")) + parseContext(attributes); + else if (localName.equals("option")) + parseOption(attributes); + else + throw new RuntimeException("unexpected element \"" + localName + "\""); + } + + public void endElement(String namespaceURI, String localName, + String qName) + throws SAXException { + super.endElement(namespaceURI, localName, qName); + xmlBaseHandler.endElement(); + if (foreignDepth > 0) { + foreignDepth--; + return; + } + if (ceh.getHadErrorOrFatalError()) + return; + if (localName.equals("validate")) + finishValidate(); + } + + private void parseRules(Attributes attributes) { + startMode = getModeAttribute(attributes, "startMode"); + if (startMode == null) { + startMode = lookupCreateMode(IMPLICIT_MODE_NAME); + currentMode = startMode; + startMode.noteDefined(null); + } + startMode.noteUsed(locator); + if (attributesSchema) { + Mode wrapper = lookupCreateMode(WRAPPER_MODE_NAME); + ActionSet actions = new ActionSet(); + actions.addNoResultAction(new AllowAction(new ModeUsage(startMode, startMode))); + wrapper.bindElement(Mode.ANY_NAMESPACE, actions); + wrapper.noteDefined(null); + startMode = wrapper; + } + defaultSchemaType = getSchemaType(attributes); + } + + private void parseMode(Attributes attributes) throws SAXException { + currentMode = getModeAttribute(attributes, "name"); + if (currentMode.isDefined()) { + error("duplicate_mode", currentMode.getName()); + error("first_mode", currentMode.getName(), currentMode.getWhereDefined()); + } + else { + Mode base = getModeAttribute(attributes, "extends"); + if (base != null) + currentMode.setBaseMode(base); + currentMode.noteDefined(locator); + } + } + + private void parseNamespace(Attributes attributes) throws SAXException { + anyNamespace = false; + parseRule(getNs(attributes), attributes); + } + + private void parseAnyNamespace(Attributes attributes) throws SAXException { + anyNamespace = true; + parseRule(Mode.ANY_NAMESPACE, attributes); + } + + private void parseRule(String ns, Attributes attributes) throws SAXException { + match = toElementsOrAttributes(attributes.getValue("", "match"), + ElementsOrAttributes.ELEMENTS); + if (match.containsAttributes()) { + attributeActions = new AttributeActionSet(); + if (!currentMode.bindAttribute(ns, attributeActions)) { + if (ns.equals(Mode.ANY_NAMESPACE)) + error("duplicate_attribute_action_any_namespace"); + else + error("duplicate_attribute_action", ns); + } + } + if (match.containsElements()) { + actions = new ActionSet(); + if (!currentMode.bindElement(ns, actions)) { + if (ns.equals(Mode.ANY_NAMESPACE)) + error("duplicate_element_action_any_namespace"); + else + error("duplicate_element_action", ns); + } + } + else + actions = null; + } + + private void parseValidate(Attributes attributes) throws SAXException { + schemaUri = getSchema(attributes); + schemaType = getSchemaType(attributes); + if (schemaType == null) + schemaType = defaultSchemaType; + if (actions != null) + modeUsage = getModeUsage(attributes); + else + modeUsage = null; + options = new PropertyMapBuilder(); + mustSupportOptions.clear(); + } + + private void finishValidate() throws SAXException { + try { + if (attributeActions != null) { + Schema schema = createSubSchema(true); + attributeActions.addSchema(schema); + } + if (actions != null) { + Schema schema = createSubSchema(false); + actions.addNoResultAction(new ValidateAction(modeUsage, schema)); + } + } + catch (IncorrectSchemaException e) { + hadError = true; + } + catch (IOException e) { + throw new WrappedIOException(e); + } + } + + // Added for ePubCheck + private InputSource makeInputSource(XMLReader xr, String systemId) throws IOException, SAXException { + EntityResolver er = xr.getEntityResolver(); + if (er != null) { + InputSource inputSource = er.resolveEntity(null, systemId); + if (inputSource != null) + return inputSource; + } + return new InputSource(systemId); + } + + private Schema createSubSchema(boolean isAttributesSchema) throws IOException, IncorrectSchemaException, SAXException { + PropertyMap requestedProperties = options.toPropertyMap(); + Schema schema = sr.createChildSchema(makeInputSource(xrc.createXMLReader(), schemaUri), // Modified for ePubCheck + schemaType, + requestedProperties, + isAttributesSchema); + PropertyMap actualProperties = schema.getProperties(); + for (Enumeration enumList = mustSupportOptions.elements(); enumList.hasMoreElements();) { + MustSupportOption mso = (MustSupportOption)enumList.nextElement(); + Object actualValue = actualProperties.get(mso.pid); + if (actualValue == null) + error("unsupported_option", mso.name, mso.locator); + else if (!actualValue.equals(requestedProperties.get(mso.pid))) + error("unsupported_option_arg", mso.name, mso.locator); + } + return schema; + } + + private void parseOption(Attributes attributes) throws SAXException { + boolean mustSupport; + String mustSupportValue = attributes.getValue("", "mustSupport"); + if (mustSupportValue != null) { + mustSupportValue = mustSupportValue.trim(); + mustSupport = mustSupportValue.equals("1") || mustSupportValue.equals("true"); + } + else + mustSupport = false; + String name = Uri.resolve(NRL_URI, attributes.getValue("", "name")); + Option option = sr.getOption(name); + if (option == null) { + if (mustSupport) + error("unknown_option", name); + } + else { + String arg = attributes.getValue("", "arg"); + try { + PropertyId pid = option.getPropertyId(); + Object value = option.valueOf(arg); + Object oldValue = options.get(pid); + if (oldValue != null) { + value = option.combine(new Object[]{oldValue, value}); + if (value == null) + error("duplicate_option", name); + else + options.put(pid, value); + } + else { + options.put(pid, value); + mustSupportOptions.addElement(new MustSupportOption(name, pid, + locator == null + ? null + : new LocatorImpl(locator))); + } + } + catch (OptionArgumentPresenceException e) { + error(arg == null ? "option_requires_argument" : "option_unexpected_argument", name); + } + catch (OptionArgumentException e) { + if (arg == null) + error("option_requires_argument", name); + else + error("option_bad_argument", name, arg); + } + } + } + + private void parseAttach(Attributes attributes) { + if (attributeActions != null) + attributeActions.setAttach(true); + if (actions != null) { + modeUsage = getModeUsage(attributes); + actions.setResultAction(new AttachAction(modeUsage)); + } + else + modeUsage = null; + } + + private void parseUnwrap(Attributes attributes) { + if (actions != null) { + modeUsage = getModeUsage(attributes); + actions.setResultAction(new UnwrapAction(modeUsage)); + } + else + modeUsage = null; + } + + private void parseAllow(Attributes attributes) { + if (actions != null) { + modeUsage = getModeUsage(attributes); + actions.addNoResultAction(new AllowAction(modeUsage)); + } + else + modeUsage = null; + } + + private void parseReject(Attributes attributes) { + if (actions != null) { + modeUsage = getModeUsage(attributes); + actions.addNoResultAction(new RejectAction(modeUsage)); + } + else + modeUsage = null; + if (attributeActions != null) + attributeActions.setReject(true); + } + + private void parseContext(Attributes attributes) throws SAXException { + if (anyNamespace) { + error("context_any_namespace"); + return; + } + Mode mode = getUseMode(attributes); + try { + Vector paths = Path.parse(attributes.getValue("", "path")); + // XXX warning if modeUsage is null + if (modeUsage != null) { + for (int i = 0, len = paths.size(); i < len; i++) { + Path path = (Path)paths.elementAt(i); + if (!modeUsage.addContext(path.isRoot(), path.getNames(), mode)) + error("duplicate_path", path.toString()); + } + } + } + catch (Path.ParseException e) { + error(e.getMessageKey()); + } + } + + private String getSchema(Attributes attributes) throws SAXException { + String schemaUri = attributes.getValue("", "schema"); + if (Uri.hasFragmentId(schemaUri)) + error("schema_fragment_id"); + return Uri.resolve(xmlBaseHandler.getBaseUri(), + Uri.escapeDisallowedChars(schemaUri)); + } + + private String getSchemaType(Attributes attributes) { + return attributes.getValue("", "schemaType"); + } + + private ElementsOrAttributes toElementsOrAttributes(String value, ElementsOrAttributes defaultValue) { + if (value == null) + return defaultValue; + ElementsOrAttributes eoa = ElementsOrAttributes.NEITHER; + if (value.indexOf("elements") >= 0) + eoa = eoa.addElements(); + if (value.indexOf("attributes") >= 0) + eoa = eoa.addAttributes(); + return eoa; + } + + private ModeUsage getModeUsage(Attributes attributes) { + return new ModeUsage(getUseMode(attributes), currentMode); + } + + private Mode getUseMode(Attributes attributes) { + Mode mode = getModeAttribute(attributes, "useMode"); + if (mode == null) + return Mode.CURRENT; + mode.noteUsed(locator); + return mode; + } + + private String getNs(Attributes attributes) throws SAXException { + String ns = attributes.getValue("", "ns"); + if (ns != null && !Uri.isAbsolute(ns) && !ns.equals("")) + error("ns_absolute"); + return ns; + } + + void error(String key) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key), locator)); + } + + void error(String key, String arg) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg), locator)); + } + + void error(String key, String arg, Locator locator) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg), locator)); + } + + void error(String key, String arg1, String arg2) throws SAXException { + hadError = true; + if (eh == null) + return; + eh.error(new SAXParseException(localizer.message(key, arg1, arg2), locator)); + } + + } + + // modified for ePubCheck + SchemaImpl(PropertyMap properties, XMLReaderCreator xrc) { + super(properties); + this.xrc = xrc; + this.attributesSchema = properties.contains(NrlProperty.ATTRIBUTES_SCHEMA); + makeBuiltinMode("#allow", AllowAction.class); + makeBuiltinMode("#attach", AttachAction.class); + makeBuiltinMode("#unwrap", UnwrapAction.class); + defaultBaseMode = makeBuiltinMode("#reject", RejectAction.class); + } + + private Mode makeBuiltinMode(String name, Class cls) { + Mode mode = lookupCreateMode(name); + ActionSet actions = new ActionSet(); + ModeUsage modeUsage = new ModeUsage(Mode.CURRENT, mode); + if (cls == AttachAction.class) + actions.setResultAction(new AttachAction(modeUsage)); + else if (cls == AllowAction.class) + actions.addNoResultAction(new AllowAction(modeUsage)); + else if (cls == UnwrapAction.class) + actions.setResultAction(new UnwrapAction(modeUsage)); + else + actions.addNoResultAction(new RejectAction(modeUsage)); + mode.bindElement(Mode.ANY_NAMESPACE, actions); + mode.noteDefined(null); + AttributeActionSet attributeActions = new AttributeActionSet(); + if (attributesSchema) + attributeActions.setReject(true); + else + attributeActions.setAttach(true); + mode.bindAttribute(Mode.ANY_NAMESPACE, attributeActions); + return mode; + } + + SchemaFuture installHandlers(XMLReader in, SchemaReceiverImpl sr) { + Handler h = new Handler(sr); + in.setContentHandler(h); + return h; + } + + public Validator createValidator(PropertyMap properties) { + return new ValidatorImpl(startMode, properties); + } + + private Mode getModeAttribute(Attributes attributes, String localName) { + return lookupCreateMode(attributes.getValue("", localName)); + } + + private Mode lookupCreateMode(String name) { + if (name == null) + return null; + name = name.trim(); + Mode mode = (Mode)modeMap.get(name); + if (mode == null) { + mode = new Mode(name, defaultBaseMode); + modeMap.put(name, mode); + } + return mode; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaReceiverImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaReceiverImpl.java new file mode 100644 index 0000000..311ea13 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SchemaReceiverImpl.java @@ -0,0 +1,110 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.validate.auto.SchemaFuture; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.SAXSchemaReader; +import com.thaiopensource.xml.sax.XMLReaderCreator; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.io.IOException; +import java.net.URL; + +class SchemaReceiverImpl implements SchemaReceiver { + private static final String NRL_SCHEMA = "nrl.rng"; + private static final String RNC_MEDIA_TYPE = "application/x-rnc"; + private final PropertyMap properties; + private final boolean attributesSchema; + private final SchemaReader autoSchemaReader; + private Schema nrlSchema = null; + private final XMLReaderCreator xrc; + private static final PropertyId subSchemaProperties[] = { + ValidateProperty.ERROR_HANDLER, + ValidateProperty.XML_READER_CREATOR, + ValidateProperty.ENTITY_RESOLVER, + SchemaReceiverFactory.PROPERTY, + }; + + // modified for ePubCheck + public SchemaReceiverImpl(PropertyMap properties, XMLReaderCreator xrc) { + this.xrc = xrc; + this.attributesSchema = properties.contains(NrlProperty.ATTRIBUTES_SCHEMA); + PropertyMapBuilder builder = new PropertyMapBuilder(); + for (int i = 0; i < subSchemaProperties.length; i++) { + Object value = properties.get(subSchemaProperties[i]); + if (value != null) + builder.put(subSchemaProperties[i], value); + } + this.properties = builder.toPropertyMap(); + this.autoSchemaReader = new AutoSchemaReader(SchemaReceiverFactory.PROPERTY.get(properties)); + } + + // modified for ePubCheck + public SchemaFuture installHandlers(XMLReader xr) { + PropertyMapBuilder builder = new PropertyMapBuilder(properties); + if (attributesSchema) + NrlProperty.ATTRIBUTES_SCHEMA.add(builder); + return new SchemaImpl(builder.toPropertyMap(), xrc).installHandlers(xr, this); + } + + Schema getNrlSchema() throws IOException, IncorrectSchemaException, SAXException { + if (nrlSchema == null) { + String className = SchemaReceiverImpl.class.getName(); + String resourceName = className.substring(0, className.lastIndexOf('.')).replace('.', '/') + "/resources/" + NRL_SCHEMA; + URL nrlSchemaUrl = getResource(resourceName); + nrlSchema = SAXSchemaReader.getInstance().createSchema(new InputSource(nrlSchemaUrl.toString()), + properties); + } + return nrlSchema; + } + + private static URL getResource(String resourceName) { + ClassLoader cl = SchemaReceiverImpl.class.getClassLoader(); + // XXX see if we should borrow 1.2 code from Service + if (cl == null) + return ClassLoader.getSystemResource(resourceName); + else + return cl.getResource(resourceName); + } + + PropertyMap getProperties() { + return properties; + } + + Schema createChildSchema(InputSource inputSource, String schemaType, PropertyMap options, boolean isAttributesSchema) throws IOException, IncorrectSchemaException, SAXException { + SchemaReader reader = isRnc(schemaType) ? CompactSchemaReader.getInstance() : autoSchemaReader; + PropertyMapBuilder builder = new PropertyMapBuilder(properties); + if (isAttributesSchema) + NrlProperty.ATTRIBUTES_SCHEMA.add(builder); + for (int i = 0, len = options.size(); i < len; i++) + builder.put(options.getKey(i), options.get(options.getKey(i))); + return reader.createSchema(inputSource, builder.toPropertyMap()); + } + + Option getOption(String uri) { + Option option = autoSchemaReader.getOption(uri); + if (option != null) + return option; + return CompactSchemaReader.getInstance().getOption(uri); + } + + private static boolean isRnc(String schemaType) { + if (schemaType == null) + return false; + schemaType = schemaType.trim(); + return schemaType.equals(RNC_MEDIA_TYPE); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SectionState.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SectionState.java new file mode 100644 index 0000000..e274011 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/SectionState.java @@ -0,0 +1,23 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.nrl.ModeUsage; +import org.xml.sax.SAXException; +import org.xml.sax.ContentHandler; + +interface SectionState { + /** + * + * @param modeUsage + * @param handler may be null + */ + void addChildMode(ModeUsage modeUsage, ContentHandler handler); + void addValidator(Schema schema, ModeUsage modeUsage); + /** + * + * @param handler must not be null + */ + void addActiveHandler(ContentHandler handler, ModeUsage attributeModeUsage); + void addAttributeValidationModeUsage(ModeUsage modeUsage); + void reject() throws SAXException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/UnwrapAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/UnwrapAction.java new file mode 100644 index 0000000..67630df --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/UnwrapAction.java @@ -0,0 +1,17 @@ +package com.thaiopensource.validate.nrl; + +import org.xml.sax.ContentHandler; + +class UnwrapAction extends ResultAction { + UnwrapAction(ModeUsage modeUsage) { + super(modeUsage); + } + + void perform(ContentHandler handler, SectionState state) { + state.addChildMode(getModeUsage(), handler); + } + + ResultAction changeCurrentMode(Mode mode) { + return new UnwrapAction(getModeUsage().changeCurrentMode(mode)); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidateAction.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidateAction.java new file mode 100644 index 0000000..dab484f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidateAction.java @@ -0,0 +1,33 @@ +package com.thaiopensource.validate.nrl; + +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import com.thaiopensource.validate.nrl.NoResultAction; +import com.thaiopensource.validate.nrl.SectionState; +import org.xml.sax.SAXException; + +class ValidateAction extends NoResultAction { + private final Schema schema; + + ValidateAction(ModeUsage modeUsage, Schema schema) { + super(modeUsage); + this.schema = schema; + } + + void perform(SectionState state) throws SAXException { + state.addValidator(schema, getModeUsage()); + } + + NoResultAction changeCurrentMode(Mode mode) { + return new ValidateAction(getModeUsage().changeCurrentMode(mode), schema); + } + + public boolean equals(Object obj) { + return super.equals(obj) && schema.equals(((ValidateAction)obj).schema); + } + + public int hashCode() { + return super.hashCode() ^ schema.hashCode(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidatorImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidatorImpl.java new file mode 100644 index 0000000..6dbbd6c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/ValidatorImpl.java @@ -0,0 +1,399 @@ +package com.thaiopensource.validate.nrl; + +import org.xml.sax.helpers.DefaultHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXParseException; +import org.xml.sax.DTDHandler; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.nrl.ActionSet; +import com.thaiopensource.validate.nrl.AttributeActionSet; +import com.thaiopensource.validate.nrl.FilteredAttributes; +import com.thaiopensource.validate.nrl.Hashset; +import com.thaiopensource.validate.nrl.IntSet; +import com.thaiopensource.validate.nrl.Mode; +import com.thaiopensource.validate.nrl.ModeUsage; +import com.thaiopensource.validate.nrl.NoResultAction; +import com.thaiopensource.validate.nrl.ResultAction; +import com.thaiopensource.validate.nrl.SectionState; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyMap; + +import java.util.Vector; +import java.util.Stack; +import java.util.Hashtable; +import java.util.Enumeration; + +class ValidatorImpl extends DefaultHandler implements Validator { + private static final String BEARER_URI = ""; + private static final String BEARER_LOCAL_NAME = "#bearer"; + private static final String NO_NS = "\0"; + private final ErrorHandler eh; + private final PropertyMap properties; + private Locator locator; + private Section currentSection; + private PrefixMapping prefixMapping = null; + private final Hashtable validatorHandlerCache = new Hashtable(); + private final Localizer localizer = new Localizer(ValidatorImpl.class); + private final Hashset noResultActions = new Hashset(); + private final Hashtable attributeNamespaceIndexSets = new Hashtable(); + private final Vector activeHandlersAttributeIndexSets = new Vector(); + private final Hashset attributeSchemas = new Hashset(); + private boolean attributeNamespaceRejected; + private Attributes filteredAttributes; + private final Mode startMode; + + static private class PrefixMapping { + final String prefix; + final String uri; + final PrefixMapping parent; + + PrefixMapping(String prefix, String uri, PrefixMapping parent) { + this.prefix = prefix; + this.uri = uri; + this.parent = parent; + } + } + + private class Section implements SectionState { + final Section parent; + /** + * Namespace of this section. Empty string for absent. + */ + final String ns; + /** + * Number of open elements in this section. + */ + int depth = 0; + /** + * List of the Validators rooted in this section + */ + final Vector validators = new Vector(); + final Vector schemas = new Vector(); + /** + * List of the ContentHandlers that want to see the elements in this section + */ + final Vector activeHandlers = new Vector(); + final Vector activeHandlersAttributeModeUsage = new Vector(); + final Vector attributeValidationModeUsages = new Vector(); + /** + * List of Programs saying what to do with child sections + */ + final Vector childPrograms = new Vector(); + final Stack context = new Stack(); + boolean contextDependent = false; + int attributeProcessing = Mode.ATTRIBUTE_PROCESSING_NONE; + + Section(String ns, Section parent) { + this.ns = ns; + this.parent = parent; + } + + public void addChildMode(ModeUsage modeUsage, ContentHandler handler) { + childPrograms.addElement(new Program(modeUsage, handler)); + if (modeUsage.isContextDependent()) + contextDependent = true; + } + + public void addValidator(Schema schema, ModeUsage modeUsage) { + schemas.addElement(schema); + Validator validator = createValidator(schema); + validators.addElement(validator); + activeHandlers.addElement(validator.getContentHandler()); + activeHandlersAttributeModeUsage.addElement(modeUsage); + attributeProcessing = Math.max(attributeProcessing, + modeUsage.getAttributeProcessing()); + childPrograms.addElement(new Program(modeUsage, validator.getContentHandler())); + if (modeUsage.isContextDependent()) + contextDependent = true; + } + + public void addActiveHandler(ContentHandler handler, ModeUsage attributeModeUsage) { + activeHandlers.addElement(handler); + activeHandlersAttributeModeUsage.addElement(attributeModeUsage); + attributeProcessing = Math.max(attributeProcessing, + attributeModeUsage.getAttributeProcessing()); + if (attributeModeUsage.isContextDependent()) + contextDependent = true; + } + + public void addAttributeValidationModeUsage(ModeUsage modeUsage) { + int ap = modeUsage.getAttributeProcessing(); + if (ap != Mode.ATTRIBUTE_PROCESSING_NONE) { + attributeValidationModeUsages.addElement(modeUsage); + attributeProcessing = Math.max(ap, attributeProcessing); + if (modeUsage.isContextDependent()) + contextDependent = true; + } + } + + public void reject() throws SAXException { + if (eh != null) + eh.error(new SAXParseException(localizer.message("reject_element", ns), + locator)); + } + + } + + static private class Program { + final ModeUsage modeUsage; + final ContentHandler handler; + + Program(ModeUsage modeUsage, ContentHandler handler) { + this.modeUsage = modeUsage; + this.handler = handler; + } + } + + ValidatorImpl(Mode mode, PropertyMap properties) { + this.properties = properties; + this.eh = ValidateProperty.ERROR_HANDLER.get(properties); + this.startMode = mode; + initCurrentSection(); + } + + private void initCurrentSection() { + currentSection = new Section(NO_NS, null); + currentSection.addChildMode(new ModeUsage(startMode, startMode), null); + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + public void characters(char ch[], int start, int length) + throws SAXException { + for (int i = 0, len = currentSection.activeHandlers.size(); i < len; i++) + ((ContentHandler)(currentSection.activeHandlers.elementAt(i))).characters(ch, start, length); + + } + + public void ignorableWhitespace(char ch[], int start, int length) + throws SAXException { + for (int i = 0, len = currentSection.activeHandlers.size(); i < len; i++) + ((ContentHandler)(currentSection.activeHandlers.elementAt(i))).ignorableWhitespace(ch, start, length); + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + if (!uri.equals(currentSection.ns)) + startSection(uri); + currentSection.depth++; + if (currentSection.contextDependent) + currentSection.context.push(localName); + boolean transformAttributes = processAttributes(attributes); + for (int i = 0, len = currentSection.activeHandlers.size(); i < len; i++) { + ContentHandler handler = (ContentHandler)(currentSection.activeHandlers.elementAt(i)); + handler.startElement(uri, localName, qName, + transformAttributes + ? filterAttributes((IntSet)activeHandlersAttributeIndexSets.elementAt(i), + attributes) + : attributes); + } + } + + private static Attributes filterAttributes(IntSet indexSet, Attributes attributes) { + if (indexSet.size() == attributes.getLength()) + return attributes; + return new FilteredAttributes(indexSet, attributes); + } + + private boolean processAttributes(Attributes attributes) throws SAXException { + if (currentSection.attributeProcessing == Mode.ATTRIBUTE_PROCESSING_NONE + || attributes.getLength() == 0) + return false; + attributeNamespaceIndexSets.clear(); + for (int i = 0, len = attributes.getLength(); i < len; i++) { + String ns = attributes.getURI(i); + IntSet indexSet = (IntSet)attributeNamespaceIndexSets.get(ns); + if (indexSet == null) { + indexSet = new IntSet(); + attributeNamespaceIndexSets.put(ns, indexSet); + } + indexSet.add(i); + } + if (currentSection.attributeProcessing == Mode.ATTRIBUTE_PROCESSING_QUALIFIED + && attributeNamespaceIndexSets.size() == 1 + && attributeNamespaceIndexSets.get("") != null) + return false; + Vector handlerModes = currentSection.activeHandlersAttributeModeUsage; + activeHandlersAttributeIndexSets.setSize(handlerModes.size()); + for (int i = 0, len = handlerModes.size(); i < len; i++) + activeHandlersAttributeIndexSets.setElementAt(new IntSet(), i); + boolean transform = false; + Vector validationModes = currentSection.attributeValidationModeUsages; + for (Enumeration e = attributeNamespaceIndexSets.keys(); e.hasMoreElements();) { + String ns = (String)e.nextElement(); + IntSet indexSet = (IntSet)attributeNamespaceIndexSets.get(ns); + attributeSchemas.clear(); + filteredAttributes = null; + attributeNamespaceRejected = false; + for (int i = 0, len = handlerModes.size(); i < len; i++) { + ModeUsage modeUsage = (ModeUsage)handlerModes.elementAt(i); + AttributeActionSet actions = processAttributeSection(modeUsage, ns, indexSet, attributes); + if (actions.getAttach()) + ((IntSet)activeHandlersAttributeIndexSets.get(i)).addAll(indexSet); + else + transform = true; + } + for (int i = 0, len = validationModes.size(); i < len; i++) { + ModeUsage modeUsage = (ModeUsage)validationModes.elementAt(i); + processAttributeSection(modeUsage, ns, indexSet, attributes); + } + } + return transform; + } + + private AttributeActionSet processAttributeSection(ModeUsage modeUsage, + String ns, + IntSet indexSet, + Attributes attributes) + throws SAXException { + Mode mode = modeUsage.getMode(currentSection.context); + AttributeActionSet actions = mode.getAttributeActions(ns); + if (actions.getReject() && !attributeNamespaceRejected) { + attributeNamespaceRejected = true; + if (eh != null) + eh.error(new SAXParseException(localizer.message("reject_attribute", ns), + locator)); + } + Schema[] schemas = actions.getSchemas(); + for (int j = 0; j < schemas.length; j++) { + if (attributeSchemas.contains(schemas[j])) + continue; + attributeSchemas.add(schemas[j]); + if (filteredAttributes == null) + filteredAttributes = filterAttributes(indexSet, attributes); + validateAttributes(schemas[j], filteredAttributes); + } + return actions; + } + + private void validateAttributes(Schema schema, Attributes attributes) throws SAXException { + Validator validator = createValidator(schema); + ContentHandler ch = validator.getContentHandler(); + initHandler(ch); + ch.startElement(BEARER_URI, BEARER_LOCAL_NAME, BEARER_LOCAL_NAME, attributes); + ch.endElement(BEARER_URI, BEARER_LOCAL_NAME, BEARER_LOCAL_NAME); + cleanupHandler(ch); + releaseValidator(schema, validator); + } + + private void startSection(String uri) throws SAXException { + Section section = new Section(uri, currentSection); + Vector childPrograms = currentSection.childPrograms; + noResultActions.clear(); + for (int i = 0, len = childPrograms.size(); i < len; i++) { + Program program = (Program)childPrograms.elementAt(i); + ActionSet actions = program.modeUsage.getMode(currentSection.context).getElementActions(uri); + ResultAction resultAction = actions.getResultAction(); + if (resultAction != null) + resultAction.perform(program.handler, section); + NoResultAction[] nra = actions.getNoResultActions(); + for (int j = 0; j < nra.length; j++) { + NoResultAction tem = nra[j]; + if (!noResultActions.contains(tem)) { + nra[j].perform(section); + noResultActions.add(tem); + } + } + } + for (int i = 0, len = section.validators.size(); i < len; i++) + initHandler(((Validator)section.validators.elementAt(i)).getContentHandler()); + currentSection = section; + } + + private void initHandler(ContentHandler ch) throws SAXException { + if (locator != null) + ch.setDocumentLocator(locator); + ch.startDocument(); + for (PrefixMapping pm = prefixMapping; pm != null; pm = pm.parent) + ch.startPrefixMapping(pm.prefix, pm.uri); + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + for (int i = 0, len = currentSection.activeHandlers.size(); i < len; i++) + ((ContentHandler)(currentSection.activeHandlers.elementAt(i))).endElement(uri, localName, qName); + currentSection.depth--; + if (currentSection.contextDependent) + currentSection.context.pop(); + if (currentSection.depth == 0) + endSection(); + } + + private void endSection() throws SAXException { + for (int i = 0, len = currentSection.validators.size(); i < len; i++) { + Validator validator = (Validator)currentSection.validators.elementAt(i); + cleanupHandler(validator.getContentHandler()); + releaseValidator((Schema)currentSection.schemas.elementAt(i), validator); + // endDocument() on one of the validators may throw an exception + // in this case we don't want to release the validator twice + currentSection.validators.setElementAt(null, i); + } + currentSection = currentSection.parent; + } + + private void cleanupHandler(ContentHandler vh) throws SAXException { + for (PrefixMapping pm = prefixMapping; pm != null; pm = pm.parent) + vh.endPrefixMapping(pm.prefix); + vh.endDocument(); + } + + public void endDocument() + throws SAXException { + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + super.startPrefixMapping(prefix, uri); + prefixMapping = new PrefixMapping(prefix, uri, prefixMapping); + } + + public void endPrefixMapping(String prefix) + throws SAXException { + super.endPrefixMapping(prefix); + prefixMapping = prefixMapping.parent; + } + + private Validator createValidator(Schema schema) { + Stack stack = (Stack)validatorHandlerCache.get(schema); + if (stack == null) { + stack = new Stack(); + validatorHandlerCache.put(schema, stack); + } + if (stack.empty()) + return schema.createValidator(properties); + return (Validator)stack.pop(); + } + + private void releaseValidator(Schema schema, Validator vh) { + if (vh == null) + return; + vh.reset(); + ((Stack)validatorHandlerCache.get(schema)).push(vh); + } + + public void reset() { + for (; currentSection != null; currentSection = currentSection.parent) { + for (int i = 0, len = currentSection.validators.size(); i < len; i++) + releaseValidator((Schema)currentSection.schemas.elementAt(i), + (Validator)currentSection.validators.elementAt(i)); + } + initCurrentSection(); + } + + public ContentHandler getContentHandler() { + return this; + } + + public DTDHandler getDTDHandler() { + return this; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/Messages.properties new file mode 100644 index 0000000..7716924 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/Messages.properties @@ -0,0 +1,26 @@ +reject_element=elements from namespace \"{0}\" are not allowed +reject_attribute=attributes from namespace \"{0}\" are not allowed +undefined_mode=mode \"{0}\" not defined +schema_fragment_id=schema URI must not have a fragment identifier +ns_absolute=namespace URI must be absolute URI +unexpected_slash=unexpected \"/\" +expected_slash=expected \"/\" +expected_name=expected a name +empty_path=empty path +invalid_name=invalid name +duplicate_path=context with path \"{0}\" already defined +context_any_namespace=\"context\" not allowed within \"anyNamespace\" +duplicate_mode=mode \"{0}\" already defined +first_mode=mode \"{0}\" was first defined here +duplicate_attribute_action_any_namespace=rule for attributes from any namespace already specified in this mode +duplicate_attribute_action=rule for attributes from namespace \"{0}\" already specified in this mode +duplicate_element_action_any_namespace=rule for elements from any namespace already specified in this mode +duplicate_element_action=rule for elements from namespace \"{0}\" already specified in this mode +mode_cycle=mode \"{0}\" directly or indirectly extends itself +unknown_option=option \"{0}\" not recognized +unsupported_option=option \"{0}\" is not supported for this kind of schema +unsupported_option_arg=specified argument for option \"{0}\" is not supported +duplicate_option=option \"{0}\" cannot be specified more than once +option_requires_argument=option \"{0}\" requires an argument +option_unexpected_argument=option \"{0}\" does not take an argument +option_bad_argument=invalid argument for option \"{0}\" diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/nrl.rng b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/nrl.rng new file mode 100644 index 0000000..696fa1a --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/nrl/resources/nrl.rng @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + elements + attributes + + + attributes + elements + + elements + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + allow + reject + + + + + + + + + + + + attach + unwrap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #attach + #allow + #reject + #unwrap + + + + + + + + + + + + + \s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*(|\s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*)* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/CompactSchemaReader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/CompactSchemaReader.java new file mode 100644 index 0000000..b2da9f1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/CompactSchemaReader.java @@ -0,0 +1,24 @@ +package com.thaiopensource.validate.rng; + +import com.thaiopensource.relaxng.impl.SchemaReaderImpl; +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.relaxng.parse.compact.CompactParseable; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.InputSource; +import org.xml.sax.ErrorHandler; + +public class CompactSchemaReader extends SchemaReaderImpl { + private static final SchemaReader theInstance = new CompactSchemaReader(); + + private CompactSchemaReader() { + } + + public static SchemaReader getInstance() { + return theInstance; + } + + protected Parseable createParseable(XMLReaderCreator xrc, InputSource in, ErrorHandler eh) { + return new CompactParseable(in, eh); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/RngProperty.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/RngProperty.java new file mode 100644 index 0000000..03027d6 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/RngProperty.java @@ -0,0 +1,45 @@ +package com.thaiopensource.validate.rng; + +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.FlagPropertyId; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.FlagOption; +import com.thaiopensource.validate.SchemaReader; +import org.relaxng.datatype.DatatypeLibraryFactory; + +public class RngProperty { + + private RngProperty() { } + + public static class DatatypeLibraryFactoryPropertyId extends PropertyId { + public DatatypeLibraryFactoryPropertyId(String name) { + super(name, DatatypeLibraryFactory.class); + } + + public DatatypeLibraryFactory get(PropertyMap properties) { + return (DatatypeLibraryFactory)properties.get(this); + } + + public DatatypeLibraryFactory put(PropertyMapBuilder builder, DatatypeLibraryFactory value) { + return (DatatypeLibraryFactory)builder.put(this, value); + } + } + + public static final DatatypeLibraryFactoryPropertyId DATATYPE_LIBRARY_FACTORY + = new DatatypeLibraryFactoryPropertyId("DATATYPE_LIBRARY_FACTORY"); + public static final FlagPropertyId CHECK_ID_IDREF = new FlagPropertyId("CHECK_ID_IDREF"); + public static final FlagPropertyId FEASIBLE = new FlagPropertyId("FEASIBLE"); + + public static Option getOption(String uri) { + if (!uri.startsWith(SchemaReader.BASE_URI)) + return null; + uri = uri.substring(SchemaReader.BASE_URI.length()); + if (uri.equals("feasible")) + return new FlagOption(FEASIBLE); + if (uri.equals("check-id-idref")) + return new FlagOption(CHECK_ID_IDREF); + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReader.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReader.java new file mode 100644 index 0000000..073d63e --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReader.java @@ -0,0 +1,24 @@ +package com.thaiopensource.validate.rng; + +import com.thaiopensource.relaxng.impl.SchemaReaderImpl; +import com.thaiopensource.relaxng.parse.Parseable; +import com.thaiopensource.relaxng.parse.sax.SAXParseable; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.InputSource; +import org.xml.sax.ErrorHandler; + +public class SAXSchemaReader extends SchemaReaderImpl { + private static final SchemaReader theInstance = new SAXSchemaReader(); + + private SAXSchemaReader() { + } + + public static SchemaReader getInstance() { + return theInstance; + } + + protected Parseable createParseable(XMLReaderCreator xrc, InputSource in, ErrorHandler eh) { + return new SAXParseable(xrc, in, eh); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.java new file mode 100644 index 0000000..4432f0d --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/rng/SAXSchemaReceiverFactory.java @@ -0,0 +1,28 @@ +package com.thaiopensource.validate.rng; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.auto.SchemaReceiver; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.relaxng.impl.SchemaReceiverImpl; +import com.thaiopensource.relaxng.parse.sax.SAXParseReceiver; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Option; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import com.thaiopensource.xml.util.WellKnownNamespaces; +import org.xml.sax.ErrorHandler; + +public class SAXSchemaReceiverFactory implements SchemaReceiverFactory { + public SchemaReceiver createSchemaReceiver(String namespaceUri, + PropertyMap properties) { + // XXX allow namespaces with incorrect version + if (!WellKnownNamespaces.RELAX_NG.equals(namespaceUri)) + return null; + XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties); + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + return new SchemaReceiverImpl(new SAXParseReceiver(xrc, eh), properties); + } + + public Option getOption(String uri) { + return RngProperty.getOption(uri); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/DraconianErrorListener.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/DraconianErrorListener.java new file mode 100644 index 0000000..4f8a6e2 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/DraconianErrorListener.java @@ -0,0 +1,23 @@ +package com.thaiopensource.validate.schematron; + +import javax.xml.transform.ErrorListener; +import javax.xml.transform.TransformerException; + +class DraconianErrorListener implements ErrorListener { + DraconianErrorListener() { + } + + public void warning(TransformerException exception) + throws TransformerException { + } + + public void error(TransformerException exception) + throws TransformerException { + throw exception; + } + + public void fatalError(TransformerException exception) + throws TransformerException { + throw exception; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/OutputHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/OutputHandler.java new file mode 100644 index 0000000..95ac8b7 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/OutputHandler.java @@ -0,0 +1,95 @@ +package com.thaiopensource.validate.schematron; + +import org.xml.sax.helpers.DefaultHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXParseException; +import org.xml.sax.SAXException; +import org.xml.sax.Attributes; +import com.thaiopensource.util.Localizer; + +class OutputHandler extends DefaultHandler { + private final ErrorHandler eh; + private int lineNumber = -1; + private String systemId = null; + private final StringBuffer message = new StringBuffer(); + private boolean inMessage = false; + private final String lineSeparator; + private static final String indent = " "; + private final Localizer localizer = new Localizer(OutputHandler.class); + + OutputHandler(ErrorHandler eh) { + this.eh = eh; + this.lineSeparator = System.getProperty("line.separator"); + } + + public void characters(char ch[], int start, int length) + throws SAXException { + if (inMessage) { + for (int i = 0; i < length; i++) { + char c = ch[start + i]; + switch (c) { + case ' ': + case '\r': + case '\n': + case '\t': + if (message.length() == 0 || message.charAt(message.length() - 1) != ' ') + message.append(' '); + break; + default: + message.append(c); + break; + } + } + } + } + + public void ignorableWhitespace(char ch[], int start, int length) + throws SAXException { + characters(ch, start, length); + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) + throws SAXException { + if (localName.equals("failed-assertion") + || localName.equals("report")) { + String value = attributes.getValue("", "line-number"); + if (value == null) + lineNumber = -1; + else { + try { + lineNumber = Integer.parseInt(value); + } + catch (NumberFormatException e) { + lineNumber = -1; + } + } + value = attributes.getValue("", "system-id"); + if (value != null && value.equals("")) + value = null; + systemId = value; + message.append(localizer.message(localName.equals("failed-assertion") + ? "failed_assertion" + : "report")); + } + else if (localName.equals("statement") || localName.equals("diagnostic")) { + inMessage = true; + message.append(lineSeparator); + message.append(indent); + } + } + + public void endElement(String uri, String localName, String qName) + throws SAXException { + if (localName.equals("statement") || localName.equals("diagnostic")) { + if (message.length() > 0 && message.charAt(message.length() - 1) == ' ') + message.setLength(message.length() - 1); + inMessage = false; + } + else if (localName.equals("failed-assertion") + || localName.equals("report")) { + eh.error(new SAXParseException(message.toString(), null, systemId, lineNumber, -1)); + message.setLength(0); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.java new file mode 100644 index 0000000..58bfd59 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SaxonSchemaReaderFactory.java @@ -0,0 +1,11 @@ +package com.thaiopensource.validate.schematron; + +import com.icl.saxon.TransformerFactoryImpl; + +import javax.xml.transform.TransformerFactory; + +public class SaxonSchemaReaderFactory extends SchematronSchemaReaderFactory { + public TransformerFactory newTransformerFactory() { + return new TransformerFactoryImpl(); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaImpl.java new file mode 100644 index 0000000..463f964 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaImpl.java @@ -0,0 +1,21 @@ +package com.thaiopensource.validate.schematron; + +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.AbstractSchema; +import com.thaiopensource.validate.Validator; + +import javax.xml.transform.Templates; + +class SchemaImpl extends AbstractSchema { + private final Templates templates; + + SchemaImpl(Templates templates, PropertyMap properties, PropertyId[] supportedPropertyIds) { + super(properties, supportedPropertyIds); + this.templates = templates; + } + + public Validator createValidator(PropertyMap properties) { + return new ValidatorImpl(templates, properties); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaReaderImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaReaderImpl.java new file mode 100644 index 0000000..0679ee9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchemaReaderImpl.java @@ -0,0 +1,499 @@ +package com.thaiopensource.validate.schematron; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.Localizer; +import com.thaiopensource.util.PropertyId; +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.RngProperty; +import com.thaiopensource.xml.sax.CountingErrorHandler; +import com.thaiopensource.xml.sax.DelegatingContentHandler; +import com.thaiopensource.xml.sax.DraconianErrorHandler; +import com.thaiopensource.xml.sax.ForkContentHandler; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; + +import javax.xml.transform.ErrorListener; +import javax.xml.transform.SourceLocator; +import javax.xml.transform.Templates; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamSource; +import java.io.IOException; +import java.io.InputStream; + +class SchemaReaderImpl implements SchemaReader { + static final String SCHEMATRON_URI = "http://www.ascc.net/xml/schematron"; + private static final String LOCATION_URI = "http://www.thaiopensource.com/ns/location"; + private static final String ERROR_URI = "http://www.thaiopensource.com/ns/error"; + private final Localizer localizer = new Localizer(SchemaReaderImpl.class); + + private final Class transformerFactoryClass; + private final Templates schematron; + private final Schema schematronSchema; + private static final String SCHEMATRON_SCHEMA = "schematron.rnc"; + private static final String SCHEMATRON_STYLESHEET = "schematron.xsl"; + private static final PropertyId[] supportedPropertyIds = { + ValidateProperty.ERROR_HANDLER, + ValidateProperty.XML_READER_CREATOR, + SchematronProperty.DIAGNOSE, + SchematronProperty.PHASE, + }; + + SchemaReaderImpl(TransformerFactory transformerFactory) throws TransformerConfigurationException, IncorrectSchemaException { + this.transformerFactoryClass = transformerFactory.getClass(); + String resourceName = fullResourceName(SCHEMATRON_STYLESHEET); + StreamSource source = new StreamSource(getResourceAsStream(resourceName)); + initTransformerFactory(transformerFactory); + schematron = transformerFactory.newTemplates(source); + InputSource schemaSource = new InputSource(getResourceAsStream(fullResourceName(SCHEMATRON_SCHEMA))); + PropertyMapBuilder builder = new PropertyMapBuilder(); + ValidateProperty.ERROR_HANDLER.put(builder, new DraconianErrorHandler()); + RngProperty.CHECK_ID_IDREF.add(builder); + try { + schematronSchema = CompactSchemaReader.getInstance().createSchema(schemaSource, builder.toPropertyMap()); + } + catch (SAXException e) { + throw new IncorrectSchemaException(); + } + catch (IOException e) { + throw new IncorrectSchemaException(); + } + } + + public Option getOption(String uri) { + return SchematronProperty.getOption(uri); + } + + private void initTransformerFactory(TransformerFactory factory) { + String name = factory.getClass().getName(); + try { + if (name.equals("com.icl.saxon.TransformerFactoryImpl")) + factory.setAttribute("http://icl.com/saxon/feature/linenumbering", + Boolean.TRUE); + else if (name.equals("org.apache.xalan.processor.TransformerFactoryImpl")) { + // Try both the documented URI and the URI that the code expects. + try { + // This is the URI that the code expects. + factory.setAttribute("http://xml.apache.org/xalan/properties/source-location", + Boolean.TRUE); + } + catch (IllegalArgumentException e) { + // This is the URI that's documented. + factory.setAttribute("http://apache.org/xalan/features/source_location", + Boolean.TRUE); + } + } + } + catch (IllegalArgumentException e) { + } + } + + static class ValidateStage extends XMLReaderImpl { + private final ContentHandler validator; + private ContentHandler contentHandler; + private final XMLReader reader; + private final CountingErrorHandler ceh; + + ValidateStage(XMLReader reader, Validator validator, CountingErrorHandler ceh) { + this.reader = reader; + this.validator = validator.getContentHandler(); + this.ceh = ceh; + } + + public void parse(InputSource input) + throws SAXException, IOException { + reader.parse(input); + if (ceh.getHadErrorOrFatalError()) + throw new SAXException(new IncorrectSchemaException()); + } + + public void setContentHandler(ContentHandler handler) { + this.contentHandler = handler; + reader.setContentHandler(new ForkContentHandler(validator, contentHandler)); + } + + public ContentHandler getContentHandler() { + return contentHandler; + } + } + + static class UserException extends Exception { + private final SAXException exception; + + UserException(SAXException exception) { + this.exception = exception; + } + + SAXException getException() { + return exception; + } + } + + static class UserWrapErrorHandler extends CountingErrorHandler { + UserWrapErrorHandler(ErrorHandler errorHandler) { + super(errorHandler); + } + + public void warning(SAXParseException exception) + throws SAXException { + try { + super.warning(exception); + } + catch (SAXException e) { + throw new SAXException(new UserException(e)); + } + } + + public void error(SAXParseException exception) + throws SAXException { + try { + super.error(exception); + } + catch (SAXException e) { + throw new SAXException(new UserException(e)); + } + } + + public void fatalError(SAXParseException exception) + throws SAXException { + try { + super.fatalError(exception); + } + catch (SAXException e) { + throw new SAXException(new UserException(e)); + } + } + } + + static class ErrorFilter extends DelegatingContentHandler { + private final ErrorHandler eh; + private final Localizer localizer; + private Locator locator; + + ErrorFilter(ContentHandler delegate, ErrorHandler eh, Localizer localizer) { + super(delegate); + this.eh = eh; + this.localizer = localizer; + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + super.setDocumentLocator(locator); + } + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) + throws SAXException { + if (namespaceURI.equals(ERROR_URI) && localName.equals("error")) + eh.error(new SAXParseException(localizer.message(atts.getValue("", "message"), + atts.getValue("", "arg")), + locator)); + super.startElement(namespaceURI, localName, qName, atts); + } + } + + static class LocationFilter extends DelegatingContentHandler implements Locator { + private final String systemId; + private int lineNumber = -1; + private SAXException exception = null; + + LocationFilter(ContentHandler delegate, String systemId) { + super(delegate); + this.systemId = systemId; + } + + SAXException getException() { + return exception; + } + + public void setDocumentLocator(Locator locator) { + } + + public void startDocument() + throws SAXException { + getDelegate().setDocumentLocator(this); + super.startDocument(); + } + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) + throws SAXException { + String value = atts.getValue(LOCATION_URI, "line-number"); + if (value != null) { + try { + lineNumber = Integer.parseInt(value); + } + catch (NumberFormatException e) { + lineNumber = -1; + } + } + else + lineNumber = -1; + try { + super.startElement(namespaceURI, localName, qName, atts); + } + catch (SAXException e) { + this.exception = e; + setDelegate(null); + } + lineNumber = -1; + } + + public String getPublicId() { + return null; + } + + public String getSystemId() { + return systemId; + } + + public int getLineNumber() { + return lineNumber; + } + + public int getColumnNumber() { + return -1; + } + } + + static class TransformStage extends XMLReaderImpl { + private ContentHandler contentHandler; + private final Transformer transformer; + private final SAXSource transformSource; + private final String systemId; + private final CountingErrorHandler ceh; + private final Localizer localizer; + + TransformStage(Transformer transformer, SAXSource transformSource, String systemId, + CountingErrorHandler ceh, Localizer localizer) { + this.transformer = transformer; + this.transformSource = transformSource; + this.systemId = systemId; + this.ceh = ceh; + this.localizer = localizer; + } + + public void parse(InputSource input) + throws IOException, SAXException { + try { + LocationFilter handler = new LocationFilter(new ErrorFilter(contentHandler, ceh, localizer), + systemId); + transformer.transform(transformSource, new SAXResult(handler)); + SAXException exception = handler.getException(); + if (exception != null) + throw exception; + } + catch (TransformerException e) { + if (e.getException() instanceof IOException) + throw (IOException)e.getException(); + throw ValidatorImpl.toSAXException(e); + } + if (ceh.getHadErrorOrFatalError()) + throw new SAXException(new IncorrectSchemaException()); + } + + public ContentHandler getContentHandler() { + return contentHandler; + } + + public void setContentHandler(ContentHandler contentHandler) { + this.contentHandler = contentHandler; + } + } + + static class SAXErrorListener implements ErrorListener { + private final ErrorHandler eh; + private final String systemId; + private boolean hadError = false; + SAXErrorListener(ErrorHandler eh, String systemId) { + this.eh = eh; + this.systemId = systemId; + } + + boolean getHadError() { + return hadError; + } + + public void warning(TransformerException exception) + throws TransformerException { + SAXParseException spe = transform(exception); + try { + eh.warning(spe); + } + catch (SAXException e) { + throw new TransformerException(new UserException(e)); + } + } + + public void error(TransformerException exception) + throws TransformerException { + hadError = true; + SAXParseException spe = transform(exception); + try { + eh.error(spe); + } + catch (SAXException e) { + throw new TransformerException(new UserException(e)); + } + } + + public void fatalError(TransformerException exception) + throws TransformerException { + hadError = true; + SAXParseException spe = transform(exception); + try { + eh.fatalError(spe); + } + catch (SAXException e) { + throw new TransformerException(new UserException(e)); + } + } + + SAXParseException transform(TransformerException exception) throws TransformerException { + Throwable cause = exception.getException(); + // Xalan takes it upon itself to catch exceptions and pass them to the ErrorListener. + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + if (cause instanceof SAXException + || cause instanceof IncorrectSchemaException + || cause instanceof IOException) + throw exception; + SourceLocator locator = exception.getLocator(); + if (locator == null) + return new SAXParseException(exception.getMessage(), null); + // Xalan sometimes loses the systemId; work around this. + String s = locator.getSystemId(); + if (s == null) + s = systemId; + return new SAXParseException(exception.getMessage(), + null, + s, + locator.getLineNumber(), + -1); + } + } + + public Schema createSchema(InputSource in, PropertyMap properties) + throws IOException, SAXException, IncorrectSchemaException { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + SAXErrorListener errorListener = new SAXErrorListener(eh, in.getSystemId()); + UserWrapErrorHandler ueh1 = new UserWrapErrorHandler(eh); + UserWrapErrorHandler ueh2 = new UserWrapErrorHandler(eh); + try { + PropertyMapBuilder builder = new PropertyMapBuilder(properties); + ValidateProperty.ERROR_HANDLER.put(builder, ueh1); + SAXSource source = createValidatingSource(in, builder.toPropertyMap(), ueh1); + source = createTransformingSource(source, + SchematronProperty.PHASE.get(properties), + properties.contains(SchematronProperty.DIAGNOSE), + in.getSystemId(), + ueh2); + TransformerFactory transformerFactory = (TransformerFactory)transformerFactoryClass.newInstance(); + initTransformerFactory(transformerFactory); + transformerFactory.setErrorListener(errorListener); + Templates templates = transformerFactory.newTemplates(source); + return new SchemaImpl(templates, properties, supportedPropertyIds); + } + catch (TransformerConfigurationException e) { + throw toSAXException(e, errorListener.getHadError() + || ueh1.getHadErrorOrFatalError() + || ueh2.getHadErrorOrFatalError()); + } + catch (InstantiationException e) { + throw new SAXException(e); + } + catch (IllegalAccessException e) { + throw new SAXException(e); + } + } + + private SAXSource createValidatingSource(InputSource in, PropertyMap properties, CountingErrorHandler ceh) throws SAXException { + Validator validator = schematronSchema.createValidator(properties); + XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties); + XMLReader xr = xrc.createXMLReader(); + xr.setErrorHandler(ceh); + return new SAXSource(new ValidateStage(xr, validator, ceh), in); + } + + private SAXSource createTransformingSource(SAXSource in, String phase, boolean diagnose, + String systemId, CountingErrorHandler ceh) throws SAXException { + try { + Transformer transformer = schematron.newTransformer(); + transformer.setErrorListener(new DraconianErrorListener()); + if (phase != null) + transformer.setParameter("phase", phase); + if (diagnose) + transformer.setParameter("diagnose", Boolean.TRUE); + return new SAXSource(new TransformStage(transformer, in, systemId, ceh, localizer), + new InputSource(systemId)); + } + catch (TransformerConfigurationException e) { + throw new SAXException(e); + } + } + + private SAXException toSAXException(TransformerException e, boolean hadError) throws IOException, IncorrectSchemaException { + return causeToSAXException(e.getException(), hadError); + } + + private SAXException causeToSAXException(Throwable cause, boolean hadError) throws IOException, IncorrectSchemaException { + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + if (cause instanceof IOException) + throw (IOException)cause; + if (cause instanceof IncorrectSchemaException) + throw (IncorrectSchemaException)cause; + if (cause instanceof SAXException) + return causeToSAXException(((SAXException)cause).getException(), hadError); + if (cause instanceof TransformerException) + return toSAXException((TransformerException)cause, hadError); + if (cause instanceof UserException) + return toSAXException((UserException)cause); + if (hadError) + throw new IncorrectSchemaException(); + return new SAXException(localizer.message("unexpected_schema_creation_error"), + cause instanceof Exception ? (Exception)cause : null); + } + + private static SAXException toSAXException(UserException e) throws IOException, IncorrectSchemaException { + SAXException se = e.getException(); + Exception cause = se.getException(); + if (cause instanceof IncorrectSchemaException) + throw (IncorrectSchemaException)cause; + if (cause instanceof IOException) + throw (IOException)cause; + return se; + } + + private static String fullResourceName(String name) { + String className = SchemaReaderImpl.class.getName(); + return className.substring(0, className.lastIndexOf('.')).replace('.', '/') + "/resources/" + name; + } + + private static InputStream getResourceAsStream(String resourceName) { + ClassLoader cl = SchemaReaderImpl.class.getClassLoader(); + // XXX see if we should borrow 1.2 code from Service + if (cl == null) + return ClassLoader.getSystemResourceAsStream(resourceName); + else + return cl.getResourceAsStream(resourceName); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronProperty.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronProperty.java new file mode 100644 index 0000000..815e282 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronProperty.java @@ -0,0 +1,55 @@ +package com.thaiopensource.validate.schematron; + +import com.thaiopensource.validate.StringPropertyId; +import com.thaiopensource.validate.FlagPropertyId; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.FlagOption; +import com.thaiopensource.validate.StringOption; +import com.thaiopensource.validate.OptionArgumentFormatException; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.xml.util.Naming; + +/** + * Properties for controlling schema reading and validation specific to Schematron. + */ +public class SchematronProperty { + private SchematronProperty() { } + + /** + * PropertyId that specifies the Schematron phase to use. + * This applies during schema creation. + */ + public static final StringPropertyId PHASE = new StringPropertyId("PHASE"); + + static public class PhaseOption extends StringOption { + private PhaseOption() { + super(PHASE); + } + + public String normalize(String value) throws OptionArgumentFormatException { + value = value.trim(); + if (!value.equals("#ALL") && !Naming.isNcname(value)) + throw new OptionArgumentFormatException(); + return value; + } + } + + public static final StringOption PHASE_OPTION = new PhaseOption(); + + /** + * PropertyId thats specifies that diagnostic messages should be included. + * This applies during validation. + */ + public static final FlagPropertyId DIAGNOSE = new FlagPropertyId("DIAGNOSE"); + + public static Option getOption(String uri) { + if (!uri.startsWith(SchemaReader.BASE_URI)) + return null; + uri = uri.substring(SchemaReader.BASE_URI.length()); + if (uri.equals("diagnose")) + return new FlagOption(DIAGNOSE); + if (uri.equals("phase")) + return PHASE_OPTION; + return null; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronSchemaReaderFactory.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronSchemaReaderFactory.java new file mode 100644 index 0000000..4e625ab --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/SchematronSchemaReaderFactory.java @@ -0,0 +1,30 @@ +package com.thaiopensource.validate.schematron; + +import com.thaiopensource.validate.IncorrectSchemaException; +import com.thaiopensource.validate.Option; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.SchemaReaderFactory; + +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; + +public abstract class SchematronSchemaReaderFactory implements SchemaReaderFactory { + public SchemaReader createSchemaReader(String namespaceUri) { + if (namespaceUri.equals(SchemaReaderImpl.SCHEMATRON_URI)) { + try { + return new SchemaReaderImpl(newTransformerFactory()); + } + catch (TransformerFactoryConfigurationError e) { } + catch (IncorrectSchemaException e) { } + catch (TransformerConfigurationException e) { } + } + return null; + } + + public Option getOption(String uri) { + return SchematronProperty.getOption(uri); + } + + public abstract TransformerFactory newTransformerFactory(); +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/ValidatorImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/ValidatorImpl.java new file mode 100644 index 0000000..65760fc --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/ValidatorImpl.java @@ -0,0 +1,163 @@ +package com.thaiopensource.validate.schematron; + +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; +import com.thaiopensource.xml.sax.DelegatingContentHandler; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +import javax.xml.transform.Templates; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.sax.SAXSource; + +class ValidatorImpl extends DelegatingContentHandler implements Validator { + private final Transformer transformer; + private Locator locator; + private TransformerException transformerException; + + private final Object contentHandlerMonitor = new Object(); + private final Object parseMonitor = new Object(); + private final Object transformMonitor = new Object(); + private Thread transformThread; + private final ContentHandler outputHandler; + + class BlockingReader extends XMLReaderImpl { + public void parse(InputSource in) throws SAXException { + synchronized (parseMonitor) { + synchronized (contentHandlerMonitor) { + contentHandlerMonitor.notify(); + } + try { + parseMonitor.wait(); + } + catch (InterruptedException e) { + throw new SAXException(e); + } + } + } + + public void setContentHandler(ContentHandler handler) { + setDelegate(handler); + } + + public ContentHandler getContentHandler() { + return getDelegate(); + } + + } + + ValidatorImpl(Templates templates, PropertyMap properties) { + ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties); + outputHandler = new OutputHandler(eh); + try { + transformer = templates.newTransformer(); + // XXX set up transformer with a resolver that uses the resolver + // XXX and XMLReaderCreator from properties + // XXX set up transformer with an ErrorListener that just throws + } + catch (TransformerConfigurationException e) { + throw new RuntimeException("could not create transformer"); + } + } + + public ContentHandler getContentHandler() { + return this; + } + + public DTDHandler getDTDHandler() { + return null; + } + + public void reset() { + if (transformThread != null) { + synchronized (transformMonitor) { + transformThread.interrupt(); + try { + transformMonitor.wait(); + } + catch (InterruptedException e) { } + transformThread = null; + } + } + transformerException = null; + locator = null; + } + + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + public void startDocument() + throws SAXException { + final SAXSource source = new SAXSource(new BlockingReader(), + new InputSource("")); + transformThread = new Thread(new Runnable() { + public void run() { + try { + transformer.transform(source, new SAXResult(outputHandler)); + } + catch (TransformerException e) { + transformerException = e; + } + finally { + synchronized (transformMonitor) { + transformMonitor.notify(); + } + } + } + }, "Transform"); + synchronized (contentHandlerMonitor) { + transformThread.start(); + try { + contentHandlerMonitor.wait(); + } + catch (InterruptedException e) { + throw new SAXException(e); + } + } + if (locator != null) + super.setDocumentLocator(locator); + super.startDocument(); + } + + public void endDocument() + throws SAXException { + super.endDocument(); + synchronized (transformMonitor) { + synchronized (parseMonitor) { + parseMonitor.notify(); + } + try { + transformMonitor.wait(); + } + catch (InterruptedException e) { + throw new SAXException(e); + } + finally { + transformThread = null; + } + } + if (transformerException != null) + throw toSAXException(transformerException); + } + + static SAXException toSAXException(TransformerException transformerException) { + // Unwrap where possible + Throwable wrapped = transformerException.getException(); + if (wrapped instanceof SAXException) + return (SAXException)wrapped; + if (wrapped instanceof RuntimeException) + throw (RuntimeException)wrapped; + if (wrapped instanceof Exception) + return new SAXException((Exception)wrapped); + return new SAXException(transformerException); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/XMLReaderImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/XMLReaderImpl.java new file mode 100644 index 0000000..1fcee14 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/XMLReaderImpl.java @@ -0,0 +1,82 @@ +package com.thaiopensource.validate.schematron; + +import org.xml.sax.XMLReader; +import org.xml.sax.SAXException; +import org.xml.sax.InputSource; +import org.xml.sax.ErrorHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; + +import java.io.IOException; + +abstract class XMLReaderImpl implements XMLReader { + private ErrorHandler errorHandler; + private DTDHandler dtdHandler; + private EntityResolver entityResolver; + + public void parse(String systemId) + throws SAXException, IOException { + parse(new InputSource(systemId)); + } + + + public ErrorHandler getErrorHandler() { + return errorHandler; + } + + public void setErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + public void setDTDHandler(DTDHandler handler) { + this.dtdHandler = handler; + } + + public DTDHandler getDTDHandler() { + return dtdHandler; + } + + public void setEntityResolver(EntityResolver resolver) { + this.entityResolver = resolver; + } + + public EntityResolver getEntityResolver() { + return entityResolver; + } + + public Object getProperty(String name) + throws SAXNotRecognizedException, SAXNotSupportedException { + throw new SAXNotRecognizedException(name); + } + + public void setProperty(String name, Object value) + throws SAXNotRecognizedException, SAXNotSupportedException { + throw new SAXNotRecognizedException(name); + } + + public boolean getFeature(String name) + throws SAXNotRecognizedException, SAXNotSupportedException { + if (name.equals("http://xml.org/sax/features/namespaces")) + return true; + if (name.equals("http://xml.org/sax/features/namespace-prefixes")) + return false; + throw new SAXNotRecognizedException(name); + } + + public void setFeature(String name, boolean value) + throws SAXNotRecognizedException, SAXNotSupportedException { + if (name.equals("http://xml.org/sax/features/namespaces")) { + if (value == true) + return; + throw new SAXNotSupportedException(name); + } + if (name.equals("http://xml.org/sax/features/namespace-prefixes")) { + if (value == false) + return; + throw new SAXNotSupportedException(name); + } + throw new SAXNotRecognizedException(name); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/Messages.properties new file mode 100644 index 0000000..0cd5a66 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/Messages.properties @@ -0,0 +1,11 @@ +unexpected_schema_creation_error=could not create schema (please file a bug report) +# these messages are used in schematron.xsl +extends_cycle=cannot extend rule \"{0}\" because the extends chain has a cycle +active_missing=cannot activate non-existent pattern \"{0}\" +extends_missing=cannot extend non-existent rule \"{0}\" +extends_concrete=cannot extend rule \"{0}\" because it is not abstract +phase_missing=the schema does not define a phase \"{0}\" +default_phase_missing=the schema does not define its default phase \"{0}\" +diagnostic_missing=reference to non-existent diagnostic \"{0}\" +report=report: +failed_assertion=assertion failed: diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.rnc b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.rnc new file mode 100644 index 0000000..6a61909 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.rnc @@ -0,0 +1,167 @@ +# Based on +# http://www.ascc.net/xml/schematron/schematron1-5.dtd, version of 2002/08/16 + +# This version has the 1.6 feature that sch:key element with @match +# is allowed under sch:schema. This is not part of 1.5 proper. + +default namespace sch = "http://www.ascc.net/xml/schematron" +namespace local = "" + +start = schema + +# Element declarations +schema = + element schema { + attribute id { xsd:ID }?, + attribute fpi { fpi }?, + attribute ns { uri }?, + attribute schemaVersion { non-empty-string }?, + attribute defaultPhase { xsd:IDREF }?, + attribute icon { non-empty-string }?, + attribute version { non-empty-string }?, + (foreign + & (title?, + ns*, + p*, + (phase | key-with-match)*, + pattern+, + p*, + diagnostics?)) + } +active = + element active { + attribute pattern { xsd:IDREF }, + (foreign & (text | dir | emph | span)*) + } +assert = + element assert { + attribute test { expr }, + attribute role { role }?, + attribute id { xsd:ID }?, + attribute diagnostics { xsd:IDREFS }?, + attribute icon { uri }?, + attribute subject { path }?, + (foreign & (text | name | emph | dir | span)*) + } +dir = + element dir { + attribute value { "ltr" | "rtl" }?, + (foreign & text) + } +emph = element emph { text } +extends = + element extends { + attribute rule { xsd:IDREF }, + foreign-empty + } +diagnostic = + element diagnostic { + attribute id { xsd:ID }, + attribute icon { uri }?, + (foreign & (text | value-of | emph | dir | span)*) + } +diagnostics = element diagnostics { foreign & diagnostic* } +key = + element key { + attribute name { xsd:NMTOKEN }, + attribute path { path }, + attribute icon { uri }?, + foreign-empty + } +key-with-match = + element key { + attribute match { path }, + attribute name { xsd:NMTOKEN }, + attribute path { path }, + attribute icon { uri }?, + foreign-empty + } +name = + element name { + attribute path { path }?, + foreign-empty + } +ns = + element ns { + attribute uri { uri }, + attribute prefix { xsd:NMTOKEN }?, + foreign-empty + } +p = + element p { + attribute id { xsd:ID }?, + attribute class { non-empty-string }?, + attribute icon { uri }?, + (foreign & (text | dir | emph | span)*) + } +pattern = + element pattern { + attribute name { non-empty-string }, + attribute see { uri }?, + attribute id { xsd:ID }?, + attribute icon { uri }?, + (foreign & (p*, rule*)) + } +phase = + element phase { + attribute id { xsd:ID }, + attribute fpi { fpi }?, + attribute icon { uri }?, + (foreign & (p*, active*)) + } +report = + element report { + attribute test { expr }, + attribute role { role }?, + attribute id { xsd:ID }?, + attribute diagnostics { xsd:IDREFS }?, + attribute icon { uri }?, + attribute subject { path }?, + (foreign & (text | name | emph | dir | span)*) + } +rule = + element rule { + attribute role { role }?, + attribute id { xsd:ID }?, + (foreign + & ((attribute abstract { "true" }, (assert | report | extends)+) + | (attribute context { path }, + attribute abstract { "false" }?, + (assert | report | key | extends)+))) + } +span = + element span { + attribute class { non-empty-string }?, + (foreign & text) + } +title = element title { (text | dir)* } +value-of = + element value-of { + attribute select { path }, + foreign-empty + } + +foreign = foreign-attributes, foreign-element* + +foreign-empty = foreign-attributes + +foreign-attributes = attribute * - local:* { text }* +foreign-element = + element * - sch:* { + (attribute * { text } + | foreign-element + | schema + | text)* + } + +# Data types + +uri = xsd:anyURI +path = string +expr = string +fpi = string +lang = xsd:language + +role = xsd:NCName + +non-empty-string = xsd:token { minLength = "1" } diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.xsl b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.xsl new file mode 100644 index 0000000..7deb081 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/validate/schematron/resources/schematron.xsl @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/AbstractLexicalHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/AbstractLexicalHandler.java new file mode 100644 index 0000000..f567159 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/AbstractLexicalHandler.java @@ -0,0 +1,27 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.ext.LexicalHandler; +import org.xml.sax.SAXException; + +public class AbstractLexicalHandler implements LexicalHandler { + public void startDTD(String s, String s1, String s2) throws SAXException { + } + + public void endDTD() throws SAXException { + } + + public void startEntity(String s) throws SAXException { + } + + public void endEntity(String s) throws SAXException { + } + + public void startCDATA() throws SAXException { + } + + public void endCDATA() throws SAXException { + } + + public void comment(char[] chars, int start, int length) throws SAXException { + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/CountingErrorHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/CountingErrorHandler.java new file mode 100644 index 0000000..1e0af22 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/CountingErrorHandler.java @@ -0,0 +1,75 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXParseException; +import org.xml.sax.SAXException; + +public class CountingErrorHandler implements ErrorHandler { + private ErrorHandler errorHandler; + private int fatalErrorCount = 0; + private int errorCount = 0; + private int warningCount = 0; + private boolean hadErrorOrFatalError = false; + + public CountingErrorHandler() { + this(null); + } + + public CountingErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + public void reset() { + fatalErrorCount = 0; + errorCount = 0; + warningCount = 0; + hadErrorOrFatalError = false; + } + + public boolean getHadErrorOrFatalError() { + return hadErrorOrFatalError; + } + + public int getFatalErrorCount() { + return fatalErrorCount; + } + + public int getErrorCount() { + return errorCount; + } + + public int getWarningCount() { + return warningCount; + } + + public ErrorHandler getErrorHandler() { + return errorHandler; + } + + public void setErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + public void warning(SAXParseException exception) + throws SAXException { + warningCount++; + if (errorHandler != null) + errorHandler.warning(exception); + } + + public void error(SAXParseException exception) + throws SAXException { + errorCount++; + hadErrorOrFatalError = true; + if (errorHandler != null) + errorHandler.error(exception); + } + + public void fatalError(SAXParseException exception) + throws SAXException { + fatalErrorCount++; + hadErrorOrFatalError = true; + if (errorHandler != null) + errorHandler.fatalError(exception); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DelegatingContentHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DelegatingContentHandler.java new file mode 100644 index 0000000..6a92e35 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DelegatingContentHandler.java @@ -0,0 +1,92 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.Attributes; + +public class DelegatingContentHandler implements ContentHandler { + private ContentHandler delegate; + + public DelegatingContentHandler() { + } + + public DelegatingContentHandler(ContentHandler delegate) { + this.delegate = delegate; + } + + public ContentHandler getDelegate() { + return delegate; + } + + public void setDelegate(ContentHandler delegate) { + this.delegate = delegate; + } + + public void setDocumentLocator (Locator locator) { + if (delegate != null) + delegate.setDocumentLocator(locator); + } + + public void startDocument () + throws SAXException { + if (delegate != null) + delegate.startDocument(); + } + + public void endDocument() + throws SAXException { + if (delegate != null) + delegate.endDocument(); + } + + public void startPrefixMapping (String prefix, String uri) + throws SAXException { + if (delegate != null) + delegate.startPrefixMapping(prefix, uri); + } + + public void endPrefixMapping (String prefix) + throws SAXException { + if (delegate != null) + delegate.endPrefixMapping(prefix); + } + + public void startElement (String namespaceURI, String localName, + String qName, Attributes atts) + throws SAXException { + if (delegate != null) + delegate.startElement(namespaceURI, localName, qName, atts); + } + + public void endElement (String namespaceURI, String localName, + String qName) + throws SAXException { + if (delegate != null) + delegate.endElement(namespaceURI, localName, qName); + } + + public void characters (char ch[], int start, int length) + throws SAXException { + if (delegate != null) + delegate.characters(ch, start, length); + } + + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException { + if (delegate != null) + delegate.ignorableWhitespace(ch, start, length); + } + + public void processingInstruction (String target, String data) + throws SAXException { + if (delegate != null) + delegate.processingInstruction(target, data); + } + + public void skippedEntity (String name) + throws SAXException { + if (delegate != null) + delegate.skippedEntity(name); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DraconianErrorHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DraconianErrorHandler.java new file mode 100644 index 0000000..10509a1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/DraconianErrorHandler.java @@ -0,0 +1,25 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXParseException; +import org.xml.sax.SAXException; + +/** + * An ErrorHandler implementing a brutal error handling policy. + * Fatal errors and errors are handled by throwing the exception. + * Warnings are ignored. + * + * @author James Clark + */ +public class DraconianErrorHandler implements ErrorHandler { + public void warning(SAXParseException e) throws SAXException { + } + + public void error(SAXParseException e) throws SAXException { + throw e; + } + + public void fatalError(SAXParseException e) throws SAXException { + throw e; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ErrorHandlerImpl.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ErrorHandlerImpl.java new file mode 100644 index 0000000..d9a41e4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ErrorHandlerImpl.java @@ -0,0 +1,149 @@ +package com.thaiopensource.xml.sax; + +import java.util.ResourceBundle; +import java.text.MessageFormat; +import java.io.PrintWriter; +import java.io.Writer; +import java.io.OutputStream; +import java.io.FileNotFoundException; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXParseException; +import org.xml.sax.SAXException; +import com.thaiopensource.util.UriOrFile; + +public class ErrorHandlerImpl implements ErrorHandler { + private final PrintWriter err; + + private final String bundleName + = "com.thaiopensource.xml.sax.resources.Messages"; + + private ResourceBundle bundle = null; + + public ErrorHandlerImpl() { + this(System.err); + } + + public ErrorHandlerImpl(OutputStream os) { + this.err = new PrintWriter(os); + } + + public ErrorHandlerImpl(Writer w) { + this.err = new PrintWriter(w); + } + + public void close() { + err.close(); + } + + private String getString(String key) { + if (bundle == null) + bundle = ResourceBundle.getBundle(bundleName); + return bundle.getString(key); + } + + private String format(String key, Object[] args) { + return MessageFormat.format(getString(key), args); + } + + public void warning(SAXParseException e) throws SAXParseException { + print(format("warning", + new Object[] { formatMessage(e), formatLocation(e) })); + } + + public void error(SAXParseException e) { + print(format("error", + new Object[] { formatMessage(e), formatLocation(e) })); + } + + public void fatalError(SAXParseException e) throws SAXParseException { + throw e; + } + + public void printException(Throwable e) { + String loc; + if (e instanceof SAXParseException) + loc = formatLocation((SAXParseException)e); + else + loc = ""; + String message; + if (e instanceof SAXException) + message = formatMessage((SAXException)e); + else + message = formatMessage(e); + print(format("fatal", new Object[] { message, loc })); + } + + public void print(String message) { + if (message.length() != 0) { + err.println(message); + err.flush(); + } + } + + private String formatLocation(SAXParseException e) { + String systemId = e.getSystemId(); + int n = e.getLineNumber(); + Integer lineNumber = n >= 0 ? new Integer(n) : null; + n = e.getColumnNumber(); + Integer columnNumber = n >= 0 ? new Integer(n) : null; + if (systemId != null) { + systemId = UriOrFile.uriToUriOrFile(systemId); + if (lineNumber != null) { + if (columnNumber != null) + return format("locator_system_id_line_number_column_number", + new Object[] { systemId, lineNumber, columnNumber }); + else + return format("locator_system_id_line_number", + new Object[] { systemId, lineNumber }); + } + else + return format("locator_system_id", + new Object[] { systemId }); + } + else if (lineNumber != null) { + if (columnNumber != null) + return format("locator_line_number_column_number", + new Object[] { lineNumber, columnNumber }); + else + return format("locator_line_number", + new Object[] { lineNumber }); + } + else + return ""; + } + + private String formatMessage(SAXException se) { + Exception e = se.getException(); + String detail = se.getMessage(); + if (e != null) { + String detail2 = e.getMessage(); + // Crimson stupidity + if (detail2 == detail || e.getClass().getName().equals(detail)) + return formatMessage(e); + else if (detail2 == null) + return format("exception", + new Object[]{ e.getClass().getName(), detail }); + else + return format("tunnel_exception", + new Object[] { e.getClass().getName(), + detail, + detail2 }); + } + else { + if (detail == null) + detail = getString("no_detail"); + return detail; + } + } + + private String formatMessage(Throwable e) { + String detail = e.getMessage(); + if (detail == null) + detail = getString("no_detail"); + if (e instanceof FileNotFoundException) + return format("file_not_found", new Object[] { detail }); + return format("exception", + new Object[] { e.getClass().getName(), detail }); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkContentHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkContentHandler.java new file mode 100644 index 0000000..c01c5de --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkContentHandler.java @@ -0,0 +1,71 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; + +public class ForkContentHandler implements ContentHandler { + private final ContentHandler ch1; + private final ContentHandler ch2; + + public ForkContentHandler(ContentHandler ch1, ContentHandler ch2) { + this.ch1 = ch1; + this.ch2 = ch2; + } + + public void setDocumentLocator(Locator locator) { + ch1.setDocumentLocator(locator); + ch2.setDocumentLocator(locator); + } + + public void startDocument() throws SAXException { + ch1.startDocument(); + ch2.startDocument(); + } + + public void endDocument() throws SAXException { + ch1.endDocument(); + ch2.endDocument(); + } + + public void startPrefixMapping(String s, String s1) throws SAXException { + ch1.startPrefixMapping(s, s1); + ch2.startPrefixMapping(s, s1); + } + + public void endPrefixMapping(String s) throws SAXException { + ch1.endPrefixMapping(s); + ch2.endPrefixMapping(s); + } + + public void startElement(String s, String s1, String s2, Attributes attributes) throws SAXException { + ch1.startElement(s, s1, s2, attributes); + ch2.startElement(s, s1, s2, attributes); + } + + public void endElement(String s, String s1, String s2) throws SAXException { + ch1.endElement(s, s1, s2); + ch2.endElement(s, s1, s2); + } + + public void characters(char[] chars, int i, int i1) throws SAXException { + ch1.characters(chars, i, i1); + ch2.characters(chars, i, i1); + } + + public void ignorableWhitespace(char[] chars, int i, int i1) throws SAXException { + ch1.ignorableWhitespace(chars, i, i1); + ch2.ignorableWhitespace(chars, i, i1); + } + + public void processingInstruction(String s, String s1) throws SAXException { + ch1.processingInstruction(s, s1); + ch2.processingInstruction(s, s1); + } + + public void skippedEntity(String s) throws SAXException { + ch1.skippedEntity(s); + ch2.skippedEntity(s); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkDTDHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkDTDHandler.java new file mode 100644 index 0000000..1658ffa --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/ForkDTDHandler.java @@ -0,0 +1,31 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.DTDHandler; +import org.xml.sax.SAXException; + +public class ForkDTDHandler implements DTDHandler { + private final DTDHandler dh1; + private final DTDHandler dh2; + + public ForkDTDHandler(DTDHandler dh1, DTDHandler dh2) { + this.dh1 = dh1; + this.dh2 = dh2; + } + + public void notationDecl(String name, + String publicId, + String systemId) + throws SAXException { + dh1.notationDecl(name, publicId, systemId); + dh2.notationDecl(name, publicId, systemId); + } + + public void unparsedEntityDecl(String name, + String publicId, + String systemId, + String notationName) + throws SAXException { + dh1.unparsedEntityDecl(name, publicId, systemId, notationName); + dh2.unparsedEntityDecl(name, publicId, systemId, notationName); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.java new file mode 100644 index 0000000..1e5a128 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Jaxp11XMLReaderCreator.java @@ -0,0 +1,38 @@ +package com.thaiopensource.xml.sax; + +import javax.xml.parsers.SAXParserFactory; +import javax.xml.parsers.ParserConfigurationException; +import org.xml.sax.XMLReader; +import org.xml.sax.SAXException; + +import com.thaiopensource.xml.sax.XMLReaderCreator; + +/** + * An XMLReaderCreator that uses JAXP 1.1 to create XMLReaders. + * An instance of this class is not safe for concurrent access by multiple threads. + * + * @see javax.xml.parsers.SAXParserFactory + * @author James Clark + */ +public class Jaxp11XMLReaderCreator implements XMLReaderCreator { + + private final SAXParserFactory factory; + + /** + * Default constructor. + */ + public Jaxp11XMLReaderCreator() { + factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setValidating(false); + } + + public XMLReader createXMLReader() throws SAXException { + try { + return factory.newSAXParser().getXMLReader(); + } + catch (ParserConfigurationException e) { + throw new SAXException(e); + } + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Sax2XMLReaderCreator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Sax2XMLReaderCreator.java new file mode 100644 index 0000000..b569811 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/Sax2XMLReaderCreator.java @@ -0,0 +1,57 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.helpers.XMLReaderFactory; + +import com.thaiopensource.xml.sax.XMLReaderCreator; + +/** + * An XMLReaderCreator that creates XMLReaders using the SAX2 XMLReaderFactory. + * An instance of this class is safe for concurrent access by multiple threads. + * + * @see org.xml.sax.helpers.XMLReaderFactory + * @author James Clark + */ +public class Sax2XMLReaderCreator implements XMLReaderCreator { + private final String className; + + /** + * Constructs a Sax2XMLReaderCreator that uses system defaults to construct XMLReaders. + */ + public Sax2XMLReaderCreator() { + this.className = null; + } + + /** + * Constructs a Sax2XMLReaderCreator that constructs XMLReaders with the specified + * class name. + * + * @param className the fully-qualified name of the class implementing XMLReader; + * if null equivalent to the no-argument constructor + * + */ + public Sax2XMLReaderCreator(String className) { + this.className = className; + } + + public XMLReader createXMLReader() throws SAXException { + XMLReader xr; + if (className == null) + xr = XMLReaderFactory.createXMLReader(); + else + xr = XMLReaderFactory.createXMLReader(className); + xr.setFeature("http://xml.org/sax/features/namespaces", true); + xr.setFeature("http://xml.org/sax/features/namespace-prefixes", false); + try { + xr.setFeature("http://xml.org/sax/features/validation", false); + } + catch (SAXNotRecognizedException e) { + } + catch (SAXNotSupportedException e) { + } + return xr; + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XMLReaderCreator.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XMLReaderCreator.java new file mode 100644 index 0000000..77b91a3 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XMLReaderCreator.java @@ -0,0 +1,20 @@ +package com.thaiopensource.xml.sax; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** + * A factory for XMLReaders. Thread-safety is determined by each particular + * implementation of this interface. + * + * @author James Clark + */ +public interface XMLReaderCreator { + /** + * Creates a new XMLReader. + * + * @return a new XMLReader; never null + * @throws org.xml.sax.SAXException If an XMLReader cannot be created for any reason + */ + XMLReader createXMLReader() throws SAXException; +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XmlBaseHandler.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XmlBaseHandler.java new file mode 100644 index 0000000..56faed9 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/XmlBaseHandler.java @@ -0,0 +1,58 @@ +package com.thaiopensource.xml.sax; + +import com.thaiopensource.util.Uri; +import org.xml.sax.Locator; + +public class XmlBaseHandler { + private int depth = 0; + private Locator loc; + private Entry stack = null; + + private static class Entry { + private Entry parent; + private String attValue; + private String systemId; + private int depth; + } + + public void setLocator(Locator loc) { + this.loc = loc; + } + + public void startElement() { + ++depth; + } + + public void endElement() { + if (stack != null && stack.depth == depth) + stack = stack.parent; + --depth; + } + + public void xmlBaseAttribute(String value) { + Entry entry = new Entry(); + entry.parent = stack; + stack = entry; + entry.attValue = Uri.escapeDisallowedChars(value); + entry.systemId = getSystemId(); + entry.depth = depth; + } + + private String getSystemId() { + return loc == null ? null : loc.getSystemId(); + } + + public String getBaseUri() { + return getBaseUri1(getSystemId(), stack); + } + + private static String getBaseUri1(String baseUri, Entry stack) { + if (stack == null + || (baseUri != null && !baseUri.equals(stack.systemId))) + return baseUri; + baseUri = stack.attValue; + if (Uri.isAbsolute(baseUri)) + return baseUri; + return Uri.resolve(getBaseUri1(stack.systemId, stack.parent), baseUri); + } +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/resources/Messages.properties b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/resources/Messages.properties new file mode 100644 index 0000000..7f133eb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/sax/resources/Messages.properties @@ -0,0 +1,29 @@ +# first argument is message, second is location +fatal={1}fatal: {0} +# first argument is message, second is location +error={1}error: {0} +# first argument is message, second is location +warning={1}warning: {0} +# constructs string used as second argument of fatal, error, warning +locator_system_id={0}: \ + +# constructs string used as second argument of fatal, error, warning +locator_system_id_line_number={0}:{1,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_system_id_line_number_column_number={0}:{1,number,#}:{2,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_line_number=(unknown file):{0,number,#}: \ + +# constructs string used as second argument of fatal, error, warning +locator_line_number_column_number=(unknown file):{0,number,#}: \ + +# first argument is class name; second argument is detail message +exception=exception "{0}" thrown: {1} +# like "exception" except third argument is original message +tunnel_exception=exception "{0}" thrown: {1}: {2} +# special case for java.io.FileNotFoundException; first argument is detail +file_not_found=file not found: {0} +# when exception has no detail message available +no_detail=(no further details available) diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/EncodingMap.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/EncodingMap.java new file mode 100644 index 0000000..aff6532 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/EncodingMap.java @@ -0,0 +1,37 @@ +package com.thaiopensource.xml.util; + +import java.io.UnsupportedEncodingException; + +public abstract class EncodingMap { + private static final String[] aliases = { + "UTF-8", "UTF8", + "UTF-16", "Unicode", + "UTF-16BE", "UnicodeBigUnmarked", + "UTF-16LE", "UnicodeLittleUnmarked", + "US-ASCII", "ASCII", + "TIS-620", "TIS620" + }; + + static public String getJavaName(String enc) { + try { + "x".getBytes(enc); + } + catch (UnsupportedEncodingException e) { + for (int i = 0; i < aliases.length; i += 2) { + if (enc.equalsIgnoreCase(aliases[i])) { + try { + "x".getBytes(aliases[i + 1]); + return aliases[i + 1]; + } + catch (UnsupportedEncodingException e2) {} + } + } + } + return enc; + } + + static public void main(String[] args) { + System.err.println(getJavaName(args[0])); + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Name.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Name.java new file mode 100644 index 0000000..0d322d8 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Name.java @@ -0,0 +1,35 @@ +package com.thaiopensource.xml.util; + +public final class Name { + final private String namespaceUri; + final private String localName; + final private int hc; + + public Name(String namespaceUri, String localName) { + this.namespaceUri = namespaceUri; + this.localName = localName; + this.hc = namespaceUri.hashCode() ^ localName.hashCode(); + } + + public String getNamespaceUri() { + return namespaceUri; + } + + public String getLocalName() { + return localName; + } + + public boolean equals(Object obj) { + if (!(obj instanceof Name)) + return false; + Name other = (Name)obj; + return (this.hc == other.hc + && this.namespaceUri.equals(other.namespaceUri) + && this.localName.equals(other.localName)); + } + + public int hashCode() { + return hc; + } +} + diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Naming.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Naming.java new file mode 100644 index 0000000..873ffa4 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/Naming.java @@ -0,0 +1,181 @@ +package com.thaiopensource.xml.util; + +public class Naming { + + private Naming() { } + + private static final int CT_NAME = 1; + private static final int CT_NMSTRT = 2; + + private static final String nameStartSingles = + "\u003a\u005f\u0386\u038c\u03da\u03dc\u03de\u03e0\u0559\u06d5\u093d\u09b2" + + "\u0a5e\u0a8d\u0abd\u0ae0\u0b3d\u0b9c\u0cde\u0e30\u0e84\u0e8a\u0e8d\u0ea5" + + "\u0ea7\u0eb0\u0ebd\u1100\u1109\u113c\u113e\u1140\u114c\u114e\u1150\u1159" + + "\u1163\u1165\u1167\u1169\u1175\u119e\u11a8\u11ab\u11ba\u11eb\u11f0\u11f9" + + "\u1f59\u1f5b\u1f5d\u1fbe\u2126\u212e\u3007"; + private static final String nameStartRanges = + "\u0041\u005a\u0061\u007a\u00c0\u00d6\u00d8\u00f6\u00f8\u00ff\u0100\u0131" + + "\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5" + + "\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u0388\u038a\u038e\u03a1\u03a3\u03ce" + + "\u03d0\u03d6\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481" + + "\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9" + + "\u0531\u0556\u0561\u0586\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0641\u064a" + + "\u0671\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06e5\u06e6\u0905\u0939" + + "\u0958\u0961\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b6\u09b9" + + "\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28" + + "\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a72\u0a74" + + "\u0a85\u0a8b\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9" + + "\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39" + + "\u0b5c\u0b5d\u0b5f\u0b61\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a" + + "\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0c05\u0c0c" + + "\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c60\u0c61\u0c85\u0c8c" + + "\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0ce0\u0ce1\u0d05\u0d0c" + + "\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d60\u0d61\u0e01\u0e2e\u0e32\u0e33" + + "\u0e40\u0e45\u0e81\u0e82\u0e87\u0e88\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3" + + "\u0eaa\u0eab\u0ead\u0eae\u0eb2\u0eb3\u0ec0\u0ec4\u0f40\u0f47\u0f49\u0f69" + + "\u10a0\u10c5\u10d0\u10f6\u1102\u1103\u1105\u1107\u110b\u110c\u110e\u1112" + + "\u1154\u1155\u115f\u1161\u116d\u116e\u1172\u1173\u11ae\u11af\u11b7\u11b8" + + "\u11bc\u11c2\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45" + + "\u1f48\u1f4d\u1f50\u1f57\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fc2\u1fc4" + + "\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc" + + "\u212a\u212b\u2180\u2182\u3041\u3094\u30a1\u30fa\u3105\u312c\uac00\ud7a3" + + "\u4e00\u9fa5\u3021\u3029"; + private static final String nameSingles = + "\u002d\u002e\u05bf\u05c4\u0670\u093c\u094d\u09bc\u09be\u09bf\u09d7\u0a02" + + "\u0a3c\u0a3e\u0a3f\u0abc\u0b3c\u0bd7\u0d57\u0e31\u0eb1\u0f35\u0f37\u0f39" + + "\u0f3e\u0f3f\u0f97\u0fb9\u20e1\u3099\u309a\u00b7\u02d0\u02d1\u0387\u0640" + + "\u0e46\u0ec6\u3005"; + private static final String nameRanges = + "\u0300\u0345\u0360\u0361\u0483\u0486\u0591\u05a1\u05a3\u05b9\u05bb\u05bd" + + "\u05c1\u05c2\u064b\u0652\u06d6\u06dc\u06dd\u06df\u06e0\u06e4\u06e7\u06e8" + + "\u06ea\u06ed\u0901\u0903\u093e\u094c\u0951\u0954\u0962\u0963\u0981\u0983" + + "\u09c0\u09c4\u09c7\u09c8\u09cb\u09cd\u09e2\u09e3\u0a40\u0a42\u0a47\u0a48" + + "\u0a4b\u0a4d\u0a70\u0a71\u0a81\u0a83\u0abe\u0ac5\u0ac7\u0ac9\u0acb\u0acd" + + "\u0b01\u0b03\u0b3e\u0b43\u0b47\u0b48\u0b4b\u0b4d\u0b56\u0b57\u0b82\u0b83" + + "\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd\u0c01\u0c03\u0c3e\u0c44\u0c46\u0c48" + + "\u0c4a\u0c4d\u0c55\u0c56\u0c82\u0c83\u0cbe\u0cc4\u0cc6\u0cc8\u0cca\u0ccd" + + "\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d43\u0d46\u0d48\u0d4a\u0d4d\u0e34\u0e3a" + + "\u0e47\u0e4e\u0eb4\u0eb9\u0ebb\u0ebc\u0ec8\u0ecd\u0f18\u0f19\u0f71\u0f84" + + "\u0f86\u0f8b\u0f90\u0f95\u0f99\u0fad\u0fb1\u0fb7\u20d0\u20dc\u302a\u302f" + + "\u0030\u0039\u0660\u0669\u06f0\u06f9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f" + + "\u0ae6\u0aef\u0b66\u0b6f\u0be7\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f" + + "\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u3031\u3035\u309d\u309e\u30fc\u30fe"; + + private final static byte[][] charTypeTable; + + static { + charTypeTable = new byte[256][]; + for (int i = 0; i < nameSingles.length(); i++) + setCharType(nameSingles.charAt(i), CT_NAME); + for (int i = 0; i < nameRanges.length(); i += 2) + setCharType(nameRanges.charAt(i), nameRanges.charAt(i + 1), CT_NAME); + for (int i = 0; i < nameStartSingles.length(); i++) + setCharType(nameStartSingles.charAt(i), CT_NMSTRT); + for (int i = 0; i < nameStartRanges.length(); i += 2) + setCharType(nameStartRanges.charAt(i), nameStartRanges.charAt(i + 1), + CT_NMSTRT); + byte[] other = new byte[256]; + for (int i = 0; i < 256; i++) + if (charTypeTable[i] == null) + charTypeTable[i] = other; + } + + private static void setCharType(char c, int type) { + int hi = c >> 8; + if (charTypeTable[hi] == null) + charTypeTable[hi] = new byte[256]; + charTypeTable[hi][c & 0xFF] = (byte)type; + } + + private static void setCharType(char min, char max, int type) { + byte[] shared = null; + do { + if ((min & 0xFF) == 0) { + for (; min + 0xFF <= max; min += 0x100) { + if (shared == null) { + shared = new byte[256]; + for (int i = 0; i < 256; i++) + shared[i] = (byte)type; + } + charTypeTable[min >> 8] = shared; + if (min + 0xFF == max) + return; + } + } + setCharType(min, type); + } while (min++ != max); + } + + private static boolean isNameStartChar(char c) { + return charTypeTable[c >> 8][c & 0xff] == CT_NMSTRT; + } + + private static boolean isNameStartCharNs(char c) { + return isNameStartChar(c) && c != ':'; + } + + private static boolean isNameChar(char c) { + return charTypeTable[c >> 8][c & 0xff] != 0; + } + + private static boolean isNameCharNs(char c) { + return isNameChar(c) && c != ':'; + } + + public static boolean isName(String s) { + int len = s.length(); + if (len == 0) + return false; + if (!isNameStartChar(s.charAt(0))) + return false; + for (int i = 1; i < len; i++) + if (!isNameChar(s.charAt(i))) + return false; + return true; + } + + public static boolean isNmtoken(String s) { + int len = s.length(); + if (len == 0) + return false; + for (int i = 0; i < len; i++) + if (!isNameChar(s.charAt(i))) + return false; + return true; + } + + public static boolean isNcname(String s) { + int len = s.length(); + if (len == 0) + return false; + if (!isNameStartCharNs(s.charAt(0))) + return false; + for (int i = 1; i < len; i++) + if (!isNameCharNs(s.charAt(i))) + return false; + return true; + } + + public static boolean isQname(String s) { + int len = s.length(); + if (len == 0) + return false; + if (!isNameStartCharNs(s.charAt(0))) + return false; + for (int i = 1; i < len; i++) { + char c = s.charAt(i); + if (!isNameChar(c)) { + if (c == ':' && ++i < len && isNameStartCharNs(s.charAt(i))) { + for (++i; i < len; i++) + if (!isNameCharNs(s.charAt(i))) + return false; + return true; + } + return false; + } + } + return true; + } + + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/StringSplitter.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/StringSplitter.java new file mode 100644 index 0000000..80a693b --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/StringSplitter.java @@ -0,0 +1,42 @@ +package com.thaiopensource.xml.util; + +public class StringSplitter { + private StringSplitter() { + } + + public static String[] split(String str) { + int len = str.length(); + int nTokens = 0; + for (int i = 0; i < len; i++) + if (!isSpace(str.charAt(i)) && (i == 0 || isSpace(str.charAt(i - 1)))) + nTokens++; + String[] tokens = new String[nTokens]; + nTokens = 0; + int tokenStart = -1; + for (int i = 0; i < len; i++) { + if (isSpace(str.charAt(i))) { + if (tokenStart >= 0) { + tokens[nTokens++] = str.substring(tokenStart, i); + tokenStart = -1; + } + } + else if (i == 0 || isSpace(str.charAt(i - 1))) + tokenStart = i; + } + if (tokenStart >= 0) + tokens[nTokens] = str.substring(tokenStart, len); + return tokens; + } + + private static boolean isSpace(char c) { + switch (c) { + case ' ': + case '\r': + case '\n': + case '\t': + return true; + } + return false; + } + +} diff --git a/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/WellKnownNamespaces.java b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/WellKnownNamespaces.java new file mode 100644 index 0000000..b66ceac --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/com/thaiopensource/xml/util/WellKnownNamespaces.java @@ -0,0 +1,16 @@ +package com.thaiopensource.xml.util; + +public class WellKnownNamespaces { + static public final String XML = "http://www.w3.org/XML/1998/namespace"; + static public final String XMLNS = "http://www.w3.org/2000/xmlns"; + static public final String XML_SCHEMA_DATATYPES = "http://www.w3.org/2001/XMLSchema-datatypes"; + static public final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; + static public final String RELAX_NG_COMPATIBILITY_DATATYPES = "http://relaxng.org/ns/compatibility/datatypes/1.0"; + static public final String RELAX_NG = "http://relaxng.org/ns/structure/1.0"; + static public final String RELAX_NG_0_9 = "http://relaxng.org/ns/structure/0.9"; + static public final String RELAX_NG_COMPATIBILITY_ANNOTATIONS = "http://relaxng.org/ns/compatibility/annotations/1.0"; + + private WellKnownNamespaces() { + } + +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/Datatype.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/Datatype.java new file mode 100644 index 0000000..750975c --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/Datatype.java @@ -0,0 +1,237 @@ +package org.relaxng.datatype; + +/** + * Datatype object. + * + * This object has the following functionality: + * + *
    + *
  1. functionality to identify a class of character sequences. This is + * done through the isValid method. + * + *
  2. functionality to produce a "value object" from a character sequence and + * context information. + * + *
  3. functionality to test the equality of two value objects. + *
+ * + * This interface also defines the createStreamingValidator method, + * which is intended to efficiently support the validation of + * large character sequences. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface Datatype { + + /** + * Checks if the specified 'literal' matches this Datatype + * with respect to the current context. + * + * @param literal + * the lexical representation to be checked. + * @param context + * If this datatype is context-dependent + * (i.e. the {@link #isContextDependent} method returns true), + * then the caller must provide a non-null valid context object. + * Otherwise, the caller can pass null. + * + * @return + * true if the 'literal' is a member of this Datatype; + * false if it's not a member of this Datatype. + */ + boolean isValid( String literal, ValidationContext context ); + + /** + * Similar to the isValid method but throws an exception with diagnosis + * in case of errors. + * + *

+ * If the specified 'literal' is a valid lexical representation for this + * datatype, then this method must return without throwing any exception. + * If not, the callee must throw an exception (with diagnosis message, + * if possible.) + * + *

+ * The application can use this method to provide detailed error message + * to users. This method is kept separate from the isValid method to + * achieve higher performance during normal validation. + * + * @exception DatatypeException + * If the given literal is invalid, then this exception is thrown. + * If the callee supports error diagnosis, then the exception should + * contain a diagnosis message. + */ + void checkValid( String literal, ValidationContext context ) + throws DatatypeException; + + /** + * Creates an instance of a streaming validator for this type. + * + *

+ * By using streaming validators instead of the isValid method, + * the caller can avoid keeping the entire string, which is + * sometimes quite big, in memory. + * + * @param context + * If this datatype is context-dependent + * (i.e. the {@link #isContextDependent} method returns true), + * then the caller must provide a non-null valid context object. + * Otherwise, the caller can pass null. + * The callee may keep a reference to this context object + * only while the returned streaming validator is being used. + */ + DatatypeStreamingValidator createStreamingValidator( ValidationContext context ); + + /** + * Converts lexcial value and the current context to the corresponding + * value object. + * + *

+ * The caller cannot generally assume that the value object is + * a meaningful Java object. For example, the caller cannot expect + * this method to return java.lang.Number type for + * the "integer" type of XML Schema Part 2. + * + *

+ * Also, the caller cannot assume that the equals method and + * the hashCode method of the value object are consistent with + * the semantics of the datatype. For that purpose, the sameValue + * method and the valueHashCode method have to be used. Note that + * this means you cannot use classes like + * java.util.Hashtable to store the value objects. + * + *

+ * The returned value object should be used solely for the sameValue + * and valueHashCode methods. + * + * @param context + * If this datatype is context-dependent + * (when the {@link #isContextDependent} method returns true), + * then the caller must provide a non-null valid context object. + * Otherwise, the caller can pass null. + * + * @return null + * when the given lexical value is not a valid lexical + * value for this type. + */ + Object createValue( String literal, ValidationContext context ); + + /** + * Tests the equality of two value objects which were originally + * created by the createValue method of this object. + * + * The behavior is undefined if objects not created by this type + * are passed. It is the caller's responsibility to ensure that + * value objects belong to this type. + * + * @return + * true if two value objects are considered equal according to + * the definition of this datatype; false if otherwise. + */ + boolean sameValue( Object value1, Object value2 ); + + + /** + * Computes the hash code for a value object, + * which is consistent with the sameValue method. + * + * @return + * hash code for the specified value object. + */ + int valueHashCode( Object value ); + + + + + /** + * Indicates that the datatype doesn't have ID/IDREF semantics. + * + * This value is one of the possible return values of the + * {@link #getIdType} method. + */ + public static final int ID_TYPE_NULL = 0; + + /** + * Indicates that RELAX NG compatibility processors should + * treat this datatype as having ID semantics. + * + * This value is one of the possible return values of the + * {@link #getIdType} method. + */ + public static final int ID_TYPE_ID = 1; + + /** + * Indicates that RELAX NG compatibility processors should + * treat this datatype as having IDREF semantics. + * + * This value is one of the possible return values of the + * {@link #getIdType} method. + */ + public static final int ID_TYPE_IDREF = 2; + + /** + * Indicates that RELAX NG compatibility processors should + * treat this datatype as having IDREFS semantics. + * + * This value is one of the possible return values of the + * {@link #getIdType} method. + */ + public static final int ID_TYPE_IDREFS = 3; + + /** + * Checks if the ID/IDREF semantics is associated with this + * datatype. + * + *

+ * This method is introduced to support the RELAX NG DTD + * compatibility spec. (Of course it's always free to use + * this method for other purposes.) + * + *

+ * If you are implementing a datatype library and have no idea about + * the "RELAX NG DTD compatibility" thing, just return + * ID_TYPE_NULL is fine. + * + * @return + * If this datatype doesn't have any ID/IDREF semantics, + * it returns {@link #ID_TYPE_NULL}. If it has such a semantics + * (for example, XSD:ID, XSD:IDREF and comp:ID type), then + * it returns {@link #ID_TYPE_ID}, {@link #ID_TYPE_IDREF} or + * {@link #ID_TYPE_IDREFS}. + */ + public int getIdType(); + + + /** + * Checks if this datatype may need a context object for + * the validation. + * + *

+ * The callee must return true even when the context + * is not always necessary. (For example, the "QName" type + * doesn't need a context object when validating unprefixed + * string. But nonetheless QName must return true.) + * + *

+ * XSD's string and short types + * are examples of context-independent datatypes. + * Its QName and ENTITY types + * are examples of context-dependent datatypes. + * + *

+ * When a datatype is context-independent, then + * the {@link #isValid} method, the {@link #checkValid} method, + * the {@link #createStreamingValidator} method and + * the {@link #createValue} method can be called without + * providing a context object. + * + * @return + * true if this datatype is context-dependent + * (it needs a context object sometimes); + * + * false if this datatype is context-independent + * (it never needs a context object). + */ + public boolean isContextDependent(); +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeBuilder.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeBuilder.java new file mode 100644 index 0000000..b9a612f --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeBuilder.java @@ -0,0 +1,45 @@ +package org.relaxng.datatype; + +/** + * Creates a user-defined type by adding parameters to + * the pre-defined type. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface DatatypeBuilder { + + /** + * Adds a new parameter. + * + * @param name + * The name of the parameter to be added. + * @param strValue + * The raw value of the parameter. Caller may not normalize + * this value because any white space is potentially significant. + * @param context + * The context information which can be used by the callee to + * acquire additional information. This context object is + * valid only during this method call. The callee may not + * keep a reference to this object. + * @exception DatatypeException + * When the given parameter is inappropriate for some reason. + * The callee is responsible to recover from this error. + * That is, the object should behave as if no such error + * was occured. + */ + void addParameter( String name, String strValue, ValidationContext context ) + throws DatatypeException; + + /** + * Derives a new Datatype from a Datatype by parameters that + * were already set through the addParameter method. + * + * @exception DatatypeException + * DatatypeException must be thrown if the derivation is + * somehow invalid. For example, a required parameter is missing, + * etc. The exception should contain a diagnosis message + * if possible. + */ + Datatype createDatatype() throws DatatypeException; +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeException.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeException.java new file mode 100644 index 0000000..d32ffe7 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeException.java @@ -0,0 +1,39 @@ +package org.relaxng.datatype; + +/** + * Signals Datatype related exceptions. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public class DatatypeException extends Exception { + + public DatatypeException( int index, String msg ) { + super(msg); + this.index = index; + } + public DatatypeException( String msg ) { + this(UNKNOWN,msg); + } + /** + * A constructor for those datatype libraries which don't support any + * diagnostic information at all. + */ + public DatatypeException() { + this(UNKNOWN,null); + } + + + private final int index; + + public static final int UNKNOWN = -1; + + /** + * Gets the index of the content where the error occured. + * UNKNOWN can be returned to indicate that no index information + * is available. + */ + public int getIndex() { + return index; + } +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibrary.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibrary.java new file mode 100644 index 0000000..95b40fb --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibrary.java @@ -0,0 +1,37 @@ +package org.relaxng.datatype; + +/** + * A Datatype library + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface DatatypeLibrary { + + /** + * Creates a new instance of DatatypeBuilder. + * + * The callee should throw a DatatypeException in case of an error. + * + * @param baseTypeLocalName + * The local name of the base type. + * + * @return + * A non-null valid datatype object. + */ + DatatypeBuilder createDatatypeBuilder( String baseTypeLocalName ) + throws DatatypeException; + + /** + * Gets or creates a pre-defined type. + * + * This is just a short-cut of + * createDatatypeBuilder(typeLocalName).createDatatype(); + * + * The callee should throw a DatatypeException in case of an error. + * + * @return + * A non-null valid datatype object. + */ + Datatype createDatatype( String typeLocalName ) throws DatatypeException; +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibraryFactory.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibraryFactory.java new file mode 100644 index 0000000..e488950 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeLibraryFactory.java @@ -0,0 +1,26 @@ +package org.relaxng.datatype; + +/** + * Factory class for the DatatypeLibrary class. + * + *

+ * The datatype library should provide the implementation of + * this interface if it wants to be found by the schema processors. + * The implementor also have to place a file in your jar file. + * See the reference datatype library implementation for detail. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface DatatypeLibraryFactory +{ + /** + * Creates a new instance of a DatatypeLibrary that supports + * the specified namespace URI. + * + * @return + * null if the specified namespace URI is not + * supported. + */ + DatatypeLibrary createDatatypeLibrary( String namespaceURI ); +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeStreamingValidator.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeStreamingValidator.java new file mode 100644 index 0000000..68fa4b1 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/DatatypeStreamingValidator.java @@ -0,0 +1,46 @@ +package org.relaxng.datatype; + +/** + * Datatype streaming validator. + * + *

+ * The streaming validator is an optional feature that is useful for + * certain Datatypes. It allows the caller to incrementally provide + * the literal. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface DatatypeStreamingValidator { + + /** + * Passes an additional fragment of the literal. + * + *

+ * The application can call this method several times, then call + * the isValid method (or the checkValid method) to check the validity + * of the accumulated characters. + */ + void addCharacters( char[] buf, int start, int len ); + + /** + * Tells if the accumulated literal is valid with respect to + * the underlying Datatype. + * + * @return + * True if it is valid. False if otherwise. + */ + boolean isValid(); + + /** + * Similar to the isValid method, but this method throws + * Exception (with possibly diagnostic information), instead of + * returning false. + * + * @exception DatatypeException + * If the callee supports the diagnosis and the accumulated + * literal is invalid, then this exception that possibly + * contains diagnosis information is thrown. + */ + void checkValid() throws DatatypeException; +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/ValidationContext.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/ValidationContext.java new file mode 100644 index 0000000..1dae0fd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/ValidationContext.java @@ -0,0 +1,66 @@ +package org.relaxng.datatype; + +/** + * An interface that must be implemented by caller to + * provide context information that is necessary to + * perform validation of some Datatypes. + * + * @author James Clark + * @author Kohsuke KAWAGUCHI + */ +public interface ValidationContext { + + /** + * Resolves a namespace prefix to the corresponding namespace URI. + * + * This method is used for validating the QName type, for example. + * + *

+ * If the prefix is "" (empty string), it indicates + * an unprefixed value. The callee + * should resolve it as for an unprefixed + * element, rather than for an unprefixed attribute. + * + *

+ * If the prefix is "xml", then the callee must resolve + * this prefix into "http://www.w3.org/XML/1998/namespace", + * as defined in the XML Namespaces Recommendation. + * + * @return + * namespace URI of this prefix. + * If the specified prefix is not declared, + * the implementation must return null. + */ + String resolveNamespacePrefix( String prefix ); + + /** + * Returns the base URI of the context. The null string may be returned + * if no base URI is known. + */ + String getBaseUri(); + + /** + * Checks if an unparsed entity is declared with the + * specified name. + * + * @return + * true + * if the DTD has an unparsed entity declaration for + * the specified name. + * false + * otherwise. + */ + boolean isUnparsedEntity( String entityName ); + + /** + * Checks if a notation is declared with the + * specified name. + * + * @return + * true + * if the DTD has a notation declaration for the specified name. + * false + * otherwise. + */ + boolean isNotation( String notationName ); +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java new file mode 100644 index 0000000..18fdee0 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java @@ -0,0 +1,267 @@ +/** + * Copyright (c) 2001, Thai Open Source Software Center Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Thai Open Source Software Center Ltd nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.relaxng.datatype.helpers; + +import org.relaxng.datatype.DatatypeLibraryFactory; +import org.relaxng.datatype.DatatypeLibrary; +import java.util.Enumeration; +import java.util.NoSuchElementException; +import java.util.Vector; +import java.io.Reader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URL; + +/** + * Discovers the datatype library implementation from the classpath. + * + *

+ * The call of the createDatatypeLibrary method finds an implementation + * from a given datatype library URI at run-time. + */ +public class DatatypeLibraryLoader implements DatatypeLibraryFactory { + private final Service service = new Service(DatatypeLibraryFactory.class); + + public DatatypeLibrary createDatatypeLibrary(String uri) { + for (Enumeration e = service.getProviders(); + e.hasMoreElements();) { + DatatypeLibraryFactory factory + = (DatatypeLibraryFactory)e.nextElement(); + DatatypeLibrary library = factory.createDatatypeLibrary(uri); + if (library != null) + return library; + } + return null; + } + + private static class Service { + private final Class serviceClass; + private final Enumeration configFiles; + private Enumeration classNames = null; + private final Vector providers = new Vector(); + private Loader loader; + + private class ProviderEnumeration implements Enumeration { + private int nextIndex = 0; + + public boolean hasMoreElements() { + return nextIndex < providers.size() || moreProviders(); + } + + public Object nextElement() { + try { + return providers.elementAt(nextIndex++); + } + catch (ArrayIndexOutOfBoundsException e) { + throw new NoSuchElementException(); + } + } + } + + private static class Singleton implements Enumeration { + private Object obj; + private Singleton(Object obj) { + this.obj = obj; + } + + public boolean hasMoreElements() { + return obj != null; + } + + public Object nextElement() { + if (obj == null) + throw new NoSuchElementException(); + Object tem = obj; + obj = null; + return tem; + } + } + + // JDK 1.1 + private static class Loader { + Enumeration getResources(String resName) { + ClassLoader cl = Loader.class.getClassLoader(); + URL url; + if (cl == null) + url = ClassLoader.getSystemResource(resName); + else + url = cl.getResource(resName); + return new Singleton(url); + } + + Class loadClass(String name) throws ClassNotFoundException { + return Class.forName(name); + } + } + + // JDK 1.2+ + private static class Loader2 extends Loader { + private ClassLoader cl; + + Loader2() { + cl = Loader2.class.getClassLoader(); + // If the thread context class loader has the class loader + // of this class as an ancestor, use the thread context class + // loader. Otherwise, the thread context class loader + // probably hasn't been set up properly, so don't use it. + ClassLoader clt = Thread.currentThread().getContextClassLoader(); + for (ClassLoader tem = clt; tem != null; tem = tem.getParent()) + if (tem == cl) { + cl = clt; + break; + } + } + + Enumeration getResources(String resName) { + try { + Enumeration resources = cl.getResources(resName); + if (resources.hasMoreElements()) + return resources; + // Some application servers apparently do not implement findResources + // in their class loaders, so fall back to getResource. + return new Singleton(cl.getResource(resName)); + } + catch (IOException e) { + return new Singleton(null); + } + } + + Class loadClass(String name) throws ClassNotFoundException { + return Class.forName(name, true, cl); + } + } + + public Service(Class cls) { + try { + loader = new Loader2(); + } + catch (NoSuchMethodError e) { + loader = new Loader(); + } + serviceClass = cls; + String resName = "META-INF/services/" + serviceClass.getName(); + configFiles = loader.getResources(resName); + } + + public Enumeration getProviders() { + return new ProviderEnumeration(); + } + + synchronized private boolean moreProviders() { + for (;;) { + while (classNames == null) { + if (!configFiles.hasMoreElements()) + return false; + classNames = parseConfigFile((URL)configFiles.nextElement()); + } + while (classNames.hasMoreElements()) { + String className = (String)classNames.nextElement(); + try { + Class cls = loader.loadClass(className); + Object obj = cls.newInstance(); + if (serviceClass.isInstance(obj)) { + providers.addElement(obj); + return true; + } + } + catch (ClassNotFoundException e) { } + catch (InstantiationException e) { } + catch (IllegalAccessException e) { } + catch (LinkageError e) { } + } + classNames = null; + } + } + + private static final int START = 0; + private static final int IN_NAME = 1; + private static final int IN_COMMENT = 2; + + private static Enumeration parseConfigFile(URL url) { + try { + InputStream in = url.openStream(); + Reader r; + try { + r = new InputStreamReader(in, "UTF-8"); + } + catch (UnsupportedEncodingException e) { + r = new InputStreamReader(in, "UTF8"); + } + r = new BufferedReader(r); + Vector tokens = new Vector(); + StringBuffer tokenBuf = new StringBuffer(); + int state = START; + for (;;) { + int n = r.read(); + if (n < 0) + break; + char c = (char)n; + switch (c) { + case '\r': + case '\n': + state = START; + break; + case ' ': + case '\t': + break; + case '#': + state = IN_COMMENT; + break; + default: + if (state != IN_COMMENT) { + state = IN_NAME; + tokenBuf.append(c); + } + break; + } + if (tokenBuf.length() != 0 && state != IN_NAME) { + tokens.addElement(tokenBuf.toString()); + tokenBuf.setLength(0); + } + } + if (tokenBuf.length() != 0) + tokens.addElement(tokenBuf.toString()); + return tokens.elements(); + } + catch (IOException e) { + return null; + } + } + } + +} + diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.java new file mode 100644 index 0000000..d915111 --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/ParameterlessDatatypeBuilder.java @@ -0,0 +1,42 @@ +package org.relaxng.datatype.helpers; + +import org.relaxng.datatype.*; + +/** + * Dummy implementation of {@link DatatypeBuilder}. + * + * This implementation can be used for Datatypes which have no parameters. + * Any attempt to add parameters will be rejected. + * + *

+ * Typical usage would be: + *


+ * class MyDatatypeLibrary implements DatatypeLibrary {
+ *     ....
+ *     DatatypeBuilder createDatatypeBuilder( String typeName ) {
+ *         return new ParameterleessDatatypeBuilder(createDatatype(typeName));
+ *     }
+ *     ....
+ * }
+ * 
+ * + * @author Kohsuke KAWAGUCHI + */ +public final class ParameterlessDatatypeBuilder implements DatatypeBuilder { + + /** This type object is returned for the derive method. */ + private final Datatype baseType; + + public ParameterlessDatatypeBuilder( Datatype baseType ) { + this.baseType = baseType; + } + + public void addParameter( String name, String strValue, ValidationContext context ) + throws DatatypeException { + throw new DatatypeException(); + } + + public Datatype createDatatype() throws DatatypeException { + return baseType; + } +} diff --git a/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/StreamingValidatorImpl.java b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/StreamingValidatorImpl.java new file mode 100644 index 0000000..31f2dcd --- /dev/null +++ b/thirdparty/epubcheck/jingsrc/org/relaxng/datatype/helpers/StreamingValidatorImpl.java @@ -0,0 +1,55 @@ +package org.relaxng.datatype.helpers; + +import org.relaxng.datatype.*; + +/** + * Dummy implementation of {@link DatatypeStreamingValidator}. + * + *

+ * This implementation can be used as a quick hack when the performance + * of streaming validation is not important. And this implementation + * also shows you how to implement the DatatypeStreamingValidator interface. + * + *

+ * Typical usage would be: + *


+ * class MyDatatype implements Datatype {
+ *     ....
+ *     public DatatypeStreamingValidator createStreamingValidator( ValidationContext context ) {
+ *         return new StreamingValidatorImpl(this,context);
+ *     }
+ *     ....
+ * }
+ * 
+ * + * @author Kohsuke KAWAGUCHI + */ +public final class StreamingValidatorImpl implements DatatypeStreamingValidator { + + /** This buffer accumulates characters. */ + private final StringBuffer buffer = new StringBuffer(); + + /** Datatype obejct that creates this streaming validator. */ + private final Datatype baseType; + + /** The current context. */ + private final ValidationContext context; + + public void addCharacters( char[] buf, int start, int len ) { + // append characters to the current buffer. + buffer.append(buf,start,len); + } + + public boolean isValid() { + return baseType.isValid(buffer.toString(),context); + } + + public void checkValid() throws DatatypeException { + baseType.checkValid(buffer.toString(),context); + } + + public StreamingValidatorImpl( Datatype baseType, ValidationContext context ) { + this.baseType = baseType; + this.context = context; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/api/EpubCheck.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/api/EpubCheck.java new file mode 100644 index 0000000..c7c2044 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/api/EpubCheck.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package com.adobe.epubcheck.api; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.zip.ZipFile; + +import com.adobe.epubcheck.ocf.OCFChecker; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.util.CheckUtil; +import com.adobe.epubcheck.util.DefaultReportImpl; +import com.adobe.epubcheck.util.WriterReportImpl; + +/** + * Public interface to epub validator. + */ +public class EpubCheck { + /* VERSION number is duplicated in the build.xml and war-build.xml files, so you'll need to change it in two additional places */ + public static final String VERSION = "1.0.5"; + + File epubFile; + + Report userReport; + + public int warningCount; + + public int errorCount; + + static String fixMessage(String message) { + return message.replaceAll("\r\n", " ").replaceAll("\r", " ") + .replaceAll("\n", " "); + } + + class ProxyReport implements Report { + + public void error(String resource, int line, String message) { + errorCount++; + userReport.error(resource, line, fixMessage(message)); + } + + public void warning(String resource, int line, String message) { + warningCount++; + userReport.warning(resource, line, fixMessage(message)); + } + + } + + /* + * Create an epub validator to validate the given file. Issues will be + * reported to standard error. + */ + public EpubCheck(File epubFile) { + this.epubFile = epubFile; + this.userReport = new DefaultReportImpl(epubFile.getName()); + } + + /* + * Create an epub validator to validate the given file. Issues will be + * reported to the given PrintWriter. + */ + public EpubCheck(File epubFile, PrintWriter out) { + this.epubFile = epubFile; + this.userReport = new WriterReportImpl(out); + } + + /* + * Create an epub validator to validate the given file and report issues to + * a given Report object. + */ + public EpubCheck(File epubFile, Report report) { + this.epubFile = epubFile; + this.userReport = report; + } + + /** + * Validate the file. Return true if no errors or warnings found. + */ + public boolean validate() { + Report report = new ProxyReport(); + try { + FileInputStream epubIn = new FileInputStream(epubFile); + + byte[] header = new byte[58]; + + if (epubIn.read(header) != header.length) { + report.error(null, 0, "cannot read header"); + } else { + int fnsize = getIntFromBytes(header, 26); + int extsize = getIntFromBytes(header, 28); + + if (header[0] != 'P' && header[1] != 'K') { + report.error(null, 0, "corrupted ZIP header"); + } else if (fnsize != 8) { + report + .error(null, 0, + "length of first filename in archive must be 8, but was " + fnsize); + } else if (extsize != 0) { + report + .error(null, 0, + "extra field length for first filename must be 0, but was " + extsize); + } else if (!CheckUtil.checkString(header, 30, "mimetype")) { + report + .error(null, 0, + "mimetype entry missing or not the first in archive"); + } else if (!CheckUtil.checkString(header, 38, + "application/epub+zip")) { + report + .error(null, 0, + "mimetype contains wrong type (application/epub+zip expected)"); + } + } + + epubIn.close(); + + ZipFile zip = new ZipFile(epubFile); + + OCFPackage ocf = new OCFPackage(zip); + + OCFChecker checker = new OCFChecker(ocf, report); + + checker.runChecks(); + + zip.close(); + + } catch (IOException e) { + report.error(null, 0, "I/O error: " + e.getMessage()); + } + return warningCount == 0 && errorCount == 0; + } + + private int getIntFromBytes(byte[] bytes, int offset) { + int hi = 0xFF & bytes[offset + 1]; + int lo = 0xFF & bytes[offset + 0]; + return hi << 8 | lo; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/api/Report.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/api/Report.java new file mode 100644 index 0000000..9c9c073 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/api/Report.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.api; + +/** + * Interface that is used to report issues found in epub. + */ +public interface Report { + + + /** + * Called when a violation of the standard is found in epub. + * + * @param resource + * name of the resource in the epub zip container that caused + * error or null if the error is on the container level. + * @param line + * line number in the resource which has caused error (lines + * start with 1), non-positive number if the resource is not text + * or line is not available. + * @param message + * error message. + */ + public void error(String resource, int line, String message); + + /** + * Called when some notable issue is found in epub. + * + * @param resource + * name of the resource in the epub zip container that caused + * warning or null if the error is on the container level. + * @param line + * line number in the resource which has caused warning (lines + * start with 1), non-positive number if the resource is not text + * or line is not available. + * @param message + * warning message. + */ + public void warning(String resource, int line, String message); +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTest.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTest.java new file mode 100644 index 0000000..9663c5d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2008 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.autotest; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + + +/** + * @author Paul Norton + * + */ +public class AutoTest { + + SAXParser parser; + String path; + + public AutoTest(String str) { + this.path = str; + } + + /** + * Parse an xml file + * + * @param uri + * the uri of the file to parse + * @throws IOException + * @throws SAXException + */ + public void parse(String uri) throws IOException, SAXException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + try { + AutoTestContentHandler handler = new AutoTestContentHandler(this.path); + parser = factory.newSAXParser(); + XMLReader reader = parser.getXMLReader(); + reader.setContentHandler(handler); + reader.parse(uri); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } + } + + /** + * @param args + * list of arguments of the program: testfile path_to_testdocs [options] + * + */ + public static void main(String[] args) { + if (args.length != 2) { + System.out.println("Usage : AutoTest testfile testdocs_path"); + System.exit(1); + } + System.out.println("start"); + String uri = args[0]; + String path = args[1]; + + try { + AutoTest parser = new AutoTest(path); + parser.parse(uri); + } catch (Throwable t) { + t.printStackTrace(); + } + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTestContentHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTestContentHandler.java new file mode 100644 index 0000000..5d6ae12 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/AutoTestContentHandler.java @@ -0,0 +1,234 @@ +/* + * Copyright 2008 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.autotest; + +import java.io.File; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +import com.adobe.epubcheck.api.EpubCheck; +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.util.DefaultReportImpl; +import com.adobe.epubcheck.autotest.Result; + +/** + * @author Paul Norton + * + * + */ +public class AutoTestContentHandler implements ContentHandler { + + Report report; + String path; + public static final String TESTSUITE = "testsuite"; + public static final String TEST = "test"; + public static final String TYPE = "type"; + public static final String TITLE = "title"; + public static final String FILE = "file"; + public static final String DESCRIPTION = "description"; + public static final String RESULTTAG = "result"; + public static final String VALIDITY = "valid"; + public static final String ERRORS = "errors"; + public static final String WARNINGS = "warnings"; + + + boolean inFile = false; + boolean inDesc = false; + boolean inErrors = false; + boolean inWarnings = false; + String urlString = ""; + String zipFile = ""; + String desc = ""; + Result expectedResult; + Result result; + int testsRun; + int testsPassed; + + public AutoTestContentHandler(String str) { + this.path = str; + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#characters(char[], int, int) + */ + public void characters(char[] ch, int start, int length) + throws SAXException { + if(inFile) { + zipFile = this.path; + zipFile += new String(ch, start, length).trim(); + } else if(inDesc) { + desc = new String(ch, start, length).trim(); + } else if(inErrors) { + int errors; + try { + errors = Integer.parseInt(new String(ch, start, length)); + } catch (NumberFormatException e) { + errors = 0; + } + expectedResult.setErrors(errors); + } else if(inWarnings) { + int warnings; + try { + warnings = Integer.parseInt(new String(ch, start, length)); + } catch (NumberFormatException e) { + warnings = 0; + } + expectedResult.setWarnings(warnings); + } + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#endDocument() + */ + public void endDocument() throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) + */ + public void endElement(String uri, String localName, String name) + throws SAXException { + if (name.equals(TESTSUITE)) { + System.out.println(); + System.out.println("Tests run:" + testsRun); + System.out.println("Tests passed:" + testsPassed); + } else if (name.equals(TEST)) { + System.out.println(); + System.out.println(zipFile); + Report report = new DefaultReportImpl(zipFile); + EpubCheck check = new EpubCheck(new File(zipFile), report); + result.setValid(check.validate()); + result.setErrors(check.errorCount); + result.setWarnings(check.warningCount); + if (result.isValid() == expectedResult.isValid() + && result.getErrors() == expectedResult.getErrors() + && result.getWarnings() == expectedResult.getWarnings()) { + testsPassed++; + } else { + System.out.println("***********************"); + System.out.println("Test Failed"); + System.out.println("\t"+zipFile); + System.out.println("\t"+desc); + System.out.println("\tExpectedErrors: "+expectedResult.getErrors()); + System.out.println("\tExpectedWarnings: "+expectedResult.getWarnings()); + System.out.println("***********************"); + } + testsRun++; + } else if (name.equals(FILE)) { + inFile = false; + } else if (name.equals(DESCRIPTION)) { + inDesc = false; + } else if (name.equals(WARNINGS)) { + inWarnings = false; + } else if (name.equals(ERRORS)) { + inErrors = false; + } + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String) + */ + public void endPrefixMapping(String prefix) throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) + */ + public void ignorableWhitespace(char[] ch, int start, int length) + throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String) + */ + public void processingInstruction(String target, String data) + throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator) + */ + public void setDocumentLocator(Locator locator) { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) + */ + public void skippedEntity(String name) throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#startDocument() + */ + public void startDocument() throws SAXException { + + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) + */ + public void startElement(String uri, String localName, String name, + Attributes atts) throws SAXException { + if (name.equals(TESTSUITE)) { + testsRun = 0; + testsPassed = 0; + } else if(name.equals(TEST)) { + expectedResult = new Result(); + result = new Result(); + zipFile = ""; + desc = ""; + } else if(name.equals(FILE)) { + inFile = true; + } else if(name.equals(DESCRIPTION)) { + inDesc = true; + } else if(name.equals(RESULTTAG)) { + boolean valid = false; + try { + valid = atts.getValue("", "valid").equals("true"); + } catch (Exception e) {} + expectedResult.setValid(valid); + } else if(name.equals(WARNINGS)) { + inWarnings = true; + } else if(name.equals(ERRORS)) { + inErrors = true; + } + } + + /* (non-Javadoc) + * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String) + */ + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/Result.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/Result.java new file mode 100644 index 0000000..d85bca4 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/autotest/Result.java @@ -0,0 +1,65 @@ +/** + * + */ +package com.adobe.epubcheck.autotest; + +/** + * @author Paul Norton + * + */ +public class Result { + + private boolean valid = true; + + private int errors; + + private int warnings; + + public Result() { + this.errors=0; + this.warnings=0; + } + + /** + * @param errors the errors to set + */ + public void setErrors(int errors) { + this.errors = errors; + } + + /** + * @return the errors + */ + public int getErrors() { + return errors; + } + + /** + * @param warnings the warnings to set + */ + public void setWarnings(int warnings) { + this.warnings = warnings; + } + + /** + * @return the warnings + */ + public int getWarnings() { + return warnings; + } + + /** + * @param valid the valid to set + */ + public void setValid(boolean valid) { + this.valid = valid; + } + + /** + * @return the valid + */ + public boolean isValid() { + return valid; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapChecker.java new file mode 100644 index 0000000..f8b6caf --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapChecker.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.bitmap; + +import java.io.IOException; +import java.io.InputStream; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; + +public class BitmapChecker implements ContentChecker { + + OCFPackage ocf; + + Report report; + + String path; + + String mimeType; + + BitmapChecker(OCFPackage ocf, Report report, String path, String mimeType) { + this.ocf = ocf; + this.report = report; + this.path = path; + this.mimeType = mimeType; + } + + private void checkHeader( byte[] header ) { + boolean passed; + if( mimeType.equals("image/jpeg") ) + passed = header[0] == (byte)0xFF && header[1] == (byte)0xD8; + else if( mimeType.equals("image/gif") ) + passed = header[0] == (byte)'G' && header[1] == (byte)'I' && header[2] == (byte)'F' && header[3] == (byte)'8'; + else if( mimeType.equals("image/png") ) + passed = header[0] == (byte)0x89 && header[1] == (byte)'P' && header[2] == (byte)'N' && header[3] == (byte)'G'; + else + passed = true; + if( ! passed ) + report.error(null, 0, "The file " + path + " does not appear to be of type " + mimeType ); + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "image file " + path + " is missing"); + else if (!ocf.canDecrypt(path)) + report.error(null, 0, "image file " + path + " cannot be decrypted"); + else { + try { + InputStream in = ocf.getInputStream(path); + byte[] header = new byte[4]; + if( in.read(header) != header.length ) { + report.error(null, 0, "image file " + path + " is too short"); + } else { + checkHeader(header); + } + in.close(); + } catch (IOException e) { + report.error(null, 0, "I/O error reading " + path); + } + } + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapCheckerFactory.java new file mode 100644 index 0000000..a80cde8 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/bitmap/BitmapCheckerFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.bitmap; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.ContentCheckerFactory; +import com.adobe.epubcheck.opf.XRefChecker; + +public class BitmapCheckerFactory implements ContentCheckerFactory { + + public ContentChecker newInstance(OCFPackage ocf, Report report, String path, + String mimeType, XRefChecker xrefChecker) { + return new BitmapChecker(ocf, report, path, mimeType); + } + + static private BitmapCheckerFactory instance = new BitmapCheckerFactory(); + + static public BitmapCheckerFactory getInstance() { + return instance; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookChecker.java new file mode 100644 index 0000000..49d3b03 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookChecker.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.dtbook; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.xml.XMLParser; +import com.adobe.epubcheck.xml.XMLValidator; + +public class DTBookChecker implements ContentChecker { + + OCFPackage ocf; + + Report report; + + String path; + + XRefChecker xrefChecker; + + static XMLValidator dtbookValidator = new XMLValidator("rng/dtbook-2005-2.rng"); + + public DTBookChecker(OCFPackage ocf, Report report, String path, XRefChecker xrefChecker) { + this.ocf = ocf; + this.report = report; + this.path = path; + this.xrefChecker = xrefChecker; + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "DTBook file " + path + " is missing"); + else if (!ocf.canDecrypt(path)) + report.error(null, 0, "DTBook file " + path + " cannot be decrypted"); + else { + XMLParser dtbookParser = new XMLParser(ocf, path, report); + dtbookParser.addValidator(dtbookValidator); + DTBookHandler dtbookHandler = new DTBookHandler(dtbookParser, path, xrefChecker); + dtbookParser.addXMLHandler(dtbookHandler); + dtbookParser.process(); + } + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.java new file mode 100644 index 0000000..c11f0ae --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookCheckerFactory.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.dtbook; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.ContentCheckerFactory; +import com.adobe.epubcheck.opf.XRefChecker; + +public class DTBookCheckerFactory implements ContentCheckerFactory { + + public ContentChecker newInstance(OCFPackage ocf, Report report, String path, + String mimeType, XRefChecker xrefChecker) { + return new DTBookChecker( ocf, report, path, xrefChecker ); + } + + static private DTBookCheckerFactory instance = new DTBookCheckerFactory(); + + static public DTBookCheckerFactory getInstance() { + return instance; + } + + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookHandler.java new file mode 100644 index 0000000..80d386d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtbook/DTBookHandler.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.dtbook; + +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.ops.OPSHandler; +import com.adobe.epubcheck.util.PathUtil; +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + + +public class DTBookHandler implements XMLHandler { + + XMLParser parser; + + String path; + + XRefChecker xrefChecker; + + DTBookHandler(XMLParser parser, String path, XRefChecker xrefChecker) { + this.parser = parser; + this.path = path; + this.xrefChecker = xrefChecker; + } + + public void characters(char[] chars, int arg1, int arg2) { + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void startElement() { + XMLElement e = parser.getCurrentElement(); + String ns = e.getNamespace(); + String name = e.getName(); + String id = e.getAttribute("id"); + if (ns.equals("http://www.daisy.org/z3986/2005/dtbook/")) { + //link@href, a@href, img@src + String uri = null; + /* This section checks to see if the references used are registered + * schema-types and whether they point to external resources. The + * resources are only allowed to be external if the attribute + * "external" is set to true. + */ + if (name.equals("a")) { + uri = e.getAttribute("href"); + String external = e.getAttribute("external"); + if (uri != null && external.equals("true")) { + if (OPSHandler.isRegisteredSchemaType(uri)) + uri = null; + else if (uri.indexOf(':') > 0) { + parser.getReport().warning(path, parser.getLineNumber(), + "use of non-registered URI schema type in href: " + uri); + uri = null; + } + } + } else if (name.equals("link")) { + uri = e.getAttribute("href"); + }else if(name.equals("img")) { + uri = e.getAttribute("src"); + } + if (uri != null) { + uri = PathUtil.resolveRelativeReference(path, uri); + xrefChecker.registerReference(path, parser.getLineNumber(), uri, + name.equals("img") ? XRefChecker.RT_IMAGE : XRefChecker.RT_HYPERLINK ); + } + if (id != null) + xrefChecker.registerAnchor(path, parser.getLineNumber(), id, XRefChecker.RT_HYPERLINK); + + } + } + + public void endElement() { + } + + public void processingInstruction(String arg0, String arg1) { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/dtbook-2005-2.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/dtbook-2005-2.dtd new file mode 100644 index 0000000..72b26d3 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/dtbook-2005-2.dtd @@ -0,0 +1,2824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/ncx-2005-1.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/ncx-2005-1.dtd new file mode 100644 index 0000000..441b2cc --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/ncx-2005-1.dtd @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/oeb12.dtdinc b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/oeb12.dtdinc new file mode 100644 index 0000000..f2e4af6 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/oeb12.dtdinc @@ -0,0 +1,1136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/opf20.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/opf20.dtd new file mode 100644 index 0000000..72207eb --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/opf20.dtd @@ -0,0 +1,296 @@ + + + + + + +%OEBEntities; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/svg11.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/svg11.dtd new file mode 100644 index 0000000..30f87e8 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/svg11.dtd @@ -0,0 +1,5790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + +]]> + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + + + + + +]]> + + + +]]> + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + +]]> + + +]]> + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc new file mode 100644 index 0000000..7b7b407 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-lat1.dtdinc @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-special.dtdinc b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-special.dtdinc new file mode 100644 index 0000000..2ea205f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-special.dtdinc @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc new file mode 100644 index 0000000..3f8f8e6 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml-symbol.dtdinc @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-strict.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-strict.dtd new file mode 100644 index 0000000..8126d7e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-strict.dtd @@ -0,0 +1,979 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd new file mode 100644 index 0000000..59e6770 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/dtd/xhtml1-transitional.dtd @@ -0,0 +1,1200 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXChecker.java new file mode 100644 index 0000000..6172a8f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXChecker.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ncx; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.xml.XMLParser; +import com.adobe.epubcheck.xml.XMLValidator; + +public class NCXChecker implements ContentChecker { + + OCFPackage ocf; + + Report report; + + String path; + + XRefChecker xrefChecker; + + static XMLValidator ncxValidator = new XMLValidator("rng/ncx.rng"); + + static XMLValidator ncxSchematronValidator = new XMLValidator("sch/ncx.sch"); + + public NCXChecker(OCFPackage ocf, Report report, String path, + XRefChecker xrefChecker) { + this.ocf = ocf; + this.report = report; + this.path = path; + this.xrefChecker = xrefChecker; + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "NCX file " + path + " is missing"); + else if (!ocf.canDecrypt(path)) + report.error(null, 0, "NCX file " + path + " cannot be decrypted"); + else { + // relaxng + XMLParser ncxParser = new XMLParser(ocf, path, report); + ncxParser.addValidator(ncxValidator); + NCXHandler ncxHandler = new NCXHandler(ncxParser, path, xrefChecker); + ncxParser.addXMLHandler(ncxHandler); + ncxParser.process(); + + // schematron needs to go in a separate step, because of the catch + // below + // TODO: do it in a single step + try { + ncxParser = new XMLParser(ocf, path, report); + ncxParser.addValidator(ncxSchematronValidator); + ncxHandler = new NCXHandler(ncxParser, path, xrefChecker); + ncxParser.process(); + } catch (Throwable t) { + report.error(path, -1, + "Failed performing NCX Schematron tests: " + + t.getMessage()); + } + } + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXCheckerFactory.java new file mode 100644 index 0000000..01f1957 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXCheckerFactory.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ncx; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.ContentCheckerFactory; +import com.adobe.epubcheck.opf.XRefChecker; + +public class NCXCheckerFactory implements ContentCheckerFactory { + + public ContentChecker newInstance(OCFPackage ocf, Report report, String path, + String mimeType, XRefChecker xrefChecker) { + return new NCXChecker( ocf, report, path, xrefChecker ); + } + + static private NCXCheckerFactory instance = new NCXCheckerFactory(); + + static public NCXCheckerFactory getInstance() { + return instance; + } + + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXHandler.java new file mode 100644 index 0000000..0d9fec3 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ncx/NCXHandler.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ncx; + +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.util.PathUtil; +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + +public class NCXHandler implements XMLHandler { + + XMLParser parser; + + String path; + + XRefChecker xrefChecker; + + NCXHandler(XMLParser parser, String path, XRefChecker xrefChecker) { + this.parser = parser; + this.path = path; + this.xrefChecker = xrefChecker; + } + + public void characters(char[] chars, int arg1, int arg2) { + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void startElement() { + XMLElement e = parser.getCurrentElement(); + String ns = e.getNamespace(); + String name = e.getName(); + if (ns.equals("http://www.daisy.org/z3986/2005/ncx/")) { + if (name.equals("content")) { + String href = e.getAttribute("src"); + if (href != null) { + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_HYPERLINK); + } + + } + } + } + + public void endElement() { + } + + public void processingInstruction(String arg0, String arg1) { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionFilter.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionFilter.java new file mode 100644 index 0000000..90ed99e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionFilter.java @@ -0,0 +1,10 @@ +package com.adobe.epubcheck.ocf; + +import java.io.InputStream; + +public interface EncryptionFilter { + + public boolean canDecrypt(); + + public InputStream decrypt(InputStream in); +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionHandler.java new file mode 100644 index 0000000..785c6ab --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/EncryptionHandler.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ocf; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + +public class EncryptionHandler implements XMLHandler { + + OCFPackage ocf; + + XMLParser parser; + + EncryptionHandler(XMLParser parser, OCFPackage ocf) { + this.parser = parser; + this.ocf = ocf; + } + + public void startElement() { + XMLElement e = parser.getCurrentElement(); + // if the element is , then the element name + // is stripped of rootBase, and URLDecoded, and finally put into + // encryptedItemsSet. + if (e.getName().equals("CipherReference")) { + String algorithm = null; + XMLElement parent = e.getParent(); + if (parent != null) { + parent = parent.getParent(); + if (parent != null && parent.getName().equals("EncryptedData")) + algorithm = (String) parent.getPrivateData(); + } + String entryName = e.getAttribute("URI"); + try { + entryName = URLDecoder.decode(entryName, "UTF-8"); + } catch (UnsupportedEncodingException er) { + // UTF-8 is guaranteed to be supported + throw new InternalError(e.toString()); + } + if (algorithm == null) + algorithm = "unknown"; + if (algorithm.equals("http://www.idpf.org/2008/embedding")) + ocf.setEncryption(entryName, new IDPFFontManglingFilter(ocf)); + else + ocf.setEncryption(entryName, new UnsupportedEncryptionFilter()); + } else if (e.getName().equals("EncryptionMethod")) { + String algorithm = e.getAttribute("Algorithm"); + if (algorithm != null) { + XMLElement parent = e.getParent(); + if (parent != null) { + String comp = parent.getAttributeNS( + "http://ns.adobe.com/digitaleditions/enc", + "compression"); + if (comp == null) + parent.setPrivateData(algorithm); + } + } + } + } + + public void endElement() { + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void characters(char[] chars, int arg1, int arg2) { + } + + public void processingInstruction(String arg0, String arg1) { + } + +} \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.java new file mode 100644 index 0000000..be432b2 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/IDPFFontManglingFilter.java @@ -0,0 +1,22 @@ +package com.adobe.epubcheck.ocf; + +import java.io.InputStream; + +public class IDPFFontManglingFilter implements EncryptionFilter { + + OCFPackage ocf; + + public IDPFFontManglingFilter( OCFPackage ocf ) { + this.ocf = ocf; + } + + public boolean canDecrypt() { + return ocf.getUniqueIdentifier() != null; + } + + public InputStream decrypt(InputStream in) { + // TODO implement this once we start to validate fonts + return null; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFChecker.java new file mode 100644 index 0000000..10b852a --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFChecker.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ocf; + +import java.util.Hashtable; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.opf.OPFChecker; +import com.adobe.epubcheck.xml.XMLParser; +import com.adobe.epubcheck.xml.XMLValidator; + +public class OCFChecker { + + OCFPackage ocf; + + Report report; + + Hashtable encryptedItems; + + static XMLValidator containerValidator = new XMLValidator( + "rng/container.rng"); + + static XMLValidator encryptionValidator = new XMLValidator( + "rng/encryption.rng"); + + static XMLValidator signatureValidator = new XMLValidator( + "rng/signatures.rng"); + + public OCFChecker(OCFPackage ocf, Report report) { + this.ocf = ocf; + this.report = report; + } + + public void runChecks() { + + String rootPath; + + // Validate container.xml + String containerEntry = "META-INF/container.xml"; + if (!ocf.hasEntry(containerEntry)) { + report.error(null, 0, + "Required META-INF/container.xml resource is missing"); + return; + } + XMLParser containerParser = new XMLParser(ocf, containerEntry, report); + OCFHandler containerHandler = new OCFHandler(containerParser); + containerParser.addXMLHandler(containerHandler); + containerParser.addValidator(containerValidator); + containerParser.process(); + rootPath = containerHandler.getRootPath(); + + // Validate encryption.xml + String encryptionEntry = "META-INF/encryption.xml"; + if (ocf.hasEntry(encryptionEntry)) { + XMLParser encryptionParser = new XMLParser(ocf, encryptionEntry, + report); + EncryptionHandler encryptionHandler = new EncryptionHandler( + encryptionParser, ocf); + + encryptionParser.addXMLHandler(encryptionHandler); + encryptionParser.addValidator(encryptionValidator); + encryptionParser.process(); + } + + // Validate signatures.xml + String signatureEntry = "META-INF/signatures.xml"; + if (ocf.hasEntry(signatureEntry)) { + XMLParser signatureParser = new XMLParser(ocf, signatureEntry, + report); + OCFHandler signatureHandler = new OCFHandler(signatureParser); + signatureParser.addXMLHandler(signatureHandler); + signatureParser.addValidator(signatureValidator); + signatureParser.process(); + } + + OPFChecker opfChecker = new OPFChecker(ocf, report, rootPath); + opfChecker.runChecks(); + } + + /** + * This method processes the rootPath String and returns the base path to + * the directory that contains the OPF content file. + * + * @param rootPath + * path+name of OPF content file + * @return String containing path to OPF content file's directory inside ZIP + */ + public String processRootPath(String rootPath) { + String rootBase = rootPath; + if (rootPath.endsWith(".opf")) { + int slash = rootPath.lastIndexOf("/"); + if (slash < rootPath.lastIndexOf("\\")) + slash = rootPath.lastIndexOf("\\"); + if (slash >= 0 && (slash + 1) < rootPath.length()) + rootBase = rootPath.substring(0, slash + 1); + else + rootBase = rootPath; + return rootBase; + } else { + System.out.println("RootPath is not an OPF file"); + return null; + } + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFHandler.java new file mode 100644 index 0000000..a54207f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFHandler.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ocf; + +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + +public class OCFHandler implements XMLHandler { + + XMLParser parser; + + static String rootPath; + + OCFHandler(XMLParser parser) { + this.parser = parser; + } + + public String getRootPath() { + return rootPath; + } + + public void startElement() { + XMLElement e = parser.getCurrentElement(); + String ns = e.getNamespace(); + if (e.getName().equals("rootfile") && ns != null + && ns.equals("urn:oasis:names:tc:opendocument:xmlns:container")) { + String mediaType = e.getAttribute("media-type"); + if (mediaType != null + && mediaType.equals("application/oebps-package+xml")) { + rootPath = e.getAttribute("full-path"); + } + } + } + + public void endElement() { + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void characters(char[] chars, int arg1, int arg2) { + } + + public void processingInstruction(String arg0, String arg1) { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFPackage.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFPackage.java new file mode 100644 index 0000000..04a367f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/OCFPackage.java @@ -0,0 +1,55 @@ +package com.adobe.epubcheck.ocf; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Hashtable; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class OCFPackage { + + ZipFile zip; + Hashtable enc; + String uniqueIdentifier; + + public OCFPackage(ZipFile zip) { + this.zip = zip; + this.enc = new Hashtable(); + } + + public void setEncryption(String name, EncryptionFilter encryptionFilter) { + enc.put(name, encryptionFilter); + } + + public void setUniqueIdentifier(String idval) { + uniqueIdentifier = idval; + } + + public String getUniqueIdentifier() { + return uniqueIdentifier; + } + + public boolean hasEntry(String name) { + return zip.getEntry(name) != null; + } + + public boolean canDecrypt(String name) { + EncryptionFilter filter = (EncryptionFilter) enc.get(name); + if (filter == null) + return true; + return filter.canDecrypt(); + } + + public InputStream getInputStream(String name) throws IOException { + ZipEntry entry = zip.getEntry(name); + if (entry == null) + return null; + InputStream in = zip.getInputStream(entry); + EncryptionFilter filter = (EncryptionFilter) enc.get(name); + if (filter == null) + return in; + if( filter.canDecrypt() ) + return filter.decrypt(in); + return null; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/UnsupportedEncryptionFilter.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/UnsupportedEncryptionFilter.java new file mode 100644 index 0000000..4b22dab --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ocf/UnsupportedEncryptionFilter.java @@ -0,0 +1,15 @@ +package com.adobe.epubcheck.ocf; + +import java.io.InputStream; + +public class UnsupportedEncryptionFilter implements EncryptionFilter { + + public boolean canDecrypt() { + return false; + } + + public InputStream decrypt(InputStream in) { + return null; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentChecker.java new file mode 100644 index 0000000..90d5618 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentChecker.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +public interface ContentChecker { + + public void runChecks(); +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentCheckerFactory.java new file mode 100644 index 0000000..c3b43ab --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/ContentCheckerFactory.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; + +public interface ContentCheckerFactory { + + public ContentChecker newInstance( OCFPackage ocf, Report report, String path, String mimeType, XRefChecker xrefChecker ); + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentChecker.java new file mode 100644 index 0000000..3afd571 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentChecker.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; + +public class GenericContentChecker implements ContentChecker { + + OCFPackage ocf; + Report report; + String path; + + GenericContentChecker(OCFPackage ocf, Report report, String path) { + this.ocf = ocf; + this.report = report; + this.path = path; + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "resource " + path + " is missing"); + else if (!ocf.canDecrypt(path)) + report + .warning(null, 0, "resource " + path + + " cannot be decrypted"); + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentCheckerFactory.java new file mode 100644 index 0000000..41598b7 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/GenericContentCheckerFactory.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; + +public class GenericContentCheckerFactory implements ContentCheckerFactory { + + public ContentChecker newInstance(OCFPackage ocf, Report report, String path, + String mimeType, XRefChecker xrefChecker) { + return new GenericContentChecker(ocf, report, path); + } + + static private GenericContentCheckerFactory instance = new GenericContentCheckerFactory(); + + static public GenericContentCheckerFactory getInstance() { + return instance; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFChecker.java new file mode 100644 index 0000000..cdff7ab --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFChecker.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import java.util.Hashtable; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.bitmap.BitmapCheckerFactory; +import com.adobe.epubcheck.dtbook.DTBookCheckerFactory; +import com.adobe.epubcheck.ncx.NCXCheckerFactory; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.ops.OPSCheckerFactory; +import com.adobe.epubcheck.xml.XMLParser; +import com.adobe.epubcheck.xml.XMLValidator; + +public class OPFChecker { + + OCFPackage ocf; + + Report report; + + String path; + + static XMLValidator opfValidator = new XMLValidator("rng/opf.rng"); + + static XMLValidator opfSchematronValidator = new XMLValidator("sch/opf.sch"); + + XRefChecker xrefChecker; + + static Hashtable contentCheckerFactoryMap; + + static { + Hashtable map = new Hashtable(); + map.put("application/xhtml+xml", OPSCheckerFactory.getInstance()); + map.put("text/html", OPSCheckerFactory.getInstance()); + map.put("text/x-oeb1-document", OPSCheckerFactory.getInstance()); + map.put("image/jpeg", BitmapCheckerFactory.getInstance()); + map.put("image/gif", BitmapCheckerFactory.getInstance()); + map.put("image/png", BitmapCheckerFactory.getInstance()); + map.put("image/svg+xml", OPSCheckerFactory.getInstance()); + map.put("application/x-dtbook+xml", DTBookCheckerFactory.getInstance()); + + contentCheckerFactoryMap = map; + } + + public OPFChecker(OCFPackage ocf, Report report, String path) { + this.ocf = ocf; + this.report = report; + this.path = path; + this.xrefChecker = new XRefChecker(ocf, report); + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "OPF file " + path + " is missing"); + else { + XMLParser opfParser = new XMLParser(ocf, path, report); + OPFHandler opfHandler = new OPFHandler(opfParser, ocf, path); + opfParser.addXMLHandler(opfHandler); + + // add relaxNG validator + opfParser.addValidator(opfValidator); + + // add schematron validator + opfParser.addValidator(opfSchematronValidator); + + try { + // validate according to relaxNG + schematron + opfParser.process(); + } catch (Throwable t) { + report.error(path, -1, + "Failed performing OPF Schematron tests: " + t.getMessage()); + } + + if (!opfHandler.checkUniqueIdentExists()) { + report.error(path, -1, + "unique-identifier attribute in package element must reference an existing identifier element id"); + } + + int itemCount = opfHandler.getItemCount(); + for (int i = 0; i < itemCount; i++) { + OPFItem item = opfHandler.getItem(i); + try { + xrefChecker.registerResource(item.getPath(), item.getMimeType(), item.isInSpine(), + checkItemFallbacks(item, opfHandler), checkImageFallbacks(item, opfHandler)); + } catch (IllegalArgumentException e) { + report.error(path, item.getLineNumber(), e.getMessage()); + } + checkItem(item, opfHandler); + } + + int spineItemCount = opfHandler.getSpineItemCount(); + for (int i = 0; i < spineItemCount; i++) { + OPFItem item = opfHandler.getSpineItem(i); + checkSpineItem(item, opfHandler); + } + + for (int i = 0; i < itemCount; i++) { + OPFItem item = opfHandler.getItem(i); + checkItemContent(item, opfHandler); + } + + xrefChecker.checkReferences(); + } + } + + static boolean isBlessedItemType(String type) { + return type.equals("application/xhtml+xml") + || type.equals("application/x-dtbook+xml"); + + } + + static boolean isDeprecatedBlessedItemType(String type) { + return type.equals("text/x-oeb1-document") || type.equals("text/html"); + } + + static boolean isBlessedStyleType(String type) { + return type.equals("text/css"); + } + + static boolean isDeprecatedBlessedStyleType(String type) { + return type.equals("text/x-oeb1-css"); + } + + static boolean isBlessedImageType(String type) { + return type.equals("image/gif") || type.equals("image/png") + || type.equals("image/jpeg") || type.equals("image/svg+xml"); + } + + private void checkItem(OPFItem item, OPFHandler opfHandler) { + String mimeType = item.getMimeType(); + String fallback = item.getFallback(); + if (mimeType == null || mimeType.equals("")) { + // Ensures that media-type attribute is not empty + report.error(path, item.getLineNumber(), + "empty media-type attribute"); + } else if (!mimeType.matches("[a-zA-Z0-9!#$&+-^_]+/[a-zA-Z0-9!#$&+-^_]+")) { + /* + * Ensures that media-type attribute has correct content. The + * media-type must have a type and a sub-type divided by '/' The + * allowable content for the media-type attribute is defined in + * RFC4288 section 4.2 + */ + report.error(path, item.getLineNumber(), + "invalid content for media-type attribute"); + } else if (isDeprecatedBlessedItemType(mimeType) + || isDeprecatedBlessedStyleType(mimeType)) { + if (opfHandler.getOpf20PackageFile() + && mimeType.equals("text/html")) + report.warning(path, item.getLineNumber(), + "text/html is not appropriate for XHTML/OPS, use application/xhtml+xml instead"); + else if (opfHandler.getOpf12PackageFile() && mimeType.equals("text/html")) + report.warning(path, item.getLineNumber(), + "text/html is not appropriate for OEBPS 1.2, use text/x-oeb1-document instead"); + else if (opfHandler.getOpf20PackageFile()) + report.warning(path, item.getLineNumber(), + "deprecated media-type '" + mimeType + "'"); + } + if (opfHandler.getOpf12PackageFile() && fallback == null) { + if (isBlessedItemType(mimeType)) + report.warning(path, item.getLineNumber(), "use of OPS media-type '" + + mimeType + "' in OEBPS 1.2 context; use text/x-oeb1-document instead"); + else if (isBlessedStyleType(mimeType)) + report.warning(path, item.getLineNumber(), "use of OPS media-type '" + + mimeType + "' in OEBPS 1.2 context; use text/x-oeb1-css instead"); + } + if (fallback != null) { + OPFItem fallbackItem = opfHandler.getItemById(fallback); + if (fallbackItem == null) + report.error(path, item.getLineNumber(), + "fallback item could not be found"); + } + String fallbackStyle = item.getFallbackStyle(); + if (fallbackStyle != null) { + OPFItem fallbackStyleItem = opfHandler.getItemById(fallbackStyle); + if (fallbackStyleItem == null) + report.error(path, item.getLineNumber(), + "fallback-style item could not be found"); + } + } + + private void checkItemContent(OPFItem item, OPFHandler opfHandler) { + String mimeType = item.getMimeType(); + String path = item.getPath(); + if (mimeType != null) { + ContentCheckerFactory checkerFactory; + if (item.isNcx()) + checkerFactory = NCXCheckerFactory.getInstance(); + else + checkerFactory = (ContentCheckerFactory) contentCheckerFactoryMap + .get(mimeType); + if (checkerFactory == null) + checkerFactory = GenericContentCheckerFactory.getInstance(); + if (checkerFactory != null) { + ContentChecker checker = checkerFactory.newInstance(ocf, + report, path, mimeType, xrefChecker); + checker.runChecks(); + } + } + } + + private void checkSpineItem(OPFItem item, OPFHandler opfHandler) { + // These checks are okay to be done on items, but they really should be done on all + // items instead. I am avoiding making this change now pending a few issue + // resolutions in the EPUB Maint Working Group (e.g. embedded fonts not needing fallbacks). + // [GC 11/15/09] + String mimeType = item.getMimeType(); + if (mimeType != null) { + if (isBlessedStyleType(mimeType) + || isDeprecatedBlessedStyleType(mimeType) + || isBlessedImageType(mimeType)) + report.error(path, item.getLineNumber(), "'" + mimeType + + "' is not a permissible spine media-type"); + else if (!isBlessedItemType(mimeType) + && !isDeprecatedBlessedItemType(mimeType) + && item.getFallback() == null) + report.error(path, item.getLineNumber(), + "non-standard media-type '" + mimeType + + "' with no fallback"); + else if (!isBlessedItemType(mimeType) + && !isDeprecatedBlessedItemType(mimeType) + && !checkItemFallbacks(item, opfHandler)) + report.error(path, item.getLineNumber(), + "non-standard media-type '" + mimeType + + "' with fallback to non-spine-allowed media-type"); + } + } + + private boolean checkItemFallbacks(OPFItem item, OPFHandler opfHandler) { + String fallback = item.getFallback(); + if (fallback != null) { + OPFItem fallbackItem = opfHandler.getItemById(fallback); + if (fallbackItem != null) { + String mimeType = fallbackItem.getMimeType(); + if (mimeType != null) { + if (isBlessedItemType(mimeType) + || isDeprecatedBlessedItemType(mimeType)) + return true; + if (checkItemFallbacks(fallbackItem, opfHandler)) + return true; + } + } + } + String fallbackStyle = item.getFallbackStyle(); + if (fallbackStyle != null) { + OPFItem fallbackStyleItem = opfHandler.getItemById(fallbackStyle); + if (fallbackStyleItem != null) { + String mimeType = fallbackStyleItem.getMimeType(); + if (mimeType != null) { + if (isBlessedStyleType(mimeType) + || isDeprecatedBlessedStyleType(mimeType)) + return true; + } + } + } + return false; + } + + private boolean checkImageFallbacks(OPFItem item, OPFHandler opfHandler) { + String fallback = item.getFallback(); + if (fallback != null) { + OPFItem fallbackItem = opfHandler.getItemById(fallback); + if (fallbackItem != null) { + String mimeType = fallbackItem.getMimeType(); + if (mimeType != null) { + if (isBlessedImageType(mimeType)) + return true; + if (checkImageFallbacks(fallbackItem, opfHandler)) + return true; + } + } + } + return false; + } + + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFHandler.java new file mode 100644 index 0000000..2762a32 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFHandler.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Vector; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.util.PathUtil; +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + +public class OPFHandler implements XMLHandler { + + OCFPackage ocf; + + XMLParser parser; + + Hashtable itemMapById = new Hashtable(); + + Hashtable itemMapByPath = new Hashtable(); + + Hashtable encryptedItems; + + Vector spine = new Vector(); + Vector items = new Vector(); + + static HashSet validRoles = new HashSet(); + + String path; + + // This string holds the value of the element's unique-identifier + // attribute + // that will be used to make sure that the unique-identifier references an + // existing + // id attribute + String uniqueIdent; + + // This boolean specifies whether or not there has been a + // element + // parsed that has an id attribute that corresponds with the + // unique-identifier attribute + // from the packaging element. The default value is false. + boolean uniqueIdentExists = false; + + OPFItem toc; + + boolean opf12PackageFile = false; + + static { + String[] list = { "acp", "act", "adp", "aft", "anl", "anm", "ann", + "ant", "app", "aqt", "arc", "ard", "arr", "art", "asg", "asn", + "att", "auc", "aud", "aui", "aus", "aut", "bdd", "bjd", "bkd", + "bkp", "bnd", "bpd", "bsl", "ccp", "chr", "clb", "cli", "cll", + "clt", "cmm", "cmp", "cmt", "cng", "cnd", "cns", "coe", "col", + "com", "cos", "cot", "cov", "cpc", "cpe", "cph", "cpl", "cpt", + "cre", "crp", "crr", "csl", "csp", "cst", "ctb", "cte", "ctg", + "ctr", "cts", "ctt", "cur", "cwt", "dfd", "dfe", "dft", "dgg", + "dis", "dln", "dnc", "dnr", "dpc", "dpt", "drm", "drt", "dsr", + "dst", "dtc", "dte", "dtm", "dto", "dub", "edt", "egr", "elg", + "elt", "eng", "etr", "exp", "fac", "fld", "flm", "fmo", "fpy", + "fnd", "frg", "gis", "grt", "hnr", "hst", "ill", "ilu", "ins", + "inv", "itr", "ive", "ivr", "lbr", "lbt", "ldr", "led", "lee", + "lel", "len", "let", "lgd", "lie", "lil", "lit", "lsa", "lse", + "lso", "ltg", "lyr", "mcp", "mfr", "mdc", "mod", "mon", "mrk", + "msd", "mte", "mus", "nrt", "opn", "org", "orm", "oth", "own", + "pat", "pbd", "pbl", "pdr", "pfr", "pht", "plt", "pma", "pmn", + "pop", "ppm", "ppt", "prc", "prd", "prf", "prg", "prm", "pro", + "prt", "pta", "pte", "ptf", "pth", "ptt", "rbr", "rce", "rcp", + "red", "ren", "res", "rev", "rps", "rpt", "rpy", "rse", "rsg", + "rsp", "rst", "rth", "rtm", "sad", "sce", "scl", "scr", "sds", + "sec", "sgn", "sht", "sng", "spk", "spn", "spy", "srv", "std", + "stl", "stm", "stn", "str", "tcd", "tch", "ths", "trc", "trl", + "tyd", "tyg", "vdg", "voc", "wam", "wdc", "wde", "wit" }; + for (int i = 0; i < list.length; i++) + validRoles.add(list[i]); + } + + OPFHandler(XMLParser parser, OCFPackage ocf, String path) { + this.ocf = ocf; + this.parser = parser; + this.path = path; + } + + public boolean getOpf12PackageFile() { + return (opf12PackageFile); + } + + public boolean getOpf20PackageFile() { + return (!opf12PackageFile); + } + + public OPFItem getTOC() { + return toc; + } + + public OPFItem getItemById(String id) { + return (OPFItem) itemMapById.get(id); + } + + public OPFItem getItemByPath(String path) { + return (OPFItem) itemMapByPath.get(path); + } + + public int getSpineItemCount() { + return spine.size(); + } + + public OPFItem getSpineItem(int index) { + return (OPFItem) spine.elementAt(index); + } + + public int getItemCount() { + return items.size(); + } + + public OPFItem getItem(int index) { + return (OPFItem) items.elementAt(index); + } + + /** + * Checks to see if the unique-identifier attribute of the package element + * references an existing DC metadata identifier element's id attribute + * + * @return true if there is an identifier with an id attribute that matches + * the value of the unique-identifier attribute of the package + * element. False otherwise. + */ + public boolean checkUniqueIdentExists() { + return uniqueIdentExists; + } + + public void setEncryptedItems(Hashtable encryptedItems) { + this.encryptedItems = encryptedItems; + } + + private static boolean isValidRole(String role) { + return validRoles.contains(role) || role.startsWith("oth."); + } + + public void startElement() { + boolean registerEntry = true; + XMLElement e = parser.getCurrentElement(); + String ns = e.getNamespace(); + if (ns == null + || ns.equals("") + || ns + .equals("http://openebook.org/namespaces/oeb-package/1.0/") + || ns.equals("http://www.idpf.org/2007/opf")) { + String name = e.getName(); + if (name.equals("package")) { + if (!ns.equals("http://www.idpf.org/2007/opf")) { + parser + .getReport() + .warning(path, parser.getLineNumber(), + "OPF file is using OEBPS 1.2 syntax allowing backwards compatibility"); + opf12PackageFile = true; + } + /* + * This section checks to see the value of the unique-identifier + * attribute and stores it in the String uniqueIdent or reports + * an error if the unique-identifier attribute is missing or + * does not have a value + */ + String uniqueIdentAttr = e.getAttribute("unique-identifier"); + if (uniqueIdentAttr != null && !uniqueIdentAttr.equals("")) { + uniqueIdent = uniqueIdentAttr; + } else { + parser + .getReport() + .error( + path, + parser.getLineNumber(), + "unique-identifier attribute in package element must be present and have a value"); + } + } else if (name.equals("item")) { + String id = e.getAttribute("id"); + String href = e.getAttribute("href"); + if (href != null) { + try { + href = PathUtil.resolveRelativeReference(path, href); + } catch (IllegalArgumentException ex) { + parser.getReport().error(path, parser.getLineNumber(), + ex.getMessage()); + href = null; + } + } + String mimeType = e.getAttribute("media-type"); + String fallback = e.getAttribute("fallback"); + String fallbackStyle = e.getAttribute("fallback-style"); + String namespace = e.getAttribute("island-type"); + OPFItem item = new OPFItem(id, href, mimeType, fallback, + fallbackStyle, namespace, parser.getLineNumber()); + if (id != null) + itemMapById.put(id, item); + if (href != null && registerEntry) { + itemMapByPath.put(href, item); + items.add(item); + } + } else if (name.equals("spine")) { + String idref = e.getAttribute("toc"); + if (idref != null) { + toc = (OPFItem) itemMapById.get(idref); + if (toc == null) + parser.getReport().error(path, parser.getLineNumber(), + "item with id '" + idref + "' not found"); + else { + toc.setNcx(true); + if (toc.getMimeType() != null + && !toc.getMimeType().equals( + "application/x-dtbncx+xml")) + parser + .getReport() + .error( + path, + parser.getLineNumber(), + "toc attribute references resource with non-NCX mime type; \"application/x-dtbncx+xml\" is expected"); + } + } + } else if (name.equals("itemref")) { + String idref = e.getAttribute("idref"); + if (idref != null) { + OPFItem item = getItemById(idref); + if (item != null) { + spine.add(item); + item.setInSpine(true); + } else { + parser.getReport().error(path, parser.getLineNumber(), + "item with id '" + idref + "' not found"); + } + } + } else if (name.equals("dc-metadata") || name.equals("x-metadata")) { + if (!opf12PackageFile) + parser.getReport().error(path, parser.getLineNumber(), + "use of deprecated element '" + name + "'"); + } + } else if (ns.equals("http://purl.org/dc/elements/1.1/")) { + // in the DC metadata, when the element is parsed, if + // it has a non-null and non-empty id attribute value that is the + // same as the value of the unique-identifier attribute of the + // package element, set uniqueIdentExists = true (to make sure that + // the unique-identifier attribute references an existing + // id attribute + String name = e.getName(); + if (name.equals("identifier")) { + String idAttr = e.getAttribute("id"); + if (idAttr != null && !idAttr.equals("") + && idAttr.equals(uniqueIdent)) + uniqueIdentExists = true; + } else if (name.equals("creator")) { + String role = e.getAttributeNS("http://www.idpf.org/2007/opf", + "role"); + if (role != null && !role.equals("")) { + if (!isValidRole(role)) + parser.getReport().error(path, parser.getLineNumber(), + "role value '" + role + "' is not valid"); + } + } + } + } + + /** + * This method is used to check whether the passed href has and extension + * that is a required content file inside the OPF spec. This method returns + * false if it is requried, or true if it is not. + * + * @param href + * String to check + * @return true if it is not required, false if it is. + */ + public boolean isNotRequiredContent(String href) { + if (href.endsWith(".opf")) + return false; + else if (href.endsWith(".html")) + return false; + else if (href.endsWith(".ncx")) + return false; + else if (href.endsWith(".xpgt")) + return false; + else if (href.endsWith(".xhtml")) + return false; + else + return true; + + } + + public void endElement() { + XMLElement e = parser.getCurrentElement(); + if (e.getNamespace().equals("http://purl.org/dc/elements/1.1/")) { + String name = e.getName(); + if (name.equals("identifier")) { + String idAttr = e.getAttribute("id"); + if (idAttr != null && !idAttr.equals("") + && idAttr.equals(uniqueIdent)) { + String idval = (String) e.getPrivateData(); + if (idval != null) + ocf.setUniqueIdentifier(idval); + } + } else if (name.equals("date")) { + String dateval = (String) e.getPrivateData(); + if (dateval == null + || !dateval.matches("\\d\\d\\d\\d(-\\d\\d(-\\d\\d)?)?")) { + Report report = parser.getReport(); + report.error(path, parser.getLineNumber(), "date value '" + + (dateval == null ? "" : dateval) + + "' is not valid, YYYY[-MM[-DD]] expected"); + } + } + } + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void characters(char[] chars, int start, int len) { + XMLElement e = parser.getCurrentElement(); + if (e.getNamespace().equals("http://purl.org/dc/elements/1.1/")) { + String name = e.getName(); + if (name.equals("identifier") || name.equals("date")) { + String val = (String) e.getPrivateData(); + String text = new String(chars, start, len); + if (val == null) + val = text; + else + val = val + text; + e.setPrivateData(val); + } + } + } + + public void processingInstruction(String arg0, String arg1) { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFItem.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFItem.java new file mode 100644 index 0000000..e387fab --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/OPFItem.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +public class OPFItem { + + String id; + + String path; + + String mimeType; + + String fallback; + + String fallbackStyle; + + String namespace; + + int lineNumber; + + boolean ncx; + + boolean inSpine; + + OPFItem(String id, String path, String mimeType, String fallback, + String fallbackStyle, String namespace, int lineNumber) { + this.fallback = fallback; + this.fallbackStyle = fallbackStyle; + this.id = id; + this.lineNumber = lineNumber; + this.mimeType = mimeType; + this.namespace = namespace; + this.path = path; + } + + public String getFallback() { + return fallback; + } + + public String getFallbackStyle() { + return fallbackStyle; + } + + public String getId() { + return id; + } + + public String getMimeType() { + return mimeType; + } + + public String getPath() { + return path; + } + + public String getNamespace() { + return namespace; + } + + public int getLineNumber() { + return lineNumber; + } + + public boolean isNcx() { + return ncx; + } + + public void setNcx(boolean ncx) { + this.ncx = ncx; + } + + public boolean isInSpine() { + return inSpine; + } + + public void setInSpine(boolean inSpine) { + this.inSpine = inSpine; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/XRefChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/XRefChecker.java new file mode 100644 index 0000000..73e7365 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/opf/XRefChecker.java @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.opf; + +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Vector; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; + +public class XRefChecker { + + public static final int RT_GENERIC = 0; + + public static final int RT_HYPERLINK = 1; + + public static final int RT_IMAGE = 2; + + public static final int RT_OBJECT = 3; + + public static final int RT_STYLESHEET = 4; + + public static final int RT_SVG_PAINT = 0x10; + + public static final int RT_SVG_CLIP_PATH = 0x11; + + public static final int RT_SVG_SYMBOL = 0x12; + + private class Reference { + String resource; + + int lineNumber; + + String refResource; + + String fragment; + + int type; + + public Reference(String srcResource, int srcLineNumber, + String refResource, String fragment, int type) { + this.fragment = fragment; + this.lineNumber = srcLineNumber; + this.refResource = refResource; + this.resource = srcResource; + this.type = type; + } + + } + + private class Anchor { + + String id; + + int lineNumber; + + int type; + + public Anchor(String id, int lineNumber, int type) { + this.id = id; + this.lineNumber = lineNumber; + this.type = type; + } + + } + + private class Resource { + + String resource; + + String mimeType; + + Hashtable anchors; + + boolean inSpine; + + boolean hasValidItemFallback; + + boolean hasValidImageFallback; + + Resource(String resource, String type, boolean inSpine, boolean hasValidItemFallback, + boolean hasValidImageFallback) { + this.mimeType = type; + this.resource = resource; + this.inSpine = inSpine; + this.hasValidItemFallback = hasValidItemFallback; + this.hasValidImageFallback = hasValidImageFallback; + this.anchors = new Hashtable(); + } + } + + Hashtable resources = new Hashtable(); + + HashSet undeclared = new HashSet(); + + Vector references = new Vector(); + + Report report; + + OCFPackage ocf; + + public XRefChecker(OCFPackage ocf, Report report) { + this.ocf = ocf; + this.report = report; + } + + public void registerResource(String resource, String mimeType, boolean inSpine, boolean hasValidItemFallback, + boolean hasValidImageFallback) { + if (resources.get(resource) != null) + throw new IllegalArgumentException("duplicate resource: " + + resource); + resources.put(resource, new Resource(resource, mimeType, inSpine, hasValidItemFallback, hasValidImageFallback)); + } + + public void registerAnchor(String resource, int lineNumber, String id, + int type) { + Resource res = (Resource) resources.get(resource); + if (res == null) + throw new IllegalArgumentException("unregistered resource: " + + resource); + if (res.anchors.get(id) != null) + throw new IllegalArgumentException("duplicate id: " + id); + res.anchors.put(id, new Anchor(id, lineNumber, type)); + } + + public void registerReference(String srcResource, int srcLineNumber, + String refResource, String refFragment, int type) { + if( refResource.startsWith("data:") ) + return; + references.add(new Reference(srcResource, srcLineNumber, refResource, + refFragment, type)); + } + + public void registerReference(String srcResource, int srcLineNumber, + String ref, int type) { + if( ref.startsWith("data:") ) + return; + int hash = ref.indexOf("#"); + String refResource; + String refFragment; + if (hash >= 0) { + refResource = ref.substring(0, hash); + refFragment = ref.substring(hash + 1); + } else { + refResource = ref; + refFragment = null; + } + registerReference(srcResource, srcLineNumber, refResource, refFragment, + type); + } + + public void checkReferences() { + Enumeration refs = references.elements(); + while (refs.hasMoreElements()) { + Reference ref = (Reference) refs.nextElement(); + checkReference(ref); + } + } + + private void checkReference(Reference ref) { + Resource res = (Resource) resources.get(ref.refResource); + if (res == null) { + if (!ocf.hasEntry(ref.refResource)) + report.error(ref.resource, ref.lineNumber, "'" + + ref.refResource + + "': referenced resource missing in the package"); + else if (!undeclared.contains(ref.refResource)) { + undeclared.add(ref.refResource); + report + .error( + ref.resource, + ref.lineNumber, + "'" + + ref.refResource + + "': referenced resource exists, but not declared in the OPF file"); + } + return; + } + if (ref.fragment == null) { + switch (ref.type) { + case RT_SVG_PAINT: + case RT_SVG_CLIP_PATH: + case RT_SVG_SYMBOL: + report.error(ref.resource, ref.lineNumber, + "fragment identifier missing in reference to '" + + ref.refResource + "'"); + break; + case RT_HYPERLINK: + // if mimeType is null, we should have reported an error already + if (res.mimeType != null + && !OPFChecker.isBlessedItemType(res.mimeType) + && !OPFChecker.isDeprecatedBlessedItemType(res.mimeType) + && !res.hasValidItemFallback) + report.error(ref.resource, ref.lineNumber, + "hyperlink to non-standard resource '" + + ref.refResource + "' of type '" + + res.mimeType + "'"); + if(!res.inSpine) + report.warning(ref.resource, ref.lineNumber, "hyperlink to resource outside spine '" + + ref.refResource + "'"); + break; + case RT_IMAGE: + // if mimeType is null, we should have reported an error already + if (res.mimeType != null + && !OPFChecker.isBlessedImageType(res.mimeType) + && !res.hasValidImageFallback) + report.error(ref.resource, ref.lineNumber, + "non-standard image resource '" + ref.refResource + + "' of type '" + res.mimeType + "'"); + break; + case RT_STYLESHEET: + // if mimeType is null, we should have reported an error already + + // The original code is below, but we were never collecting references to RT_STYLESHEETs; now we are. + // Implementations are allowed to process any stylesheet language they desire; so this is clearly not an + // error. Making this a warning with "(might be ignored)" could be okay. However, related, the OPF + // Checker currently looks at only the to make sure referneced items have appropiate fallbacks; + // it should really be checking the . If this was corrected, these alternate stylesheet + // items (with non-blessed MIME types) would likely get flagged as missing requried fallbacks. Flagging + // this during manifest processing seems the right choice, so, commenting out for now. [GC 11/15/09] + + //if (res.mimeType != null + // && !OPFChecker.isBlessedStyleType(res.mimeType) + // && !OPFChecker + // .isDeprecatedBlessedStyleType(res.mimeType)) + // report.error(ref.resource, ref.lineNumber, + // "non-standard stylesheet resource '" + // + ref.refResource + "' of type '" + // + res.mimeType + "'"); + break; + } + } else { + switch (ref.type) { + case RT_HYPERLINK: + // if mimeType is null, we should have reported an error already + if (res.mimeType != null + && !OPFChecker.isBlessedItemType(res.mimeType) + && !OPFChecker.isDeprecatedBlessedItemType(res.mimeType) + && !res.hasValidItemFallback) + report.error(ref.resource, ref.lineNumber, + "hyperlink to non-standard resource '" + + ref.refResource + "' of type '" + + res.mimeType + "'"); + if(!res.inSpine) + report.warning(ref.resource, ref.lineNumber, "hyperlink to resource outside spine '" + + ref.refResource + "'"); + break; + case RT_IMAGE: + report.error(ref.resource, ref.lineNumber, + "fragment identifier used for image resource '" + + ref.refResource + "'"); + break; + case RT_STYLESHEET: + report.error(ref.resource, ref.lineNumber, + "fragment identifier used for stylesheet resource '" + + ref.refResource + "'"); + break; + } + Anchor anchor = (Anchor) res.anchors.get(ref.fragment); + if (anchor == null) { + report.error(ref.resource, ref.lineNumber, "'" + ref.fragment + + "': fragment identifier is not defined in '" + + ref.refResource + "'"); + return; + } else { + switch (ref.type) { + case RT_SVG_PAINT: + case RT_SVG_CLIP_PATH: + if (anchor.type != ref.type) + report + .error( + ref.resource, + ref.lineNumber, + "fragment identifier '" + + ref.fragment + + "' defines incompatible resource type in '" + + ref.refResource + "'"); + break; + case RT_SVG_SYMBOL: + case RT_HYPERLINK: + if (anchor.type != ref.type && anchor.type != RT_GENERIC) + report + .error( + ref.resource, + ref.lineNumber, + "fragment identifier '" + + ref.fragment + + "' defines incompatible resource type in '" + + ref.refResource + "'"); + break; + } + } + } + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSChecker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSChecker.java new file mode 100644 index 0000000..cf058b9 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSChecker.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ops; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.xml.XMLParser; +import com.adobe.epubcheck.xml.XMLValidator; + +public class OPSChecker implements ContentChecker { + + OCFPackage ocf; + + Report report; + + String path; + + String mimeType; + + XRefChecker xrefChecker; + + static XMLValidator xhtmlValidator = new XMLValidator("rng/ops20.nrl"); + static XMLValidator svgValidator = new XMLValidator("rng/svg11.rng"); + + public OPSChecker(OCFPackage ocf, Report report, String path, String mimeType, XRefChecker xrefChecker) { + this.ocf = ocf; + this.report = report; + this.path = path; + this.xrefChecker = xrefChecker; + this.mimeType = mimeType; + } + + public void runChecks() { + if (!ocf.hasEntry(path)) + report.error(null, 0, "OPS/XHTML file " + path + " is missing"); + else if (!ocf.canDecrypt(path)) + report.error(null, 0, "OPS/XHTML file " + path + " cannot be decrypted"); + else { + XMLParser opsParser = new XMLParser(ocf, path, report); + OPSHandler opsHandler = new OPSHandler(opsParser, path, xrefChecker); + opsParser.addXMLHandler(opsHandler); + if( mimeType.equals("image/svg+xml") ) + opsParser.addValidator(svgValidator); + else + opsParser.addValidator(xhtmlValidator); + opsParser.process(); + } + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSCheckerFactory.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSCheckerFactory.java new file mode 100644 index 0000000..fb56f76 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSCheckerFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ops; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.opf.ContentChecker; +import com.adobe.epubcheck.opf.ContentCheckerFactory; +import com.adobe.epubcheck.opf.XRefChecker; + +public class OPSCheckerFactory implements ContentCheckerFactory { + + public ContentChecker newInstance(OCFPackage ocf, Report report, String path, + String mimeType, XRefChecker xrefChecker) { + return new OPSChecker(ocf, report, path, mimeType, xrefChecker); + } + + static private OPSCheckerFactory instance = new OPSCheckerFactory(); + + static public OPSCheckerFactory getInstance() { + return instance; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSHandler.java new file mode 100644 index 0000000..bbec508 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/OPSHandler.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.ops; + +import java.util.HashSet; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.BufferedReader; + +import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.util.PathUtil; +import com.adobe.epubcheck.xml.XMLElement; +import com.adobe.epubcheck.xml.XMLHandler; +import com.adobe.epubcheck.xml.XMLParser; + +public class OPSHandler implements XMLHandler { + + XMLParser parser; + + String path; + + HashSet idMap; + + XRefChecker xrefChecker; + + static HashSet regURISchemes = fillRegURISchemes(); + + private static HashSet fillRegURISchemes() + { + try + { + HashSet set = new HashSet(); + InputStream schemaStream = OPSHandler.class.getResourceAsStream("registeredSchemas.txt"); + BufferedReader schemaReader = new BufferedReader(new InputStreamReader(schemaStream)); + String schema = schemaReader.readLine(); + while(schema != null) + { + set.add(schema); + schema = schemaReader.readLine(); + } + schemaReader.close(); + schemaStream.close(); + return set; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + OPSHandler(XMLParser parser, String path, XRefChecker xrefChecker) { + this.parser = parser; + this.path = path; + this.xrefChecker = xrefChecker; + this.idMap = new HashSet(); + } + + private void checkPaint(XMLElement e, String attr) { + String paint = e.getAttribute(attr); + if (paint != null && paint.startsWith("url(") && paint.endsWith(")")) { + String href = paint.substring(4, paint.length() - 1); + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_SVG_PAINT); + } + } + + private void checkClip(XMLElement e, String attr) { + + } + + private void checkImage(XMLElement e, String attrNS, String attr) { + String href = e.getAttributeNS(attrNS, attr); + if (href != null) { + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_IMAGE); + } + } + + private void checkObject(XMLElement e, String attrNS, String attr) { + String href = e.getAttributeNS(attrNS, attr); + if (href != null) { + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_OBJECT); + } + } + + private void checkLink(XMLElement e, String attrNS, String attr) { + String href = e.getAttributeNS(attrNS, attr); + String rel = e.getAttributeNS(attrNS, "rel"); + if (href != null && rel != null && rel.indexOf("stylesheet") >= 0) { + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_STYLESHEET); + } + } + + private void checkSymbol(XMLElement e, String attrNS, String attr) { + String href = e.getAttributeNS(attrNS, attr); + if (href != null) { + href = PathUtil.resolveRelativeReference(path, href); + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_SVG_SYMBOL); + } + } + + private void checkHRef(XMLElement e, String attrNS, String attr) { + String href = e.getAttributeNS(attrNS, attr); + if (href != null) { + /* + * This section was replaced by the more broad and customizable + * isRegisteredSchemaType method, that checks to see if the + * href starts with one of the registered schema types read from + * the resource registeredSchemas.txt + * + * if (href.startsWith("http://") || href.startsWith("https://") + || href.startsWith("ftp://") || href.startsWith("mailto:") + || href.startsWith("data:")) + return; + */ + if (isRegisteredSchemaType(href)) + return; + //This if statement is needed to make sure XML Fragment identifiers + //are not reported as non-registered URI schema types + else if(href.indexOf(':') > 0){ + parser.getReport().warning(path, parser.getLineNumber(), + "use of non-registered URI schema type in href: " + href); + return; + } + try { + href = PathUtil.resolveRelativeReference(path, href); + } catch (IllegalArgumentException err) { + parser.getReport().error(path, parser.getLineNumber(), + err.getMessage()); + return; + } + xrefChecker.registerReference(path, parser.getLineNumber(), href, + XRefChecker.RT_HYPERLINK); + } + } + + public static boolean isRegisteredSchemaType(String href) + { + int colonIndex = href.indexOf(':'); + if(colonIndex < 0) + return false; + else if(regURISchemes.contains(href.substring(0, colonIndex + 1))) + return true; + else if(href.length() > colonIndex + 2) + if(href.substring(colonIndex + 1, colonIndex + 3).equals("//") + && regURISchemes.contains(href.substring(0, colonIndex + 3))) + return true; + else + return false; + else + return false; + } + + public void startElement() { + XMLElement e = parser.getCurrentElement(); + String id = e.getAttribute("id"); + String ns = e.getNamespace(); + String name = e.getName(); + int resourceType = XRefChecker.RT_GENERIC; + if (ns != null) { + if (ns.equals("http://www.w3.org/2000/svg")) { + if (name.equals("linearGradient") + || name.equals("radialGradient") + || name.equals("pattern")) + resourceType = XRefChecker.RT_SVG_PAINT; + else if (name.equals("clipPath")) + resourceType = XRefChecker.RT_SVG_CLIP_PATH; + else if (name.equals("symbol")) + resourceType = XRefChecker.RT_SVG_SYMBOL; + else if (name.equals("a")) + checkHRef(e, "http://www.w3.org/1999/xlink", "href"); + else if (name.equals("use")) + checkSymbol(e, "http://www.w3.org/1999/xlink", "href"); + else if (name.equals("image")) + checkImage(e, "http://www.w3.org/1999/xlink", "href"); + checkPaint(e, "fill"); + checkPaint(e, "stroke"); + checkClip(e, "clip"); + } else if (ns.equals("http://www.w3.org/1999/xhtml")) { + if (name.equals("a")) + checkHRef(e, null, "href"); + else if (name.equals("img")) + checkImage(e, null, "src"); + else if (name.equals("object")) + checkObject(e, null, "data"); + else if (name.equals("link")) + checkLink(e, null, "href"); + resourceType = XRefChecker.RT_HYPERLINK; + } + } + if (id != null) + xrefChecker.registerAnchor(path, parser.getLineNumber(), id, + resourceType); + } + + public void endElement() { + } + + public void ignorableWhitespace(char[] chars, int arg1, int arg2) { + } + + public void characters(char[] chars, int arg1, int arg2) { + } + + public void processingInstruction(String arg0, String arg1) { + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/registeredSchemas.txt b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/registeredSchemas.txt new file mode 100644 index 0000000..6c4428f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/ops/registeredSchemas.txt @@ -0,0 +1,74 @@ +aaa:// +aaas:// +acap:// +cap:// +cid: +crid:// +data: +dav: +dict:// +dns:// +fax: +file:// +ftp:// +go:// +gopher:// +h323: +http:// +https:// +icap:// +im: +imap:// +info: +ipp:// +iris: +iris.beep: +iris.xpc: +iris.xpcs: +iris.lwz: +ldap:// +mailto: +mid: +modem: +msrp:// +msrps:// +mtqp:// +mupdate:// +news:// +nfs:// +nntp:// +opaquelocktoken: +pop:// +pres: +rtsp:// +service: +shttp:// +sip: +sips: +snmp:// +soap.beep:// +soap.beeps:// +tag: +tel: +telnet:// +tftp:// +thismessage: +tip:// +tv: +urn: +vemmi:// +xmlrpc.beep:// +xmlrpc.beeps:// +xmpp:// +z39.50r:// +z39.50s:// +afs: +dtn: +iax: +mailserver: +pack:// +tn3270: +prospero:// +snews:// +videotex: +wais:// diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/container.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/container.rng new file mode 100644 index 0000000..901d65a --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/container.rng @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-svg.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-svg.rng new file mode 100644 index 0000000..73cd553 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-svg.rng @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-xhtml.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-xhtml.rng new file mode 100644 index 0000000..5a63a6a --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content-xhtml.rng @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content.rng new file mode 100644 index 0000000..3c20017 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/content.rng @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/dtbook-2005-2.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/dtbook-2005-2.rng new file mode 100644 index 0000000..42fe625 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/dtbook-2005-2.rng @@ -0,0 +1,4110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + xxx + xxp + xlx + xlp + bxx + bxp + blx + blp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2005-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + required + optional + + + + + + + + + + + + + + + + + + + + + required + optional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + front + normal + special + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ol + ul + pl + + + + + + + + + 1 + a + A + i + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + col + rowgroup + colgroup + + + + + + void + above + below + hsides + lhs + rhs + vsides + box + border + + + + + + none + groups + rows + cols + all + + + + + + + + left + center + right + justify + char + + + + + + + + + + + + + + + + + + + + top + middle + bottom + baseline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/encryption.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/encryption.rng new file mode 100644 index 0000000..9cbf3d8 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/encryption.rng @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx-old.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx-old.rng new file mode 100644 index 0000000..dae2370 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx-old.rng @@ -0,0 +1,253 @@ + + + + + + 2005-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx.rng new file mode 100644 index 0000000..2b1d14a --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ncx.rng @@ -0,0 +1,295 @@ + + + + + + + + + 2005-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf.rng new file mode 100644 index 0000000..83b1cac --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf12.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf12.rng new file mode 100644 index 0000000..a63b77d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf12.rng @@ -0,0 +1,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf20.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf20.rng new file mode 100644 index 0000000..f3f9142 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/opf20.rng @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops/ops-switch.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops/ops-switch.rng new file mode 100644 index 0000000..5dd7954 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops/ops-switch.rng @@ -0,0 +1,51 @@ + + + + + OPS conditional processing: switch, case and default elements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.nrl b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.nrl new file mode 100644 index 0000000..64c3f05 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.nrl @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.rng new file mode 100644 index 0000000..619cade --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/ops20.rng @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/signatures.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/signatures.rng new file mode 100644 index 0000000..9bd9a12 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/signatures.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animation.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animation.rng new file mode 100644 index 0000000..788166e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animation.rng @@ -0,0 +1,412 @@ + + + + + SVG 1.1 Animation Module + file: svg-animation.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-animation.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Animation + + animate, set, animateMotion, animateColor, animateTransform, mpath + + This module declares markup to provide support for animation. + + + + SVG.Animation.class + + + + + + + + + + + + + + + + + + + SVG.Animation.attrib + + + + + + + + + + + + + SVG.AnimationAttribute.attrib + + + + + + + + + + + + + + + + SVG.AnimationTiming.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + always + never + whenNotActive + + + + + + + + + + + + + remove + freeze + + + + + + + + SVG.AnimationValue.attrib + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.AnimationAddtion.attrib + + + + + + + + + + + replace + sum + + + + + + + none + sum + + + + + + + + animate: Animate Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + set: Set Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateMotion: Animate Motion Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateColor: Animate Color Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + animateTransform: Animate Transform Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate + scale + rotate + skewX + skewY + + + + + + + mpath: Motion Path Element + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng new file mode 100644 index 0000000..aeaf682 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-animevents-attrib.rng @@ -0,0 +1,61 @@ + + + + + SVG 1.1 Animation Events Attribute Module + file: svg-animevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-animevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Animation Events Attribute + + onbegin, onend, onrepeat, onload + + This module defines the AnimationEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng new file mode 100644 index 0000000..df313f9 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-clip.rng @@ -0,0 +1,129 @@ + + + + + SVG 1.1 Basic Clip Module + file: svg-basic-clip.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-clip.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Clip + + clipPath + + This module declares markup to provide support for clipping. + + + + Datatypes + + + + + + + + SVG.Clip.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Clip.class + + + + + + + + + + + + + + + clipPath: Clip Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng new file mode 100644 index 0000000..d57e037 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-filter.rng @@ -0,0 +1,870 @@ + + + + + SVG 1.1 Basic Filter Module + file: svg-basic-filter.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-filter.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Filter + + filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, + feFlood, feGaussianBlur, feImage, feMerge, feMergeNode, feOffset, + feTile, feFuncR, feFuncG, feFuncB, feFuncA + + This module declares markup to provide support for filter effect. + + + + Datatypes + + + + + + + + + + + + SVG.Filter.attrib + + + + + + + + + + + + + + + + + SVG.FilterColor.attrib + + + + + + + + + + + auto + sRGB + linearRGB + inherit + + + + + + + + SVG.Filter.class + + + + + + + + + + + + + + + SVG.FilterPrimitive.class + + + + + + + + + + + + + + + + + + + + + + + + SVG.FilterPrimitive.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.FilterPrimitiveWithIn.attrib + + + + + + + + + + + + + + + + filter: Filter Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + feBlend: Filter Effect Blend Element + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + multiply + screen + darken + lighten + + + + + + + feColorMatrix: Filter Effect Color Matrix Element + + + + + + + + + + + + + + + + + + + + + + + + + + matrix + saturate + hueRotate + luminanceToAlpha + + + + + + + + + + feComponentTransfer: Filter Effect Component Transfer Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feComposite: Filter Effect Composite Element + + + + + + + + + + + + + + + + + + + + + + + + + + + over + in + out + atop + xor + arithmetic + + + + + + + + + + + + + + + + + + + + + + + + + + + feFlood: Filter Effect Flood Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feGaussianBlur: Filter Effect Gaussian Blur Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feImage: Filter Effect Image Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feMerge: Filter Effect Merge Element + + + + + + + + + + + + + + + + + + + + + + + feMergeNode: Filter Effect Merge Node Element + + + + + + + + + + + + + + + + + + + + + + + + + + + feOffset: Filter Effect Offset Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTile: Filter Effect Tile Element + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncR: Filter Effect Function Red Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncG: Filter Effect Function Green Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncB: Filter Effect Function Blue Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feFuncA: Filter Effect Function Alpha Element + + + + + + + + + + + + + + + + + + + + + + + identity + table + discrete + linear + gamma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-font.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-font.rng new file mode 100644 index 0000000..eb68203 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-font.rng @@ -0,0 +1,544 @@ + + + + + SVG 1.1 Basic Font Module + file: svg-basic-font.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-font.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Font + + font, font-face, glyph, missing-glyph, hkern, vkern, font-face-src, + font-face-uri, font-face-name + + This module declares markup to provide support for template. + + + + SVG.Font.class + + + + + + + + + + + + + + + + font: Font Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face: Font Face Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + glyph: Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + missing-glyph: Missing Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hkern: Horizontal Kerning Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vkern: Vertical Kerning Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face-src: Font Face Source Element + + + + + + + + + + + + + + + + + + + + + + + + font-face-uri: Font Face URI Element + + + + + + + + + + + + + + + + + + + + font-face-name: Font Face Name Element + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng new file mode 100644 index 0000000..6ab7361 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-graphics-attrib.rng @@ -0,0 +1,74 @@ + + + + + SVG 1.1 Basic Graphics Attribute Module + file: svg-basic-graphics-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-graphics-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Graphics Attribute + + display, visibility + + This module defines the Graphics attribute set. + + + + + + + inline + block + list-item + run-in + compact + marker + table + inline-table + table-row-group + table-header-group + table-footer-group + table-row + table-column-group + table-column + table-cell + table-caption + none + inherit + + + + + + + + + + visible + hidden + inherit + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng new file mode 100644 index 0000000..2839f7f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-structure.rng @@ -0,0 +1,666 @@ + + + + + SVG 1.1 Basic Structure Module + file: svg-basic-structure.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-structure.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Structure + + svg, g, defs, desc, title, metadata, use + + This module declares the major structural elements and their attributes. + + + + +
+ + Include core set of modules + + + + + Datatypes Module + + + + + + Core Attribute Module + + +
+ + + Content Models (Default) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Attribute Collections (Default) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Description.class + + + + + + + + + + + + + + + + + SVG.Use.class + + + + + + + + + + + + + + + SVG.Structure.class + + + + + + + + + + + + + + + + + + SVG.Presentation.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + svg: SVG Document Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disable + magnify + + + + + + 1.1 + + + + + + + + + + + + + + + + + + + + + g: Group Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + defs: Definisions Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + desc: Description Element + + + + + + + + + + + + + + + + + + + + title: Title Element + + + + + + + + + + + + + + + + + + + + metadata: Metadata Element + + + + + + + + + + + + + + + + + + + use: Use Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-text.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-text.rng new file mode 100644 index 0000000..3a67492 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-basic-text.rng @@ -0,0 +1,273 @@ + + + + + SVG 1.1 Basic Text Module + file: svg-basic-text.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-basic-text.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Basic Text + + text, altGlyph, altGlyphDef, glyphRef + + This module declares markup to provide support for text. + + + + Datatypes + + + + + + + + + + + + SVG.Font.attrib + + + + + + + + + + + + + + + + + + + + + normal + italic + oblique + inherit + + + + + + + normal + bold + bolder + lighter + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + inherit + + + + + + + + SVG.Text.class + + + + + + + + + + + + + + + SVG.TextContent.class + + + + + + + + + + + + + + + text: Text Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyph: Alternate Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyphDef: Alternate Glyph Definition Element + + + + + + + + + + + + + + + + + + + + + glyphRef: Glyph Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-clip.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-clip.rng new file mode 100644 index 0000000..eacd793 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-clip.rng @@ -0,0 +1,37 @@ + + + + + SVG 1.1 Clip Module + file: svg-clip.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-clip.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Clip + + clipPath + + This module declares markup to provide support for clipping. + + + + + + + extend content model of clipPath + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-conditional.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-conditional.rng new file mode 100644 index 0000000..756f4ed --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-conditional.rng @@ -0,0 +1,124 @@ + + + + + SVG 1.1 Conditional Processing Module + file: svg-conditional.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-conditional.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Conditional Processing + + switch + + This module declares markup to provide support for conditional processing. + + + + Datatypes + + + + + + + + + + + + SVG.Conditional.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Conditional.class + + + + + + + + + + + + + + + switch: Switch Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng new file mode 100644 index 0000000..a2e958c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-container-attrib.rng @@ -0,0 +1,49 @@ + + + + + SVG 1.1 Container Attribute Module + file: svg-container-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-container-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Container Attribute + + enable-background + + This module defines the Container attribute set. + + + + + 'enable-background' property/attribute value (e.g., 'new', 'accumulate') + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng new file mode 100644 index 0000000..c8f0c81 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-core-attrib.rng @@ -0,0 +1,73 @@ + + + + + SVG 1.1 Core Attribute Module + file: svg-core-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-core-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Core Attribute + + id, xml:base, xml:lang, xml:space + + This module defines the core set of attributes that can be present on + any element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + preserve + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-cursor.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-cursor.rng new file mode 100644 index 0000000..d9ce19b --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-cursor.rng @@ -0,0 +1,99 @@ + + + + + SVG 1.1 Cursor Module + file: svg-cursor.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-cursor.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Cursor + + cursor + + This module declares markup to provide support for cursor. + + + + Datatypes + + + + + + + + SVG.Cursor.attrib + + + + + + + + + + + + + + + + + SVG.Cursor.class + + + + + + + + + + + + + + + cursor: Cursor Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-datatypes.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-datatypes.rng new file mode 100644 index 0000000..82aee63 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-datatypes.rng @@ -0,0 +1,188 @@ + + + + + SVG 1.1 Datatypes Module + file: svg-datatypes.mod + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-datatypes.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Datatypes + + This module declares common data types for properties and attributes. + + + + feature specification + + + + + false + true + + + + + + 'clip-rule' or 'fill-rule' property/attribute value + + + nonzero + evenodd + inherit + + + + + + media type, as per [RFC2045] + + + + + + + a <coordinate> + + + + + + + a list of <coordinate>s + + + + + + + a <color> value + + + + + + + a <integer> + + + + + + + a language code, as per [RFC3066] + + + + + + + comma-separated list of language codes, as per [RFC3066] + + + + + + + a <ength> + + + + + + + a list of <length>s + + + + + + + a <number> + + + + + + + a list of <number>s + + + + + + + + opacity value (e.g., <number>) + + + + + + + a path data specification + + + + + + + 'preserveAspectRatio' attribute specification + + + \s*(none|xMinYMin|xMidYMin|xMaxYMin|xMinYMid|xMidYMid|xMaxYMid|xMinYMax|xMidYMax|xMaxYMax)\s+(meet|slice)?\s* + + + + + + script expression + + + + + + + An SVG color value (RGB plus optional ICC) + + + + + + + arbitrary text string + + + + + + + list of transforms + + + + + + + a Uniform Resource Identifier, see [URI] + + + + + + + 'viewBox' attribute specification + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng new file mode 100644 index 0000000..9d63bd4 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-docevents-attrib.rng @@ -0,0 +1,87 @@ + + + + + SVG 1.1 Document Events Attribute Module + file: svg-docevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-docevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Document Events Attribute + + onunload, onabort, onerror, onresize, onscroll, onzoom + + This module defines the DocumentEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extensibility.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extensibility.rng new file mode 100644 index 0000000..097a9e9 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extensibility.rng @@ -0,0 +1,125 @@ + + + + + SVG 1.1 Extensibility Module + file: svg-extensibility.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-extensibility.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + + Extensibility + + foreignObject + + This module declares markup to provide support for extensibility. + + + + SVG.Extensibility.class + + + + + + + + + + + + + + + + + + + foreignObject: Foreign Object Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + any element in foreign namespace + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng new file mode 100644 index 0000000..017b9e1 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-extresources-attrib.rng @@ -0,0 +1,42 @@ + + + + + SVG 1.1 External Resources Attribute Module + file: svg-extresources-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-extresources-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + External Resources Attribute + + externalResourcesRequired + + This module defines the External attribute set. + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-filter.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-filter.rng new file mode 100644 index 0000000..a7250bc --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-filter.rng @@ -0,0 +1,512 @@ + + + + + SVG 1.1 Filter Module + file: svg-filter.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-filter.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Filter + + filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, + feConvolveMatrix, feDiffuseLighting, feDisplacementMap, feFlood, + feGaussianBlur, feImage, feMerge, feMergeNode, feMorphology, feOffset, + feSpecularLighting, feTile, feTurbulence, feDistantLight, fePointLight, + feSpotLight, feFuncR, feFuncG, feFuncB, feFuncA + + This module declares markup to provide support for filter effect. + + + + + + + extend SVG.FilterPrimitive.class + + + + + + + + + + + + + feConvolveMatrix: Filter Effect Convolve Matrix Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + duplicate + wrap + none + + + + + + + + + + + + + + + + + feDiffuseLighting: Filter Effect Diffuse Lighting Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feDisplacementMap: Filter Effect Displacement Map Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R + G + B + A + + + + + + + R + G + B + A + + + + + + + feMorphology: Filter Effect Morphology Element + + + + + + + + + + + + + + + + + + + + + + + + + + erode + dilate + + + + + + + + + + + + feSpecularLighting: Filter Effect Specular Lighting Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTurbulence: Filter Effect Turbulence Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stitch + noStitch + + + + + + + fractalNoise + turbulence + + + + + + + feDistantLight: Filter Effect Distant Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fePointLight: Filter Effect Point Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feSpotLight: Filter Effect Spot Light Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-font.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-font.rng new file mode 100644 index 0000000..e545cfb --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-font.rng @@ -0,0 +1,146 @@ + + + + + SVG 1.1 Font Module + file: svg-font.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-font.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Font + + font, font-face, glyph, missing-glyph, hkern, vkern, font-face-src, + font-face-uri, font-face-format, font-face-name, definition-src + + This module declares markup to provide support for template. + + + + + + font-face: Font Face Element + + + + + + + + + + glyph: Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + missing-glyph: Missing Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-face-uri: Font Face URI Element + + + + + + + + + + font-face-format: Font Face Format Element + + + + + + + + + + + + + + + + + + + + + + definition-src: Definition Source Element + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-gradient.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-gradient.rng new file mode 100644 index 0000000..425eff1 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-gradient.rng @@ -0,0 +1,259 @@ + + + + + SVG 1.1 Gradient Module + file: svg-gradient.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-gradient.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Gradient + + linearGradient, radialGradient, stop + + This module declares markup to provide support for gradient fill. + + + + Datatypes + + + + + + + + SVG.Gradient.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Gradient.class + + + + + + + + + + + + + + + + linearGradient: Linear Gradient Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + pad + reflect + repeat + + + + + + + radialGradient: Radial Gradient Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + pad + reflect + repeat + + + + + + + stop: Stop Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng new file mode 100644 index 0000000..edc7741 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphevents-attrib.rng @@ -0,0 +1,124 @@ + + + + + SVG 1.1 Graphical Element Events Attribute Module + file: svg-graphevents-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-graphevents-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Graphical Element Events Attribute + + onfocusin, onfocusout, onactivate, onclick, onmousedown, onmouseup, + onmouseover, onmousemove, onmouseout, onload + + This module defines the GraphicalEvents attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng new file mode 100644 index 0000000..15029e5 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-graphics-attrib.rng @@ -0,0 +1,95 @@ + + + + + SVG 1.1 Graphics Attribute Module + file: svg-graphics-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-graphics-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Graphics Attribute + + display, image-rendering, pointer-events, shape-rendering, + text-rendering, visibility + + This module defines the Graphics attribute set. + + + + + + + + + auto + optimizeSpeed + optimizeQuality + inherit + + + + + + + + + + visiblePainted + visibleFill + visibleStroke + visible + painted + fill + stroke + all + none + inherit + + + + + + + + + + auto + optimizeSpeed + crispEdges + geometricPrecision + inherit + + + + + + + + + + auto + optimizeSpeed + optimizeLegibility + geometricPrecision + inherit + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng new file mode 100644 index 0000000..d13ba49 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-hyperlink.rng @@ -0,0 +1,106 @@ + + + + + SVG 1.1 Hyperlinking Module + file: svg-hyperlink.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-hyperlink.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Hyperlinking + + a + + This module declares markup to provide support for hyper linking. + + + + + link to this target + + + + + + SVG.Hyperlink.class + + + + + + + + + + + + + + + a: Anchor Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-image.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-image.rng new file mode 100644 index 0000000..78bca9e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-image.rng @@ -0,0 +1,104 @@ + + + + + SVG 1.1 Image Module + file: svg-image.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-image.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Image + + image + + This module declares markup to provide support for image. + + + + SVG.Image.class + + + + + + + + + + + + + + + image: Image Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-marker.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-marker.rng new file mode 100644 index 0000000..311d59f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-marker.rng @@ -0,0 +1,161 @@ + + + + + SVG 1.1 Marker Module + file: svg-marker.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-marker.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Marker + + marker + + This module declares markup to provide support for marker. + + + + Datatypes + + + + + + + + SVG.Marker.attrib + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Marker.class + + + + + + + + + + + + + + + marker: Marker Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + strokeWidth + userSpaceOnUse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-mask.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-mask.rng new file mode 100644 index 0000000..929fc07 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-mask.rng @@ -0,0 +1,148 @@ + + + + + SVG 1.1 Mask Module + file: svg-mask.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-mask.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Mask + + mask + + This module declares markup to provide support for masking. + + + + + Datatypes + + + + + + + + SVG.Mask.attrib + + + + + + + + + + + + + + + + + SVG.Mask.class + + + + + + + + + + + + + + + mask: Mask Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng new file mode 100644 index 0000000..9ba06c5 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-opacity-attrib.rng @@ -0,0 +1,60 @@ + + + + + SVG 1.1 Paint Opacity Attribute Module + file: svg-opacity-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-opacity-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Paint Opacity Attribute + + opacity, fill-opacity, stroke-opacity + + This module defines the Opacity attribute set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng new file mode 100644 index 0000000..9aea366 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-paint-attrib.rng @@ -0,0 +1,207 @@ + + + + + SVG 1.1 Paint Attribute Module + file: svg-paint-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-paint-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Paint Attribute + + fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, + stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color, + color-interpolation, color-rendering + + This module defines the Paint and Color attribute sets. + + + + + a 'fill' or 'stroke' property/attribute value: <paint> + + + + + + + 'stroke-dasharray' property/attribute value + (e.g., 'none', list of <number>s) + + + + + + + 'stroke-dashoffset' property/attribute value (e.g., 'none', <legnth>) + + + + + + + 'stroke-miterlimit' property/attribute value (e.g., <number>) + + + + + + + 'stroke-width' property/attribute value (e.g., <length>) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + butt + round + square + inherit + + + + + + + + + + miter + round + bevel + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + sRGB + linearRGB + inherit + + + + + + + + + + auto + optimizeSpeed + optimizeQuality + inherit + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-pattern.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-pattern.rng new file mode 100644 index 0000000..899cc99 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-pattern.rng @@ -0,0 +1,138 @@ + + + + + SVG 1.1 Pattern Module + file: svg-pattern.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-pattern.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Pattern + + pattern + + This module declares markup to provide support for pattern fill. + + + + SVG.Pattern.class + + + + + + + + + + + + + + + pattern: Pattern Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + userSpaceOnUse + objectBoundingBox + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-profile.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-profile.rng new file mode 100644 index 0000000..4bf6072 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-profile.rng @@ -0,0 +1,92 @@ + + + + + SVG 1.1 Color Profile Module + file: svg-profile.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-profile.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Color Profile + + color-profile + + This module declares markup to provide support for color profile. + + + + SVG.Profile.attrib + + + + + + + + + + + + + + + SVG.Profile.class + + + + + + + + + + + + + + + color-profile: Color Profile Element + + + + + + + + + + + + + + + + + + + + + + + + + + auto + perceptual + relative-colorimetric + saturation + absolute-colorimetric + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-qname.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-qname.rng new file mode 100644 index 0000000..2a13e0d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-qname.rng @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-script.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-script.rng new file mode 100644 index 0000000..1ddaf8a --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-script.rng @@ -0,0 +1,64 @@ + + + + + SVG 1.1 Scripting Module + file: svg-script.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-script.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Scripting + + script + + This module declares markup to provide support for scripting. + + + + SVG.Script.class + + + + + + + + + + + + + + + script: Script Element + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-shape.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-shape.rng new file mode 100644 index 0000000..5f788bf --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-shape.rng @@ -0,0 +1,433 @@ + + + + + SVG 1.1 Shape Module + file: svg-shape.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-shape.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Shape + + path, rect, circle, line, ellipse, polyline, polygon + + This module declares markup to provide support for graphical shapes. + + + + + a list of points + + + + + + SVG.Shape.class + + + + + + + + + + + + + + + + + + + + + path: Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect: Rectangle Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + circle: Circle Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + line: Line Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ellipse: Ellipse Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + polyline: Polyline Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + polygon: Polygon Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-structure.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-structure.rng new file mode 100644 index 0000000..97ac566 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-structure.rng @@ -0,0 +1,92 @@ + + + + + SVG 1.1 Structure Module + file: svg-structure.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-structure.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Structure + + svg, g, defs, desc, title, metadata, symbol, use + + This module declares the major structural elements and their attributes. + + + + + + + extend SVG.Structure.class + + + + + + + + symbol: Symbol Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-style.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-style.rng new file mode 100644 index 0000000..ed2aa2c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-style.rng @@ -0,0 +1,121 @@ + + + + + SVG 1.1 Style Module + file: svg-style.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-style.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Style + + style + + This module declares markup to provide support for stylesheet. + + + + Datatypes + + + + + + + + + + + + + comma-separated list of media descriptors. + + + + + + SVG.Style.attrib + + + + + + + + + + + + + + + + + + + + + + SVG.Style.class + + + + + + + + + + + + + + + style: Style Element + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-text.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-text.rng new file mode 100644 index 0000000..6aece2b --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-text.rng @@ -0,0 +1,627 @@ + + + + + SVG 1.1 Text Module + file: svg-text.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-text.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Text + + text, tspan, tref, textPath, altGlyph, altGlyphDef, altGlyphItem, + glyphRef + + This module declares markup to provide support for alternate glyph. + + + + + + Datatypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG.Text.attrib + + + + + + + + + + + lr-tb + rl-tb + tb-rl + lr + rl + tb + inherit + + + + + + + + SVG.TextContent.attrib + + + + + + + + + + + auto + baseline + before-edge + text-before-edge + middle + central + after-edge + text-after-edge + ideographic + alphabetic + hanging + mathematical + inherit + + + + + + + + + + + + ltr + rtl + inherit + + + + + + + auto + use-script + no-change + reset-size + ideographic + alphabetic + hanging + mathematical + central + middle + text-after-edge + text-before-edge + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + start + middle + end + inherit + + + + + + + + + + + + normal + embed + bidi-override + inherit + + + + + + + + + + + + + + + + + + + + + normal + wider + narrower + ultra-condensed + extra-condensed + condensed + semi-condensed + semi-expanded + expanded + extra-expanded + ultra-expanded + inherit + + + + + + + normal + small-caps + inherit + + + + + + + + extend SVG.Text.class + + + + + + + + + extend SVG.TextContent.class + + + + + + + + + + text: Text Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + tspan: Text Span Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + tref: Text Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + textPath: Text Path Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spacing + spacingAndGlyphs + + + + + + + align + stretch + + + + + + + auto + exact + + + + + + + altGlyph: Alternate Glyph Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + altGlyphDef: Alternate Glyph Definition Element + + + + + + + + + + + + altGlyphItem: Alternate Glyph Item Element + + + + + + + + + + + + + + + + + + + + + glyphRef: Glyph Reference Element + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-view.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-view.rng new file mode 100644 index 0000000..15e790e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-view.rng @@ -0,0 +1,83 @@ + + + + + SVG 1.1 View Module + file: svg-view.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-view.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + View + + view + + This module declares markup to provide support for view. + + + + SVG.View.class + + + + + + + + + + + + + + + view: View Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disable + magnify + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng new file mode 100644 index 0000000..60f0ed0 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-viewport-attrib.rng @@ -0,0 +1,64 @@ + + + + + SVG 1.1 Viewport Attribute Module + file: svg-viewport-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-viewport-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + Viewport Attribute + + clip, overflow + + This module defines the Viewport attribute set. + + + + + 'clip' property/attribute value (e.g., 'auto', rect(...)) + + + + + + + + + + + + + + + + + visible + hidden + scroll + auto + inherit + + + + + + + + + + + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng new file mode 100644 index 0000000..e28200b --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg/svg-xlink-attrib.rng @@ -0,0 +1,194 @@ + + + + + SVG 1.1 XLink Attribute Module + file: svg-xlink-attrib.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved. + + $Id: svg-xlink-attrib.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + + + XLink Attribute + + type, href, role, arcrole, title, show, actuate + + This module defines the XLink, XLinkRequired, XLinkEmbed, and + XLinkReplace attribute set. + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + other + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + other + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + embed + + + + + + onLoad + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + new + replace + + + + + + onRequest + + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg11.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg11.rng new file mode 100644 index 0000000..d3ed76c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/svg11.rng @@ -0,0 +1,231 @@ + + + + + RELAX NG schema for SVG 1.1 + file: svg11.rng + + This is SVG, a language for describing two-dimensional graphics in XML. + + The Scalable Vector Graphics (SVG) + Copyright 2001, 2002 World Wide Web Consortium + (Massachusetts Institute of Technology, Institut National de + Recherche en Informatique et en Automatique, Keio University). + All Rights Reserved. + + Permission to use, copy, modify and distribute this RELAX NG schema + for SVG and its accompanying documentation for any purpose and without + fee is hereby granted in perpetuity, provided that the above copyright + notice and this paragraph appear in all copies. The copyright holders + nor the author make no representation about the suitability of this + RELAX NG schema for any purpose. + + It is provided "as is" without expressed or implied warranty. + + Author: Masayasu Ishikawa (mimasa@w3.org) + $Id: svg11.rng,v 1.1 2003/07/15 07:11:10 dean Exp $ + + This is the driver file for version 1.1 of the SVG RELAX NG schema. + + The DTD version is identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//DTD SVG 1.1//EN" + SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" + + Use this URI to identify the default namespace: + + "http://www.w3.org/2000/svg" + + + + + Container Attribute Module + + + + + + Viewport Attribute Module + + + + + + Paint Attribute Module + + + + + + Paint Opacity Attribute Module + + + + + + Graphics Attribute Module + + + + + + Document Events Attribute Module + + + + + + Graphical Element Events Attribute Module + + + + + + Animation Events Attribute Module + + + + + + XLink Attribute Module + + + + + + External Resources Attribute Module + + + + + + Structure Module (required) + + + + + + Conditional Processing Module + + + + + + Image Module + + + + + + Style Module + + + + + + Shape Module + + + + + + Text Module + + + + + + Marker Module + + + + + + Color Profile Module + + + + + + Gradient Module + + + + + + Pattern Module + + + + + + Clip Module + + + + + + Mask Module + + + + + + Filter Module + + + + + + Cursor Module + + + + + + Hyperlinking Module + + + + + + View Module + + + + + + Scripting Module + + + + + + Animation Module + + + + + + Font Module + + + + + + Extensibility Module + + + + + + The root element is "svg". + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xenc-schema.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xenc-schema.rng new file mode 100644 index 0000000..972a879 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xenc-schema.rng @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/applet.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/applet.rng new file mode 100644 index 0000000..dbdef46 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/applet.rng @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/attribs.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/attribs.rng new file mode 100644 index 0000000..2616a5c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/attribs.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/base.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/base.rng new file mode 100644 index 0000000..e0f30bf --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/base.rng @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-form.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-form.rng new file mode 100644 index 0000000..d0c4075 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-form.rng @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + get + post + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + checked + + + + + + + + + + + + + + + + + + + + + + + + + text + password + checkbox + radio + submit + reset + hidden + + + + + + + + + + + + + + + + + + + + + + + + + multiple + + + + + + + + + + selected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-table.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-table.rng new file mode 100644 index 0000000..5855b4d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/basic-table.rng @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + + + + + top + middle + bottom + + + + + + + + + + row + col + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/bdo.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/bdo.rng new file mode 100644 index 0000000..7e5c7c6 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/bdo.rng @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + ltr + rtl + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/csismap.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/csismap.rng new file mode 100644 index 0000000..02004b8 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/csismap.rng @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + nohref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect + circle + poly + default + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/datatypes.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/datatypes.rng new file mode 100644 index 0000000..eac3e34 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/datatypes.rng @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/edit.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/edit.rng new file mode 100644 index 0000000..c9c0f13 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/edit.rng @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/events.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/events.rng new file mode 100644 index 0000000..a408c1e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/events.rng @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/form.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/form.rng new file mode 100644 index 0000000..80dd016 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/form.rng @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disabled + + + + + readonly + + + + + + + + + + + + + + + + + + + + image + button + + + + + + + disabled + + + + + + + + + + + + + disabled + + + + + + + + + + + + + + + + + + + + + + + disabled + + + + + + + + + + + disabled + + + + + readonly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + button + submit + reset + + + + + + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/frames.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/frames.rng new file mode 100644 index 0000000..c3887d9 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/frames.rng @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + noresize + + + + + + yes + no + auto + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/hypertext.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/hypertext.rng new file mode 100644 index 0000000..e880ebb --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/hypertext.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/iframe.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/iframe.rng new file mode 100644 index 0000000..07a9187 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/iframe.rng @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + auto + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/image.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/image.rng new file mode 100644 index 0000000..6bc5d6c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/image.rng @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/inlstyle.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/inlstyle.rng new file mode 100644 index 0000000..e7342fb --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/inlstyle.rng @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/legacy.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/legacy.rng new file mode 100644 index 0000000..19e1983 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/legacy.rng @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + all + right + none + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + left + center + right + + + + + + noshade + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + bottom + left + right + + + + + + + + + + + + + + + + + + + top + middle + bottom + left + right + + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nowrap + + + + + + + + + + + + + + + + + + + + + + + + + + compact + + + + + + + + + left + all + right + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/link.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/link.rng new file mode 100644 index 0000000..8361603 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/link.rng @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/list.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/list.rng new file mode 100644 index 0000000..cc5c42e --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/list.rng @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/meta.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/meta.rng new file mode 100644 index 0000000..cf58c86 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/meta.rng @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/nameident.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/nameident.rng new file mode 100644 index 0000000..59b260c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/nameident.rng @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/object.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/object.rng new file mode 100644 index 0000000..70f4df0 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/object.rng @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + declare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/param.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/param.rng new file mode 100644 index 0000000..88e887f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/param.rng @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + data + ref + object + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/pres.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/pres.rng new file mode 100644 index 0000000..3a0cf84 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/pres.rng @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ruby.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ruby.rng new file mode 100644 index 0000000..ace6e9c --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ruby.rng @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/script.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/script.rng new file mode 100644 index 0000000..7d2017b --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/script.rng @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + defer + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ssismap.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ssismap.rng new file mode 100644 index 0000000..460c54f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/ssismap.rng @@ -0,0 +1,14 @@ + + + + + + + + + ismap + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/struct.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/struct.rng new file mode 100644 index 0000000..a68fe9b --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/struct.rng @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/style.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/style.rng new file mode 100644 index 0000000..610b8f4 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/style.rng @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/table.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/table.rng new file mode 100644 index 0000000..4373b64 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/table.rng @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + justify + char + + + + + + + + + + + + + + + + + + + + top + middle + bottom + baseline + + + + + + + + + + row + col + rowgroup + colgroup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void + above + below + hsides + lhs + rhs + vsides + box + border + + + + + + + + + + none + groups + rows + cols + all + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/target.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/target.rng new file mode 100644 index 0000000..a5fc723 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/target.rng @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/text.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/text.rng new file mode 100644 index 0000000..fb14fa8 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xhtml/text.rng @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + preserve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xmldsig-core-schema.rng b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xmldsig-core-schema.rng new file mode 100644 index 0000000..99db430 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/rng/xmldsig-core-schema.rng @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/ncx.sch b/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/ncx.sch new file mode 100644 index 0000000..64b29e9 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/ncx.sch @@ -0,0 +1,81 @@ + + + + + + + + + + pageTarget combination of value and type is not unique + + + + + + + + + first playOrder value is not 1 + + + + + + + + + Multiple navLabels with same xml:lang attribute within an NCX node + + + + + + + + + Multiple navInfos with same xml:lang attribute within an NCX node + + + + + + + + + playOrder sequence has gaps + + + + + + + + + identical playOrder values for navPoint/navTarget/pageTarget that do not refer to same target + + + + + + + + + different playOrder values for navPoint/navTarget/pageTarget that refer to same target + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/opf.sch b/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/opf.sch new file mode 100644 index 0000000..0550d12 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/sch/opf.sch @@ -0,0 +1,15 @@ + + + + + + + + + + The "id" attribute does not have a unique value! + + + + + diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/tool/Checker.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/tool/Checker.java new file mode 100644 index 0000000..098baa6 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/tool/Checker.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + */ + +package com.adobe.epubcheck.tool; + +import java.io.File; + +import com.adobe.epubcheck.api.EpubCheck; +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.util.DefaultReportImpl; + +public class Checker { + + public static void main(String[] args) { + /*if (args.length != 1) { + System.err.println("single argument expected"); + return; + }*/ + //String epubName = args[0]; + String epubName = processArguments(args); + + Report report = new DefaultReportImpl(epubName); + + if (!epubName.endsWith(".epub")) + report.warning(null, 0, "filename does not include '.epub' suffix"); + + EpubCheck check = new EpubCheck(new File(epubName), report); + if( check.validate() ) + System.out.println("No errors or warnings detected"); + else { + System.err.println("\nCheck finished with warnings or errors!\n"); + System.exit(1); // Exit with status code 1 if there were errors reported + } + } + + /** + * This method iterates through all of the arguments passed to + * main to find accepted flags and the name of the file to check. + * This method returns the last argument that ends with ".epub" + * (which is assumed to be the file to check) + * Here are the currently accepted flags: + *
+ *
-? or -help = display usage instructions + *
-v or -version = display tool version number + * + * @param args String[] containing arguments passed to main + * @return the name of the file to check + */ + public static String processArguments(String[] args) { + // Exit if there are no arguments passed to main + displayVersion(); + if(args.length < 1) { + System.err.println("At least one argument expected"); + System.exit(1); + } + + String epubName = new String(""); + + // For each element of args[], check to see if it is an accepted flag + // or if it ends in ".epub" (and is therefore the file to check) + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-version") || args[i].equals("-v")) + displayVersion(); + if(args[i].equals("-help") || args[i].equals("-?")) + displayHelp(); // display help message + if(args[i].length() > 5) + if(args[i].substring(args[i].length() - 5).equals(".epub")) + epubName = args[i]; + } + + // If an argument ended in ".epub", return it + if(!epubName.equals("")) + return epubName; + // Else no epub file to check was specified, so exit + else { + System.err.println("No .epub file to check was specified in arguments!"); + System.err.println("The tool will EXIT!"); + System.exit(1); + } + return null; + } + + /** + * This method displays a short help message that describes the + * command-line usage of this tool + */ + public static void displayHelp() { + displayVersion(); + System.out.println("When running this tool, the first argument " + + "should be the name (and path) of the file to check."); + System.out.println("This tool also accepts the following flags:"); + System.out.println("-? or -help = displays this help message"); + System.out.println("-v or -version = displays the tool's version number\n"); + } + + public static void displayVersion() { + System.out.println("Epubcheck Version " + EpubCheck.VERSION+"\n"); + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/util/CheckUtil.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/CheckUtil.java new file mode 100644 index 0000000..f67c431 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/CheckUtil.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.util; + +import java.io.UnsupportedEncodingException; + +public class CheckUtil { + + public static boolean checkString( byte[] arr, int offset, String string ) { + try { + byte[] bytes = string.getBytes("UTF-8"); + if( bytes.length + offset > arr.length ){ + return false; + } + for( int i = 0 ; i < bytes.length ; i++ ){ + if( arr[offset+i] != bytes[i] ){ + return false; + } + } + return true; + } catch( UnsupportedEncodingException e ) { + e.printStackTrace(); // internal problem: UTF-8 not supported??! + return false; + } + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/util/DefaultReportImpl.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/DefaultReportImpl.java new file mode 100644 index 0000000..b34b5ad --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/DefaultReportImpl.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package com.adobe.epubcheck.util; + +import com.adobe.epubcheck.api.Report; + +public class DefaultReportImpl implements Report { + + private String ePubName; + + public DefaultReportImpl( String ePubName ) { + this.ePubName = ePubName; + } + + public void error( String resource, int line, String message ) { + System.err.println("ERROR: "+ ePubName + (resource == null ? "" : "/" + resource) + + (line <= 0 ? "" : "(" + line + ")") + ": " + message ); + } + + public void warning( String resource, int line, String message ) { + System.err.println("WARNING: " + ePubName + (resource == null ? "" : "/" + resource) + + (line <= 0 ? "" : "(" + line + ")") + ": " + message ); + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/util/PathUtil.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/PathUtil.java new file mode 100644 index 0000000..48caaca --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/PathUtil.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.Stack; +import java.util.StringTokenizer; + +public class PathUtil { + + public static String resolveRelativeReference(String base, String ref) + throws IllegalArgumentException { + if( ref.startsWith("data:") ) + return ref; + try { + ref = URLDecoder.decode(ref, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new InternalError(e.toString()); // UTF-8 is guaranteed to be + // supported + } + if (ref.startsWith("#")) { + int index = base.indexOf("#"); + if (index < 0) + ref = base + ref; + else + ref = base.substring(0, index) + ref; + } else { + int index = base.lastIndexOf("/"); + ref = base.substring(0, index + 1) + ref; + } + return normalizePath(ref); + } + + public static String normalizePath(String path) + throws IllegalArgumentException { + if (path.indexOf("..") < 0) + return path; + Stack pathSegments = new Stack(); + StringTokenizer tokenizer = new StringTokenizer(path, "/"); + while (tokenizer.hasMoreTokens()) { + String pathSegment = tokenizer.nextToken(); + if (pathSegment.equals(".")) + continue; + if (pathSegment.equals("..")) { + if (pathSegments.size() == 0) + throw new IllegalArgumentException("Invalid path: " + path); + pathSegments.pop(); + } else + pathSegments.push(pathSegment); + } + StringBuffer sb = new StringBuffer(); + String sep = ""; + int len = pathSegments.size(); + for (int i = 0; i < len; i++) { + sb.append(sep); + sb.append(pathSegments.elementAt(i)); + sep = "/"; + } + return sb.toString(); + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/util/ResourceUtil.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/ResourceUtil.java new file mode 100644 index 0000000..d46114f --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/ResourceUtil.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.util; + +import java.io.InputStream; + +public class ResourceUtil { + + public static String getResourcePath(String localName) { + String classPath = ResourceUtil.class.getName().replace('.','/'); + String classPackage = classPath.substring(0,classPath.lastIndexOf("/")); + String projectPackage = classPackage.substring(0,classPackage.lastIndexOf("/")); + return projectPackage + "/" + localName; + } + + public static InputStream getResourceStream(String resourcePath) { + ClassLoader loader = ResourceUtil.class.getClassLoader(); + if( loader == null ) + return ClassLoader.getSystemResourceAsStream(resourcePath); + else + return loader.getResourceAsStream(resourcePath); + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/util/WriterReportImpl.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/WriterReportImpl.java new file mode 100644 index 0000000..4017252 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/util/WriterReportImpl.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package com.adobe.epubcheck.util; + +import java.io.PrintWriter; + +import com.adobe.epubcheck.api.Report; + +public class WriterReportImpl implements Report { + + private PrintWriter out; + + public WriterReportImpl( PrintWriter out ) { + this.out = out; + } + + public void error(String resource, int line, String message) { + out.println("ERROR: " + (resource == null ? "[top level]" : resource) + + (line <= 0 ? "" : "(" + line + ")") + ": " + message ); + } + public void warning(String resource, int line, String message) { + out.println("WARNING: " + (resource == null ? "[top level]" : resource) + + (line <= 0 ? "" : "(" + line + ")") + ": " + message ); + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLAttribute.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLAttribute.java new file mode 100644 index 0000000..be4fc4d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLAttribute.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +public class XMLAttribute extends XMLNode { + + private String value; + + XMLAttribute( String namespace, String prefix, String name, String value ) { + super( namespace, prefix, name ); + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLElement.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLElement.java new file mode 100644 index 0000000..135da91 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLElement.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +public class XMLElement extends XMLNode { + + private XMLAttribute[] attributes; + + private XMLElement parent; + + private Object privateData; + + XMLElement(String namespace, String prefix, String name, + XMLAttribute[] attributes, XMLElement parent) { + super(namespace, prefix, name); + this.attributes = attributes; + this.parent = parent; + } + + public int getAttributeCount() { + if (attributes == null) + return 0; + return attributes.length; + } + + public XMLAttribute getAttribute(int i) { + return attributes[i]; + } + + public XMLElement getParent() { + return parent; + } + + public String getAttributeNS(String ns, String name) { + if (attributes == null) + return null; + for (int i = 0; i < attributes.length; i++) { + XMLAttribute attr = attributes[i]; + String ans = attr.getNamespace(); + if (attr.getName().equals(name) + && (ans == null ? ns == null : ns != null && ans.equals(ns))) + return attr.getValue(); + } + return null; + } + + public String getAttribute(String attr) { + return getAttributeNS(null, attr); + } + + public Object getPrivateData() { + return privateData; + } + + public void setPrivateData(Object privateData) { + this.privateData = privateData; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLHandler.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLHandler.java new file mode 100644 index 0000000..f362a21 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLHandler.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +public interface XMLHandler { + + public void characters(char[] chars, int arg1, int arg2); + public void ignorableWhitespace(char[] chars, int arg1, int arg2); + public void startElement(); + public void endElement(); + public void processingInstruction(String arg0, String arg1); + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLNode.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLNode.java new file mode 100644 index 0000000..b0cd893 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLNode.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +public class XMLNode { + + private String namespace; + private String name; + private String prefix; + + XMLNode( String namespace, String prefix, String name ) { + this.namespace = namespace; + this.prefix = prefix; + this.name = name; + } + + public String getName() { + return name; + } + + public String getNamespace() { + return namespace; + } + + public String getPrefix() { + return prefix; + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLParser.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLParser.java new file mode 100644 index 0000000..9887363 --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLParser.java @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Vector; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.ext.DeclHandler; +import org.xml.sax.ext.LexicalHandler; +import org.xml.sax.helpers.DefaultHandler; + +import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.ocf.OCFPackage; +import com.adobe.epubcheck.util.ResourceUtil; +import com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.Validator; + +public class XMLParser extends DefaultHandler implements LexicalHandler, + DeclHandler { + + OCFPackage ocf; + + SAXParser parser; + + Report report; + + String resource; + + Vector contentHandlers = new Vector(); + + XMLElement currentElement; + + // ContentHandler validatorContentHandler; + Vector validatorContentHandlers = new Vector(); + + // DTDHandler validatorDTDHandler; + Vector validatorDTDHandlers = new Vector(); + + Locator documentLocator; + + static String zipRoot = "file:///epub-root/"; + + static Hashtable systemIdMap; + + HashSet entities = new HashSet(); + + static { + Hashtable map = new Hashtable(); + + // fully-resolved names + map.put("http://www.idpf.org/dtds/2007/opf.dtd", ResourceUtil + .getResourcePath("dtd/opf20.dtd")); + map.put("http://openebook.org/dtds/oeb-1.2/oeb12.ent", ResourceUtil + .getResourcePath("dtd/oeb12.dtdinc")); + map.put("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", + ResourceUtil.getResourcePath("dtd/xhtml1-transitional.dtd")); + map.put("http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd", + ResourceUtil.getResourcePath("dtd/xhtml1-strict.dtd")); + map.put("http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent", ResourceUtil + .getResourcePath("dtd/xhtml-lat1.dtdinc")); + map.put("http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent", + ResourceUtil.getResourcePath("dtd/xhtml-symbol.dtdinc")); + map.put("http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent", + ResourceUtil.getResourcePath("dtd/xhtml-special.dtdinc")); + map.put("http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd", + ResourceUtil.getResourcePath("dtd/svg11.dtd")); + map.put("http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd", ResourceUtil + .getResourcePath("dtd/opf20.dtd")); + map.put("http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd", + ResourceUtil.getResourcePath("dtd/dtbook-2005-2.dtd")); + map.put("http://www.daisy.org/z3986/2005/ncx-2005-1.dtd", ResourceUtil + .getResourcePath("dtd/ncx-2005-1.dtd")); + + // non-resolved names; Saxon (which schematron requires and registers as + // preferred parser, it seems) + // passes us those (bad, bad!), work around it + map.put("xhtml-lat1.ent", ResourceUtil + .getResourcePath("dtd/xhtml-lat1.dtdinc")); + map.put("xhtml-symbol.ent", ResourceUtil + .getResourcePath("dtd/xhtml-symbol.dtdinc")); + map.put("xhtml-special.ent", ResourceUtil + .getResourcePath("dtd/xhtml-special.dtdinc")); + + systemIdMap = map; + } + + public XMLParser(OCFPackage ocf, String entryName, Report report) { + this.report = report; + this.resource = entryName; + this.ocf = ocf; + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + boolean hasXML11 = false; + + // XML predefined + entities.add("gt"); + entities.add("lt"); + entities.add("amp"); + entities.add("quot"); + + try { + hasXML11 = factory + .getFeature("http://xml.org/sax/features/xml-1.1"); + } catch (Exception e) { + } + if (!hasXML11) { + System.err + .println("Your configuration does not support XML 1.1 parsing"); + System.err + .println("\tAre you using off-the-shelf saxon.jar? It contains file named"); + System.err + .println("\tMETA-INF/services/javax.xml.parsers.SAXParserFactory"); + System.err + .println("\tThis interferes with Java default XML-1.1-compliant parser."); + System.err + .println("\tEither remove that file from saxon.jar or define"); + System.err + .println("\tjavax.xml.parsers.SAXParserFactory system property"); + System.err.println("\tto point to XML-1.1-compliant parser."); + } + try { + parser = factory.newSAXParser(); + XMLReader reader = parser.getXMLReader(); + reader.setDTDHandler(this); + reader.setContentHandler(this); + reader.setEntityResolver(this); + reader.setErrorHandler(this); + try { + reader.setProperty( + "http://xml.org/sax/properties/lexical-handler", this); + reader.setProperty( + "http://xml.org/sax/properties/declaration-handler", + this); + } catch (SAXNotRecognizedException e) { + e.printStackTrace(); + } catch (SAXNotSupportedException e) { + e.printStackTrace(); + } + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } + } + + public void addXMLHandler(XMLHandler handler) { + contentHandlers.add(handler); + } + + public void addValidator(XMLValidator xv) { + PropertyMapBuilder propertyMapBuilder = new PropertyMapBuilder(); + propertyMapBuilder.put(ValidateProperty.ERROR_HANDLER, + (ErrorHandler) this); + Validator validator = xv.schema.createValidator(propertyMapBuilder + .toPropertyMap()); + ContentHandler contentHandler = validator.getContentHandler(); + if (contentHandler != null) + validatorContentHandlers.add(contentHandler); + DTDHandler dtdHandler = validator.getDTDHandler(); + if (dtdHandler != null) + validatorDTDHandlers.add(dtdHandler); + } + + static final byte[][] utf16magic = { { (byte) 0xFE, (byte) 0xFF }, + { (byte) 0xFF, (byte) 0xFE }, { 0, 0x3C, 0, 0x3F }, + { 0x3C, 0, 0x3F, 0 } }; + + static final byte[][] ucs4magic = { { 0, 0, (byte) 0xFE, (byte) 0xFF }, + { (byte) 0xFF, (byte) 0xFE, 0, 0 }, + { 0, 0, (byte) 0xFF, (byte) 0xFE }, + { (byte) 0xFE, (byte) 0xFF, 0, 0 }, { 0, 0, 0, 0x3C }, + { 0, 0, 0x3C, 0 }, { 0, 0x3C, 0, 0 }, { 0x3C, 0, 0, 0 } }; + + static final byte[] utf8magic = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }; + + static final byte[] ebcdicmagic = { 0x4C, 0x6F, (byte) 0xA7, (byte) 0x94 }; + + static boolean matchesMagic(byte[] magic, byte[] buffer) { + for (int i = 0; i < magic.length; i++) + if (buffer[i] != magic[i]) + return false; + return true; + } + + static String sniffEncoding(InputStream in) throws IOException { + // see http://www.w3.org/TR/REC-xml/#sec-guessing + byte[] buffer = new byte[256]; + in.mark(buffer.length); + int len = in.read(buffer); + in.reset(); + if (len < 4) + return null; + for (int k = 0; k < utf16magic.length; k++) + if (matchesMagic(utf16magic[k], buffer)) + return "UTF-16"; + for (int k = 0; k < ucs4magic.length; k++) + if (matchesMagic(ucs4magic[k], buffer)) + return "UCS-4"; + if (matchesMagic(utf8magic, buffer)) + return "UTF-8"; + if (matchesMagic(ebcdicmagic, buffer)) + return "EBCDIC"; + + // some ASCII-compatible encoding; read ASCII + int asciiLen = 0; + while (asciiLen < len) { + int c = buffer[asciiLen] & 0xFF; + if (c == 0 || c > 0x7F) + break; + asciiLen++; + } + + // read it into a String + String header = new String(buffer, 0, asciiLen, "ASCII"); + int encIndex = header.indexOf("encoding="); + if (encIndex < 0) + return null; // probably UTF-8 + + encIndex += 9; + if (encIndex >= header.length()) + return null; // encoding did not fit! + + char quote = header.charAt(encIndex); + if (quote != '"' && quote != '\'') + return null; // confused... + + int encEnd = header.indexOf(quote, encIndex + 1); + if (encEnd < 0) + return null; // encoding did not fit! + + String encoding = header.substring(encIndex + 1, encEnd); + return encoding.toUpperCase(); + } + + public void process() { + try { + InputStream in = ocf.getInputStream(resource); + if (!in.markSupported()) + in = new BufferedInputStream(in); + String encoding = sniffEncoding(in); + if (encoding != null && !encoding.equals("UTF-8") + && !encoding.equals("UTF-16")) { + report.error(resource, 0, + "Only UTF-8 and UTF-16 encodings are allowed for XML, detected " + + encoding); + } + InputSource ins = new InputSource(in); + ins.setSystemId(zipRoot + resource); + parser.parse(ins, this); + in.close(); + } catch( MalformedByteSequenceException e ) { + report.error(resource, 0, "Malformed byte sequence: " + e.getMessage() + " Check encoding"); + } catch (IOException e) { + report.error(null, 0, "I/O error reading " + resource); + } catch (IllegalArgumentException e) { + report.error(null, 0, "could not parse " + resource + ": " + + e.getMessage()); + } catch (SAXException e) { + report.error(resource, 0, e.getMessage()); + } + } + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + String resourcePath = (String) systemIdMap.get(systemId); + if (resourcePath != null) { + InputStream resourceStream = ResourceUtil + .getResourceStream(resourcePath); + if (systemId.equals("xhtml-lat1.ent") + || systemId.equals("xhtml-symbol.ent") + || systemId.equals("xhtml-special.ent")) { + System.err + .println("A problem in XML parser detected: external XML entity URLs are not resolved"); + System.err + .println("\tPlease configure your runtime environment to use a different XML parser"); + System.err + .println("\t(e.g. using javax.xml.parsers.SAXParserFactory system property)"); + } + InputSource source = new InputSource(resourceStream); + source.setPublicId(publicId); + source.setSystemId(systemId); + return source; + } else if (systemId.startsWith(zipRoot)) { + String rname = systemId.substring(zipRoot.length()); + if (!ocf.hasEntry(rname)) + throw new SAXException("Could not resolve local XML entity '" + + rname + "'"); + if (!ocf.canDecrypt(rname)) + throw new SAXException("Could not decrypt local XML entity '" + + rname + "'"); + InputStream resourceStream = ocf.getInputStream(rname); + InputSource source = new InputSource(resourceStream); + source.setPublicId(publicId); + source.setSystemId(systemId); + return source; + } else { + report.warning(resource, 0, "Unresolved external XML entity '" + + systemId + "'"); + InputStream urlStream = new URL(systemId).openStream(); + InputSource source = new InputSource(urlStream); + source.setPublicId(publicId); + source.setSystemId(systemId); + return source; + + } + } + + public void notationDecl(String name, String publicId, String systemId) + throws SAXException { + int len = validatorDTDHandlers.size(); + for (int i = 0; i < len; i++) { + ((DTDHandler) validatorDTDHandlers.elementAt(i)).notationDecl(name, + publicId, systemId); + } + } + + public void unparsedEntityDecl(String name, String publicId, + String systemId, String notationName) throws SAXException { + int len = validatorDTDHandlers.size(); + for (int i = 0; i < len; i++) { + ((DTDHandler) validatorDTDHandlers.elementAt(i)) + .unparsedEntityDecl(name, publicId, systemId, notationName); + } + } + + public void error(SAXParseException ex) throws SAXException { + report.error(resource, ex.getLineNumber(), ex.getMessage()); + } + + public void fatalError(SAXParseException ex) throws SAXException { + report.error(resource, ex.getLineNumber(), ex.getMessage()); + } + + public void warning(SAXParseException ex) throws SAXException { + report.warning(resource, ex.getLineNumber(), ex.getMessage()); + } + + public void characters(char[] arg0, int arg1, int arg2) throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .characters(arg0, arg1, arg2); + } + + int len = contentHandlers.size(); + for (int i = 0; i < len; i++) + ((XMLHandler) contentHandlers.elementAt(i)).characters(arg0, arg1, + arg2); + } + + public void endDocument() throws SAXException { + int len = validatorContentHandlers.size(); + for (int i = 0; i < len; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .endDocument(); + } + } + + public void endElement(String arg0, String arg1, String arg2) + throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .endElement(arg0, arg1, arg2); + } + int len = contentHandlers.size(); + for (int i = 0; i < len; i++) + ((XMLHandler) contentHandlers.elementAt(i)).endElement(); + currentElement = currentElement.getParent(); + } + + public void endPrefixMapping(String arg0) throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .endPrefixMapping(arg0); + } + } + + public void ignorableWhitespace(char[] arg0, int arg1, int arg2) + throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .ignorableWhitespace(arg0, arg1, arg2); + } + int len = contentHandlers.size(); + for (int i = 0; i < len; i++) + ((XMLHandler) contentHandlers.elementAt(i)).ignorableWhitespace( + arg0, arg1, arg2); + } + + public void processingInstruction(String arg0, String arg1) + throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .processingInstruction(arg0, arg1); + } + int len = contentHandlers.size(); + for (int i = 0; i < len; i++) + ((XMLHandler) contentHandlers.elementAt(i)).processingInstruction( + arg0, arg1); + } + + public void setDocumentLocator(Locator locator) { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .setDocumentLocator(locator); + } + documentLocator = locator; + } + + public void skippedEntity(String arg0) throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .skippedEntity(arg0); + } + } + + public void startDocument() throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .startDocument(); + } + } + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .startElement(namespaceURI, localName, qName, atts); + } + int index = qName.indexOf(':'); + String prefix; + String name; + if (index < 0) { + prefix = null; + name = qName; + } else { + prefix = qName.substring(0, index); + name = qName.substring(index + 1); + } + int count = atts.getLength(); + XMLAttribute[] attributes = count == 0 ? null : new XMLAttribute[count]; + for (int i = 0; i < count; i++) { + String attName = atts.getLocalName(i); + String attNamespace = atts.getURI(i); + String attQName = atts.getQName(i); + int attIndex = attQName.indexOf(':'); + String attPrefix; + if (attIndex < 0) { + attPrefix = null; + attNamespace = null; + } else { + attPrefix = attQName.substring(0, attIndex); + } + String attValue = atts.getValue(i); + attributes[i] = new XMLAttribute(attNamespace, attPrefix, attName, + attValue); + } + currentElement = new XMLElement(namespaceURI, prefix, name, attributes, + currentElement); + int len = contentHandlers.size(); + for (int i = 0; i < len; i++) + ((XMLHandler) contentHandlers.elementAt(i)).startElement(); + } + + public void startPrefixMapping(String arg0, String arg1) + throws SAXException { + int vlen = validatorContentHandlers.size(); + for (int i = 0; i < vlen; i++) { + ((ContentHandler) validatorContentHandlers.elementAt(i)) + .startPrefixMapping(arg0, arg1); + } + } + + public void comment(char[] text, int arg1, int arg2) throws SAXException { + } + + public void endCDATA() throws SAXException { + } + + public void endDTD() throws SAXException { + } + + public void endEntity(String ent) throws SAXException { + } + + public void startCDATA() throws SAXException { + } + + public void startDTD(String arg0, String arg1, String arg2) + throws SAXException { + } + + public void startEntity(String ent) throws SAXException { + if (!entities.contains(ent) && !ent.equals("[dtd]")) + report.error(resource, getLineNumber(), "Entity '" + ent + + "' is undeclared"); + } + + public void attributeDecl(String name, String name2, String type, + String mode, String value) throws SAXException { + } + + public void elementDecl(String name, String model) throws SAXException { + } + + public void externalEntityDecl(String name, String publicId, String systemId) + throws SAXException { + entities.add(name); + } + + public void internalEntityDecl(String name, String value) + throws SAXException { + entities.add(name); + } + + public XMLElement getCurrentElement() { + return currentElement; + } + + public Report getReport() { + return report; + } + + public int getLineNumber() { + return documentLocator.getLineNumber(); + } + +} diff --git a/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLValidator.java b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLValidator.java new file mode 100644 index 0000000..9c32a0d --- /dev/null +++ b/thirdparty/epubcheck/src/com/adobe/epubcheck/xml/XMLValidator.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2007 Adobe Systems Incorporated + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package com.adobe.epubcheck.xml; + +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; + +import com.adobe.epubcheck.util.ResourceUtil; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.validate.auto.SchemaReceiverFactory; +import com.thaiopensource.validate.rng.SAXSchemaReceiverFactory; +import com.thaiopensource.xml.sax.XMLReaderCreator; + +public class XMLValidator { + + String schemaName; + Schema schema; + + private class ResourceEntityResolver implements EntityResolver { + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + String path = systemId; + //if( path.indexOf("basic-table.rng") >= 0 ) + // throw new RuntimeException("path is '" + path + "' schema name is '" + schemaName + "'"); + if (path.startsWith("file:/")) + path = path.substring(6); + while (path.startsWith("/")) + path = path.substring(1); + InputStream in = ResourceUtil.getResourceStream(ResourceUtil + .getResourcePath(path)); + if (in == null) + return null; + InputSource source = new InputSource(in); + source.setSystemId(systemId); + return source; + } + } + + private class XMLReaderCreatorImpl implements XMLReaderCreator { + + public XMLReader createXMLReader() throws SAXException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + try { + SAXParser parser = factory.newSAXParser(); + XMLReader reader = parser.getXMLReader(); + reader.setEntityResolver(new ResourceEntityResolver()); + return reader; + } catch (ParserConfigurationException e) { + e.printStackTrace(); + throw new SAXException(e.toString()); + } + } + + } + + // handles errors in schemas + private class ErrorHandlerImpl implements ErrorHandler { + + public void error(SAXParseException exception) throws SAXException { + exception.printStackTrace(); + } + + public void fatalError(SAXParseException exception) throws SAXException { + exception.printStackTrace(); + } + + public void warning(SAXParseException exception) throws SAXException { + exception.printStackTrace(); + } + + } + + public XMLValidator(String schemaName) { + try { + String resourcePath = ResourceUtil.getResourcePath(schemaName); + InputStream schemaStream = ResourceUtil + .getResourceStream(resourcePath); + if( schemaStream == null ) { + throw new RuntimeException("Could not find resource " + resourcePath); + } + InputSource schemaSource = new InputSource(schemaStream); + schemaSource.setPublicId("/" + schemaName); + PropertyMapBuilder mapBuilder = new PropertyMapBuilder(); + mapBuilder.put(ValidateProperty.XML_READER_CREATOR, + new XMLReaderCreatorImpl()); + mapBuilder.put(SchemaReceiverFactory.PROPERTY, + new SAXSchemaReceiverFactory()); + mapBuilder.put(ValidateProperty.ERROR_HANDLER, + new ErrorHandlerImpl()); + AutoSchemaReader schemaReader = new AutoSchemaReader(); + this.schemaName = schemaName; + schema = schemaReader.createSchema(schemaSource, mapBuilder + .toPropertyMap()); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + e.printStackTrace(); + throw new Error("Internal error: " + e + " " + schemaName); + } + } + +} diff --git a/thirdparty/epubcheck/testdocs/autotest.sh b/thirdparty/epubcheck/testdocs/autotest.sh new file mode 100644 index 0000000..ca37d02 --- /dev/null +++ b/thirdparty/epubcheck/testdocs/autotest.sh @@ -0,0 +1 @@ +java -cp ../dist/epubcheck-1.0.5.jar com.adobe.epubcheck.autotest.AutoTest ./general/tests.xml ./general/ diff --git a/thirdparty/epubcheck/testdocs/general/OPFIllegalElement.epub b/thirdparty/epubcheck/testdocs/general/OPFIllegalElement.epub new file mode 100644 index 0000000000000000000000000000000000000000..036880b87a41b03e9a3a098f65ea22c4a0934d1e GIT binary patch literal 4321 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 literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/testdocs/general/OPFIllegalElement_UniqueID.epub b/thirdparty/epubcheck/testdocs/general/OPFIllegalElement_UniqueID.epub new file mode 100644 index 0000000000000000000000000000000000000000..43addd6b895a695a5f12b2ed6ec8070a1a387f34 GIT binary patch literal 4329 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 h;urq$`Kjh*%-YMWVn|^luBR zYpaSN-CQvU2UnCk*vG}$AO?2s9XAlGGjJ1Foug7i?r8nl^n#A)P(DM@V_$iu!$a-6@@8}`fJ=~ut`G!Vofgc2w1apYH=#Z zYigD7ym4dEi_D7}MP!VqR^D?jiH2vS-hH3D0_$y)9oA)+*_Jl8?~%${1iq-G)R5<; zCWwut`Zkk!Cw8_4)3e1etb{l2ll*&8IID2J>N5a932{ZIi_%e1g6oMGxMCbI&L|sU zNwAMS#>F|?xW|>Pi^<}?*a^Bt5~j*R9zmv|WX%>4q`p9YBSA=W`bv3RKz`wGPfr5g z%hW(wLjWe!Wm@?Y7M@)Adxhs~`sb~3YZoPS#?lI>2~rnxUDt=d`84EznOozMs*zIU z2-urjKT10BKeq1(K2!`m>Jhb z`PPHTH_LUao-G;oS10+x59>}!C=M|dA6^J0t+8kwX0a)~H}|r9d-z2v{EL60W@c7e znzH3POydDdZY`+bxHx!XY6`YlhUbt9KiZm|@RNF1&wf3amtyFluN_Xq$E1F&viY+t zj)B1CqA}%^V&oiLS}s^J$8Qb$fl#h5oft~67W>x1sWdh+6`sswX|n?&qkX!+_kpdk z$3gJ*7}KIt66s?Ugjz?EhO7j8Wv3fm&?0KqnvrLPTV&^JrEsKO&JUxXi}9j$;=q0F zwJ|m^Gp@F$e^vh~P`@bLSeMFX9GTghD1NEQsoT>S-XuX9%t_}ClVlzly2&sas%oWa zH9GW!H1+yC-j|hO=qr7@fS?5B!=89g6{LsrbnD{@G$I|2kjv1eX_KTK`7RlvWRvG? z?(%uY_*>*)_$Q#!rLq#QRzU=6nFY75t0C`w&PS*+AjQYpTU-}tIa#m=rDLU{0vZ}E zn5TYkO?Pe^H60-FDfD%M3r$Ugq*hbkE=u8!zCqn$>}5TLby>JeUhExoc7+Q8%jD*+ zIw~j%%o8f?&t>LrBQQrDjP{;2f}bO$E4mduP?E31p^Jz@!(R~CSguv1sPk5VU>r!w zBJ0wN@qC^zkHUL)w88phss?eP6zOy3H7jL8oOi_wtZdS%`Hq@QF_p>Cr_eg%H!m&( z6bNp^xlFQ1$_*(v?lLMB@xKe9dipe~xZ&BfSUjI@tu`%rm&_RU+%g2ds8x-(d_(bw zWWirT?A^Go_EVZTwTL(n1a;>M0`B`nq{16cPH5P0zUp+_bwLa* zcOAoxg(nm8qoyzt9pZ^}q)VPIH>tNDtT9B8j|4aN@qE8|Ui)^Din+Vf28C8H%?Cvn z2kf%B^_$K-H6NR{{UEz?SKgHY*7cVD-xQL@4KJDLu~$KZv33GFcKd5DKM0MqknJk< z-UBc}NPx0AG09>ME5Y?iyfBa%POza!Qc<6(HdN!fHv_{vmE{zO>`afL{%+(%rTx+! zsaPbEG!SWF0)g;v7-vqA80=ZjVd)L+gm3~e&~G6HfRA5wDHU_nX^L&!*4AH&UM>3i z_CB5RlM7;uU7{6K_{U!2Mt6gEcWgiRL9)kbUtL{YMH&XCygFP|kusMQCdIx4H}8gI z)hayi1u&U1vo(Xg(HZ&7a)j z3syqz9%PFlZNDn`QK_)j9&CZ~T8^QnhZA9rN4iVsII?qNRNcyR5cK0klxf>~e;m$a zUXZQ82?@`ds1KVSjzPFtNiKq-9f$#;+&q2OxSsmeDQi2$L4ZcBb_2TcgQmd&m;UeXA!-obI(+=)Yjz@ zPUOVZ_hMi8qA;5Nt?ASG?J+4S0TAa~;a9NCIg*nmGKjeVKhS}AHV;Z9cb7W;hX zcx@~pLKBjt4tcS6f%i9K-%3t~mwLny)w_xmhg4L-zKRaHvo6I8s*-odmR1-9n3{7E zesn(ScQBOHbGyN{|iHdik=vDi{b zXzF52co`P(PT~Nd5}z^$GZBk5AZ*U{#mWhk>+b<{<3L0NRh!1AT7v z6rLXNLcT1j*xXqjVTzA@u)ZkoQK(Xhl|jrUb-|0CXPJzO%|(@q!S-l=#X54MhYA)| zlgaljEZkL)j*NJ#hb+Tk>(?^496qY%%i!oQ*EbkQRpG zEy=s^?q7~cNaAa0rH@o`6 zfNgU%Snmmgl?Tn>5?-0p4_jF7l8O8_yFGwqo!W5M@3@@82QZJd1V_tSMrWt;8Km;A!d=$3j^(Va^vWxmw* zPWmD_^eT$taP<^mJ8?5_vcgEukHEY8_1 zLT=1#ZO~@l&W4GG@+RtLnZNloZtV4XNv^5fTGmO1-_!B9XQ4EtJg_9FLwG>{k>1mZ z18Kk6#N}E_%be796YW)n6iJWftAZqKKF?*|0#a&k@vq~(R^6Uvgj!qKvRKAUfh*$O z9(_;MbbIxAR%7L=ZHqvEgff+js+4C}r9)-VJ%bd#`iQn78F>xT-u{;4CtscpqcXZ_ z3|pJr)Y7?79#ujGtZGh*_Sf)|^&fl6s*elSKzXM0;jRLA`-JWI1e@n>=FQ@Bc4>GI zGyNGO{X1K|{E#`i&l{W_5t8FC+x|;bC6cqil^lcWt1i zU@z94q2Pwc0A9M1D)QgtkHBgT(!*N(OiItCU5>+4!yn+Z{f0jV$gCbsuORxR-byJR z(fs?Q=XU)-8%_cMB#;6Cbbp`pFm6b&E7B)Ae$X{olraovMHtv=WWSa2o)MN~nJj%J z#d5V`KpXlTC?~kStVWSDVO#OqL;HlF7-*)DU-5+9piakqO|PS3+2%(Rm)*+pqI~iN z4g=otMj>WBCDta#&1%YI7uzJVv1<86K(Eo00hV$Wl4sidn!niuR&Tje;TrIB7g#tx z0Gt4tSub}Okh*ST_fHf>2b_A_b9cEzJ2aqrA5b}Ppz!rCdXaNWaZrsc^A|%)!{#^~~W1C99Ih~MpY^!|2#)hh@J#G={T*TP_7uT8`}1PUUN*EC{Uho`NV49G$@Eq1Is<6(eQ1cAbgiBN*?Il zy!);eane{#Ms6_q>AEIU)>p5ba7kVA!P6X)EtSA9bh`~s$Z@I?fb||sow+p3@zMwC#J~p2-(=J_-&L4G6dEw~Y3;Q&Pi1w;vfx4K1QO0N}Qs$w)T(i^)SBTl9Ef zQT$vF<`{RDEIK^_0F(2ooLBZIH-Z^Da4Y0rsbdPbTf@3x)(~EMpSjlptYLnR$?P~Z zsfFt_{%MGx_K$&E$>Ko~r>FAsgQF34C>I3!v}l$)oeL8cZldDqArG?0V9>H6BHrHK zUGP3J#- z>=TLq!^fY={a5I(>F6gEL;E-MAIa%2{Quj(Kk*^NAIl$){>N@Uh0_53e>D7rW6u8t X|3_@VH7O`hO{j=h4Uryd;HmaMe`wn> literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/testdocs/general/Test.epub b/thirdparty/epubcheck/testdocs/general/Test.epub new file mode 100644 index 0000000000000000000000000000000000000000..52d9b786f501d81530637e4f36e703f1fa442049 GIT binary patch literal 4322 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 XodJiElKnbDcK-OB=Vx&F*Y1A+jscR) literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/testdocs/general/UniqueIDNotUsed.epub b/thirdparty/epubcheck/testdocs/general/UniqueIDNotUsed.epub new file mode 100644 index 0000000000000000000000000000000000000000..0da2877fb572f78806c76c2682ce27f4ebeceff1 GIT binary patch literal 4322 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 + + + PageMap.epub + This ePub has a PageMap. Having a page-map will cause a validation error. + + 1 + 0 + + + + OPFIllegalElement_UniqueID.epub + This ePub has an illegal element in the opf, and is missing the unique-id. + + 2 + 0 + + + + OPFIllegalElement.epub + This ePub has an illegal element in the opf. + + 1 + 0 + + + + Test.epub + This ePub is valid. + + 0 + 0 + + + diff --git a/thirdparty/epubcheck/testdocs/issues/Issue21.epub b/thirdparty/epubcheck/testdocs/issues/Issue21.epub new file mode 100644 index 0000000000000000000000000000000000000000..865590eb1c96e2c39e29c073102a310460d62a1d GIT binary patch literal 4316 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 Tfbho=!t2NVIzM&tAG?16zE+b( literal 0 HcmV?d00001 diff --git a/thirdparty/epubcheck/testdocs/issues/Issue25.epub b/thirdparty/epubcheck/testdocs/issues/Issue25.epub new file mode 100644 index 0000000000000000000000000000000000000000..1992e77e0b74b5ddb4d355afbff5ec7462f304ca GIT binary patch literal 259264 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�rd3rb_02zJLyCLWJ??bg9`<&Ka65uJD@W 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 + + + Issue21.epub + NCX has wrong media-type in the OPF. + + 1 + 0 + + + + Issue25.epub + The toc attribute is missing from the spine (it is a required attribute.) + + 1 + 0 + + + diff --git a/Skripten/tralics b/thirdparty/tralics-2.14.4 similarity index 100% rename from Skripten/tralics rename to thirdparty/tralics-2.14.4 diff --git a/thirdparty/tralics-2.15.2/COPYING b/thirdparty/tralics-2.15.2/COPYING new file mode 100644 index 0000000..cb2fbbf --- /dev/null +++ b/thirdparty/tralics-2.15.2/COPYING @@ -0,0 +1,57 @@ +Tralics is a software that comes with 1) the sources files, +2) some test files, 3) some utilitary files, 4) the documentation. + +The distribution includes 1, 2 and 3. Some utilitary files are +copies, or modifications of files found on the WEB, with their own +copyright notice (see the README file for the list of these files). + +The source files are Copyright by Inria, see notice below. + +The test files are some TeX files that can be translated by tralics. +You can use or modify them as you wish. +If you distribute a modified version of Tralics, make sure that +the script alltests runs. + + +If you modify the raweb configuration file, confdir/ra.tcf, +or a file of the form ra2007.tcf, +you should modify or remove the line containing `tralics ident', +as explained in the file. + +In case of problem contact : tralics@sophia.inria.fr +or consult the Web page: http://www.inria.fr/apics/tralics + +------------------------------------------------------------------- +Copyright notice for Tralics: + +This software is a computer program whose purpose is to +translate LaTeX documents into XML format. + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +As a counterpart to the access to the source code and rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors have only limited +liability. + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. + +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + + + diff --git a/thirdparty/tralics-2.15.2/ChangeLog b/thirdparty/tralics-2.15.2/ChangeLog new file mode 100644 index 0000000..5b7f00c --- /dev/null +++ b/thirdparty/tralics-2.15.2/ChangeLog @@ -0,0 +1,337 @@ + + + + + + + + + + ChangeLog for TRALICS + + + + + +

ChangeLog for the Tralics software

+

See file Old ChangeLog for older versions. +Patches to current version (2.15) start here +

+ + +

History

+ + + +

Version 2.12

+
    +
  1. [2008-04-21, version 2.12] +
    [2008/04/26] Fixed the bug \mathcode`x="8000$\mbox{x}$ +
    In nomathml, \relax not printed any more. +
    Fixed a bug in natbib.plt (Wagner) when \cite is + redefined. +
    Added end-of-paragraph before \end{thebibliography} +
  2. +
  3. [2008-05-18, version 2.12.1] +
    Fixme. Font changes in tables are incorrect... +
    Implemented \natcite +
    Changed \bibitem, calls \ignorespaces, + produces a bibitem element +
    Bug fix: declaration xml_pack_font_att = "true" is honored. +
    Changed \mathversion{bold}$\mathnormal x$ to produce bold. +
    Implemented tipa package. +
    Bug fix $\hbox{{\ensuremath{x}y}}$ is OK +
    Implemented bold math Greek letter (Wagner) +
  4. +
  5. [2008-05-29, version 2.12.2] +
    Newline is OK in \zap@space +
    Changed \: to medmuskip +
    Use <unexpected> for junk in table (Wagner) +
    Allow any kind of space in text in math (Wagner) +
  6. +
  7. [2008-06-06, version 2.12.3] +
    Implemented \formulaattribute in no-mathml mode (Vishwakarma) +
    Added a textype attribute for all <texmath> objects +
    Special commands like \tralics@prompt added +
    Added raw_bib as command line option +
    Translation of \begin{table} \begin{tabular} is a tabular. + (Wagner) +
    Fixed default type for masterthesis. +
    The \calc command is mode independent (Vishwakarma) +
  8. +
  9. [2008-06-20, version 2.12.4] +
    Moved declaration of uint from txvars to tralics.h (Leopard) +
    Removed a bibtex error if no author/editor +
    Expansion of \u z is + \@unicode@composite {z^^^^0306} (T. Bouche) +
    Commands like \bar do not look anymore for \relax (T. Bouche) +
  10. +
  11. [2008-07-04, version 2.12.6] +
    [2008-07-08] Default value of \pers + is \persB +
    Removed restrictions on participants, catperso, etc. +
    Distribution comes in two files: tralics-src and tralics-extra +
    Removed use of file ../xml/tralics.sty in test files. +
    Removed function only_for_module and associated statistics. +
    Made Tralics less verbose for image info. +
    Renamed default_year to ra_year, associated to \ra@year +
    Added two source files txra and txconfig. +
    Complete redesign of the RA stuff (Tex code in ra.plt ra2008.clt) +
    Removed the value field in the ParamDataSlot +
    Removed side-effects in check_ns::check_section +
    Biblio inserts \csname @href\endcsname + in case \href is redefined +
    No \href added if the URL field has \rrrt +
    Removed file txcheck. +
    Removed all special hacks for the RA, todo_xml etc. +
    Changed \XMLaddatt : argument fully translated. + Special chars maybe handled differently +
  12. +
+ +

Version 2.13

+
    +
  1. [2008-07-20, version 2.13.0] +
    Fixed \end{...} if in env that finishes the math +
    Removed SansTitre etc +
    Made \ra@jobname work in any case +
    Removed printing of Option -year= ignored +
    Added a fifth small size +
    Added \@xsetfontsize and \@xgetfontsize +
    [2008-09-16] Implemented amsart class +
    Added an id-text attribute to most anchors +
    Implemented \refstepcounter +
    Implemented \notag and \incr@eqnum +
    Changed \thechapter etc in standard classes +
    Replaced \stepcounter by \refstepcounter in ra.plt +
    Defined the command \AmS, as well as the ten + analogous of \Hat in the amsmath package +
    Created a soul package, moved 4 commands into it +
    Added commands of type \labelenumi +
    Added commands of type \p@enumii +
    Implemented \newtheorem* +
    Hack the case where a theorem starts with a display formula. +
    Implemented \hdotsfor as a line of dots +
    Change which equations are numbered +
    Allow \char`\\ in text in math +
    Changed \stepcounter and \@killcounter +
    Fixed a bug in \XMLlastid +
    Added \everybibitem +
    Added \XMLgetatt +
    Re-implemented attlisttable. +
    Removed the AttListTable structure, uses vector instead +
  2. +
  3. + [2008-10-03, Version 2.13.1] +
    Removed all hacks concerning year field for the raweb +
    [2008-10-16] Added special case of \ChangeElementName{theorem}{xx} + when second argument is empty or starts with space. +
    Fixed a bug: the anchor is always the theorem element, + if name is empty, then attribute list is copied to + the <p> that follows. +
    Changed figure filename handling: ./ no more removed +
    Implemented transation of optional argument of divisions and + \caption. Value put in a <alt_head> + may be changed in config via alt_section or alt_caption +
    Fixed translation of \bindnasrepma from U+260B to U+214B +
    Fixed some math envs (e.g. align), by providing a non-empty id-text value. +
    Added option -no_float_hack +
    Obsoleted options nobibyearerror and nobibyearmodify. +
    Removed parametrisation of raweb topics. +
    Use other counters for itemize than for enumerate +
    Moved the \glo command and glossaire env in in ra.plt +
    Fixed translation of \quad and others in nonmathml mode in \mbox +
    Added some Win32 conditionals in readline.C +
    Feature: optional argument in enumerate does not change + the type to description +
    Added a label attribute to items in enumerate env +
    Added enumi@hook (Brian West) +
    Moved \labelitemXXX from std.clt to the kernel +
    Added a default label, just in case +
    Removed evaluation of font commands in nomathml mode (Mukesh Kumar) +
    Added command name of \hbox in the tree for nomathml + mode (Mukesh Kumar) +
    Removed interpretation of \hbox in nomathml mode +
    Removed the bibtex warning: You should use {\'e} rather than \'{e}. +
  4. +
  5. + [2008-10-27, Version 2.13.3] +
    Fix a bug in wrapfigure +
    Implemented package epigraph +
    Added missing line number in error message for missing close brace +
    Allow expansion of arguments of \begin, \end +
    Improved error handling of \def\xx#1{}\begin{\xx}. +
    Changed \hspace{2.cm} in math mode, result always a + dimension in pt, works even after \mathcode`\.="8000 +
    Implemented package esdiff. +
    Implemented full graphics package +
    Implemented optional arg of \rotatebox +
    Implemented colors +
    Implemented commands like \textsevenoldstyle. +
    Fixed a bug in function read_from_file (core dump on gcc-3.3.3) +
    Added a verse environment +
    Fixed \@latex@error and others. +
    Moved moreinfo in a style file +
  6. +
  7. + [2008-11-13, Version 2.13.4] +
    Allow \fbox{\[ x\]} +
    Allow \fbox{\begin{tabular}{c} x & y \end{tabular}} +
    At most four digits are read for the year +
  8. +
  9. + [2008-11-17, Version 2.13.5] +
    Added \XMLref +
    Fixed underscores and hat: these characters are allowed if + InLoadHandler. OK in \XMLaddatt. +
    Removed runaway argument error in use of \@reevaluate +
    Fixed \bmod (Bouche) +
  10. +
  11. + [2009-10-05, Version 2.13.6] +
    Added \XMLref +
    Added kvoptions, float package +
    Changed \ClassError to put something in the XML +
    Bug correction detected by compiler. (Hashtab ctor; cmd ifdefinable; cmd ltfont) +
    Added parentheses as suggested by compiler. +
  12. +
  13. + [2009-10-14] +
    Corrected printing of command names like & in error elements +
    Removed theme if year > 2008 for the RA +
    Thus, file testerr tested with year=2008. +
    Added test files for RA2009 +
    Added list of fields/entries not to use in the Biblio +
    Changed warning for Lille +
    [2010-03-31] Added a hack for primes in math mode +
    Some math-mode names can be changed +
    Corrected a bug in printing of very large characters +
  14. +
  15. + [2010-10-25, Version 2.13.7] +
    Input file encoding algorithm improved. +
    Corrrected new ColSpec::ColSpec (...) (thanks to + Daniel Simon) +
  16. +
+

Version 2.14

+
    +
  1. [2011-01-24, Version 2.14.1] +
    [bibtex] Added the serial number to the bibtex sort key +
    [txmath] Corrected tracing of $\hspace{2mm}$ +
    Improved printing of math tokens in case of fonts +
    Corrected translation of \left in nomath-2 + mode +
    Added \negmedspace \negthickspace +
    Corrected error message for \sin\int outside + math +
    Corrected \left\updownarrow in nomathml mode +
    [amsmath.plt] Changed definition of xxalignat + and Co. Corrected the no-mathml translation. +
    No label generated for starred version + of align env. +
    Implemented dual mathmode in case \@nomathl=-3 +
    Argument of \bibliography may contain a + trailing bib extension (Eric Bischoff) +
    [2011/04/11] Added \tableattribute env. +
    No error in missing_flush if buffer contains only + of spaces. +
    No error in cases like $\mbox{\hspace {2mm}}$. +
    Implemented \bordermatrix +
    Improved some error messages +
  2. +
  3. + [2011-05-02, Version 2.14.3] released +
    Fixed the font/size/color in \footnote +
    Allows \ChangeElementName{use_font_elt}{true} +
    Implemented \appendix in classes. +
    Commands like \newpage implicitly call \par +
    Added \nouppercase + and \fancypagestyle commands in fancyhdr.plt +
    Implemented \listoftables and + \listoffigures +
    Command \tableofcontents finishes a paragraph + and inserts the value of tocdepth counter. +
    Corrected error message in case of bad hbox. Produces a + <merror> element +
  4. +
  5. + [2011-11-07, Version 2.14.4] released +
    Removed final + <allowbreak/> in url [2012-01-19, V Lefevre] +
    IO encoding easier to understand in the transcript file +
    Added an option -dualmath, and -nomathml reverted + to old meaning +
    Changed printing of some characters +
    Extended the four-hat notation to five hats +
    Implemented a starred version \url* +
    Added the \grabenv command +
    Default output encoding is UTF8 +
    Translation of \phi is &phiv;&#x3D5; + i.e., ϕ, translation of \varphi also changed. +
    Translation of \longmapsfrom\Longmapsfrom\longmapsto\Longmapsto$ + is now &#x27FB;&#x27FD;&&#x27FC;&#x27FE; +⟻⟽⟼⟾ (Heiko Schroeder) +
  6. +
  7. + [2012-07-06, Version 2.14.5] released +
    Added a possibility to specify an XML style sheet +
    No terminator needed after a display math formula in interactive + mode (Allen Downey) +
    Sections in raweb mode may be mandatory +
  8. +
+

Version 2.15

+
    +
  1. + [2012-08-31, Version 2.15.0] +
    [2013-01-21] Number of pages always inserted in the bibliography + [2013-07-22, Version 2.15.1] +
    Removed some unused variables in the code [Julien Schueller] +
    There are no more affiliations in the RA2013 (Marie-Pierre Durollet) +
    Replaced 2007 by current year in + The configuration file for the RA is ra2007.tcf or + ra.tcf. +
    [2014-03-31] A module cannot start in a paragraph; + implicit \par added (Marie-Pierre Durollet) +
  2. +
  3. [2015-01-22, Version 2.15.2] +
    [2015-01-22] corrected a bug in printing the encoding of the + transcript file (David Binderman) +
    If the save stack holds a font command, this is popped at the + end of the process (it might be pushed by a + global \normalfont) +
    The types of the objects remaining on the save stack is + printed on the transcript file at the ebnbd of the process. +
  4. + +
+ +
+

+Valid XHTML 1.0 Strict +back to home page +© INRIA 2005-2015 +Last modified $Date: 2015/01/22 14:12:18 $ +

+ + + + diff --git a/thirdparty/tralics-2.15.2/Copyright b/thirdparty/tralics-2.15.2/Copyright new file mode 100644 index 0000000..fe0cd12 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Copyright @@ -0,0 +1,75 @@ +Copyright José Grimm, Inria, projet APICS. 2004, 2005, 2006, 2007, 2008 +Email: Jose.Grimm@sophia.inria.fr +Web page: http://www.inria.fr/apics/tralics + +(French version of the Copyright notice can be found after the English one) +(French and English versions of licence are provided in the files +Licence_CeCILL_V2-en.txt and Licence_CeCILL_V2-fr.txt) + + +This software is a computer program whose purpose is to +translate LaTeX documents into XML format. + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +As a counterpart to the access to the source code and rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors have only limited +liability. + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. + +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + +------------------------------------------------------------------------------ + +Copyright José Grimm, Inria, projet APICS. 2004, 2005, 2006, 2007, 2008 +Email: Jose.Grimm@sophia.inria.fr +Page web: http://www.inria.fr/apics/tralics + +Ce logiciel est un programme informatique servant à traduire +des documents du format LaTeX vers le langage XML. + +Ce logiciel est régi par la licence CeCILL soumise au droit français et +respectant les principes de diffusion des logiciels libres. Vous pouvez +utiliser, modifier et/ou redistribuer ce programme sous les conditions +de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +sur le site "http://www.cecill.info". + +En contrepartie de l'accessibilité au code source et des droits de copie, +de modification et de redistribution accordés par cette licence, il n'est +offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +seule une responsabilité restreinte pèse sur l'auteur du programme, le +titulaire des droits patrimoniaux et les concédants successifs. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs et des professionnels +avertis possédant des connaissances informatiques approfondies. Les +utilisateurs sont donc invités à charger et tester l'adéquation du +logiciel à leurs besoins dans des conditions permettant d'assurer la +sécurité de leurs systèmes et ou de leurs données et, plus généralement, +à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +pris connaissance de la licence CeCILL, et que vous en avez accepté les +termes. + + diff --git a/thirdparty/tralics-2.15.2/LISEZMOI b/thirdparty/tralics-2.15.2/LISEZMOI new file mode 100644 index 0000000..e791ec8 --- /dev/null +++ b/thirdparty/tralics-2.15.2/LISEZMOI @@ -0,0 +1,142 @@ +// Ce logiciel est régi par la licence CeCILL soumise au droit français et +// respectant les principes de diffusion des logiciels libres. Vous pouvez +// utiliser, modifier et/ou redistribuer ce programme sous les conditions +// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +// sur le site "http://www.cecill.info". +// (voir fichier Licence_CeCILL_V2-fr.txt) +// Pour plus de détails : voir la fin du fichier. + +L'archive contient six répertoires et quelques fichiers. +Les répertoires sont xml, Test, confdir, icons et src. +Pour avoir un exécutable, aller dans le répertoire src, et taper make. +(ce qui suit est une copie du fichier README en anglais) + +The src directory contains the following files + Copyright: copy of the copyriht notice + README: explains how to create the Tralics binary + Makefile : this is the Makefile + *.C *.h : the sources. + + +The confdir directory contains the following files + test.tcd cedram.tcf eurotex.tcf unused.tcf testa.tcf tpa.tcf hello.tcf + torture.tcf hello1.tcf hello3.tcf gescap.tcf tp.tcfRR.tcd rabib.tcf + -> example of tcf files + config_empty tralics_rc .tralics_rc + -> configuration files + ra.tcf : tcf file for the raweb + mpd.tex mpmath.tex : some tex files + + +The xml directory contains the following files and directories + mathml2 (directory) + -> the mathml2 DTD, version 1.12, date 2003/11/04, downloaded 2004/09/15 + (see the copyright notice in each of these files) + + fotex.sty-patched, fotex-add.sty + a patched version of fotex.sty (by Sebastian Rahtz) + (see copyright notice in the file) + (see also README file in the xml directory) + + raweb3-makecolspec.xsl raweb3-param.xsl raweb3-table.xsl + Three auxiliary style sheets, from the TEI by Sebastian Rahtz + adapted to tralics (see the copyright notice in each of these files) + + preview.xsl + Style sheet for producing small images. + + raweb3fo.xsl rrfo3.xsl + Two style sheets, used at Inria, given as example. + Inspired by from the TEI by Sebastian Rahtz. + (see the copyright notice in each of these files) + + raweb3.dtd + The Raweb DTD (for year 2003). + + raweb-cfg.sty + re-implementation of the MathML to dvi converter + (distributed under the LaTeX Project Public License ) + + tralics-iso.sty + a TeX file that defines lots of mathematical symbols + +The icons directory contains some icons to be used for the raweb + +The raweb directory contains + raweb.cls ra2006.cls + : the classes for the raweb + rawebnum.bst rawebalpha.bst rawebxml.bst raweb.bst + : bst files + Logo-INRIA-couleur.ps Logo-INRIA-couleur.pdf LogoRA2006.pdf LogoRA2006.eps + : Logos + +The main directory contains + ChangeLog : a file that describes what has changed + README : this file + LISEZMOI : French version of this file + Copyright : French/English copyright notice for Tralics + COPYING : Copyright notice for the whole package + Licence_CeCILL_V2-en.txt Licence_CeCILL_V2-fr.txt + English and french version of the CeCILL License, text version + rahandler.pl + Perl script called by tralics in case action is required + + +The Test directory contains + + torture.tex, tormath.tex fptest.tex : the 3 main testfiles + torture.bib: a bibtex associated to it + tortureaux.tex taux1.tex taux2.tex: + test file (fort testing \openin) + tpa.tex: a file for testing the titlepage stuff + lxdoc.tex : + the source of the documentation (now obsolete) + tralics-euro2003.ps : + preliminary version of the paper eurotex 20023 + +You can compile tralics issuing the make command. +A C++ compiler (like gcc version 3 or 4 is required) + +You can test the software: go into the Test directory, +run tralics on the files torture, fptest, tormath, tormath1 +The result should be: No error found. + + +In case of problem contact : Jose.Grimm@sophia.inria.fr +or consult the Web page: http://www.inria.fr/apics/tralics + +August 2006. + + +------------------- + +Ce logiciel est un programme informatique servant à traduire +des documents du format LaTeX vers le langage XML. + +Ce logiciel est régi par la licence CeCILL soumise au droit français et +respectant les principes de diffusion des logiciels libres. Vous pouvez +utiliser, modifier et/ou redistribuer ce programme sous les conditions +de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +sur le site "http://www.cecill.info". + +En contrepartie de l'accessibilité au code source et des droits de copie, +de modification et de redistribution accordés par cette licence, il n'est +offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +seule une responsabilité restreinte pèse sur l'auteur du programme, le +titulaire des droits patrimoniaux et les concédants successifs. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs et des professionnels +avertis possédant des connaissances informatiques approfondies. Les +utilisateurs sont donc invités à charger et tester l'adéquation du +logiciel à leurs besoins dans des conditions permettant d'assurer la +sécurité de leurs systèmes et ou de leurs données et, plus généralement, +à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +pris connaissance de la licence CeCILL, et que vous en avez accepté les +termes. + diff --git a/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-en.txt b/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-en.txt new file mode 100644 index 0000000..a36324d --- /dev/null +++ b/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-en.txt @@ -0,0 +1,505 @@ + + CeCILL FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[logiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial establishment, having its principal place of business at +31-33 rue de la Fédération, 75752 Paris cedex 15, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of these rights is conditional upon certain obligations +for users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +Software's suitability as regards their requirements in conditions +enabling the security of their systems and/or data to be ensured and, +more generally, to use and operate it in the same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting Software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows future Licensees unhindered access to +the full Source Code of the Software by indicating how to access it, it +being understood that the additional cost of acquiring the Source Code +shall not exceed the cost of transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the Modified Software become subject +to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Modified +Software is redistributed, the Licensee allows future Licensees +unhindered access to the full Source Code of the Modified Software by +indicating how to access it, it being understood that the additional +cost of acquiring the Source Code shall not exceed the cost of +transferring the data. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH THE GNU GPL + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL in the Modified or unmodified Software, +and distribute that entire code under the terms of the same version of +the GNU GPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +and distribute that entire code under the terms of the same version of +the GNU GPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by the current license, for the duration set forth in article 4.2. + + + 6.2 OVER THE CONTRIBUTIONS + +A Licensee who develops a Contribution is the owner of the intellectual +property rights over this Contribution as defined by applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +A Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the product's suitability for its requirements, its good working order, +and for ensuring that it shall not cause damage to either persons or +properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any Failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 2.0 dated 2005-05-21. diff --git a/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-fr.txt b/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-fr.txt new file mode 100644 index 0000000..c23aa01 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Licence_CeCILL_V2-fr.txt @@ -0,0 +1,512 @@ + + CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + + + Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation +entre ses auteurs afin que le respect de deux grands principes préside à +sa rédaction: + + * d'une part, le respect des principes de diffusion des logiciels + libres: accès au code source, droits étendus conférés aux + utilisateurs, + * d'autre part, la désignation d'un droit applicable, le droit + français, auquel elle est conforme, tant au regard du droit de la + responsabilité civile que du droit de la propriété intellectuelle + et de la protection qu'il offre aux auteurs et titulaires des + droits patrimoniaux sur un logiciel. + +Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] +L[ibre]) sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de +caractère scientifique technique et industriel, dont le siège est situé +31-33 rue de la Fédération, 75752 Paris cedex 15. + +Centre National de la Recherche Scientifique - CNRS, établissement +public à caractère scientifique et technologique, dont le siège est +situé 3 rue Michel-Ange 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, établissement public à caractère scientifique et technologique, +dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 +Le Chesnay cedex. + + + Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de +conférer aux utilisateurs la liberté de modification et de +redistribution du logiciel régi par cette licence dans le cadre d'un +modèle de diffusion en logiciel libre. + +L'exercice de ces libertés est assorti de certains devoirs à la charge +des utilisateurs afin de préserver ce statut au cours des +redistributions ultérieures. + +L'accessibilité au code source et les droits de copie, de modification +et de redistribution qui en découlent ont pour contrepartie de n'offrir +aux utilisateurs qu'une garantie limitée et de ne faire peser sur +l'auteur du logiciel, le titulaire des droits patrimoniaux et les +concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs ou des +professionnels avertis possédant des connaissances informatiques +approfondies. Les utilisateurs sont donc invités à charger et tester +l'adéquation du Logiciel à leurs besoins dans des conditions permettant +d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus +généralement, à l'utiliser et l'exploiter dans les même conditions de +sécurité. Ce contrat peut être reproduit et diffusé librement, sous +réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le +titulaire des droits patrimoniaux décide de soumettre l'exploitation aux +dispositions qu'il contient. + + + Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une +lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions +postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code +Source et le cas échéant sa documentation, dans leur état au moment de +l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et +éventuellement de Code Objet et le cas échéant sa documentation, dans +leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une +Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de +programme du Logiciel et auquel l'accès est nécessaire en vue de +modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du +Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur +sur le Logiciel Initial + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le +Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale +distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, +traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans +le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur +documentation qui permet de réaliser des fonctionnalités ou services +supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce +Module et le Logiciel s'exécutent dans des espaces d'adressages +différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte +qu'ils s'exécutent dans le même espace d'adressage. + +GNU GPL: désigne la GNU General Public License dans sa version 2 ou +toute version ultérieure, telle que publiée par Free Software Foundation +Inc. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + + + Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une +licence non exclusive, cessible et mondiale du Logiciel telle que +définie ci-après à l'article 5 pour toute la durée de protection des +droits portant sur ce Logiciel. + + + Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée +acquise du fait du premier des faits suivants: + + * (i) le chargement du Logiciel par tout moyen notamment par + téléchargement à partir d'un serveur distant ou par chargement à + partir d'un support physique; + * (ii) le premier exercice par le Licencié de l'un quelconque des + droits concédés par le Contrat. + +3.2 Un exemplaire du Contrat, contenant notamment un avertissement +relatif aux spécificités du Logiciel, à la restriction de garantie et à +la limitation à un usage par des utilisateurs expérimentés a été mis à +disposition du Licencié préalablement à son acceptation telle que +définie à l'article 3.1 ci dessus et le Licencié +reconnaît en avoir pris connaissance. + + + Article 4 - ENTREE EN VIGUEUR ET DUREE + + + 4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié +telle que définie en 3.1. + + + 4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de +protection des droits patrimoniaux portant sur le Logiciel. + + + Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur +le Logiciel pour toutes destinations et pour la durée du Contrat dans +les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou +plusieurs brevets d'invention protégeant tout ou partie des +fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas +opposer les éventuels droits conférés par ces brevets aux Licenciés +successifs qui utiliseraient, exploiteraient ou modifieraient le +Logiciel. En cas de cession de ces brevets, le Concédant s'engage à +faire reprendre les obligations du présent alinéa aux cessionnaires. + + + 5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant +aux domaines d'application, étant ci-après précisé que cela comporte: + + 1. la reproduction permanente ou provisoire du Logiciel en tout ou + partie par tout moyen et sous toute forme. + + 2. le chargement, l'affichage, l'exécution, ou le stockage du + Logiciel sur tout support. + + 3. la possibilité d'en observer, d'en étudier, ou d'en tester le + fonctionnement afin de déterminer les idées et principes qui sont + à la base de n'importe quel élément de ce Logiciel; et ceci, + lorsque le Licencié effectue toute opération de chargement, + d'affichage, d'exécution, de transmission ou de stockage du + Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + + + 5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, +d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel +et le droit de reproduire le Logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous +réserve de mentionner, de façon explicite, son nom en tant qu'auteur de +cette Contribution et la date de création de celle-ci. + + + 5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de +transmettre et de communiquer le Logiciel au public sur tout support et +par tout moyen ainsi que le droit de mettre sur le marché à titre +onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou +non, à des tiers dans les conditions ci-après détaillées. + + + 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, +sous forme de Code Source ou de Code Objet, à condition que cette +distribution respecte les dispositions du Contrat dans leur totalité et +soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, +le Licencié permette aux futurs Licenciés d'accéder facilement au Code +Source complet du Logiciel en indiquant les modalités d'accès, étant +entendu que le coût additionnel d'acquisition du Code Source ne devra +pas excéder le simple coût de transfert des données. + + + 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution au Logiciel, les conditions +de distribution du Logiciel Modifié sont alors soumises à l'intégralité +des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de +Code Source ou de Code Objet, à condition que cette distribution +respecte les dispositions du Contrat dans leur totalité et soit +accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le Code Objet du Logiciel Modifié est +redistribué, le Licencié permette aux futurs Licenciés d'accéder +facilement au Code Source complet du Logiciel Modifié en indiquant les +modalités d'accès, étant entendu que le coût additionnel d'acquisition +du Code Source ne devra pas excéder le simple coût de transfert des données. + + + 5.3.3 DISTRIBUTION DES MODULES EXTERNES + +Lorsque le Licencié a développé un Module Externe les conditions du +Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué +sous un contrat de licence différent. + + + 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL + +Le Licencié peut inclure un code soumis aux dispositions d'une des +versions de la licence GNU GPL dans le Logiciel modifié ou non et +distribuer l'ensemble sous les conditions de la même version de la +licence GNU GPL. + +Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis +aux dispositions d'une des versions de la licence GNU GPL et distribuer +l'ensemble sous les conditions de la même version de la licence GNU GPL. + + + Article 6 - PROPRIETE INTELLECTUELLE + + + 6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel +Initial. Toute utilisation du Logiciel Initial est soumise au respect +des conditions dans lesquelles le Titulaire a choisi de diffuser son +oeuvre et nul autre n'a la faculté de modifier les conditions de +diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi +par la présente licence et ce, pour la durée visée à l'article 4.2. + + + 6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable. + + + 6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable et reste libre du choix du contrat régissant +sa diffusion. + + + 6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les + mentions de propriété intellectuelle apposées sur le Logiciel; + + 2. à reproduire à l'identique lesdites mentions de propriété + intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou +indirectement, aux droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs sur le Logiciel et à prendre, le cas échéant, à +l'égard de son personnel toutes les mesures nécessaires pour assurer le +respect des dits droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs. + + + Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de +prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les +termes et conditions d'une telle assistance technique et/ou d'une telle +maintenance seront alors déterminés dans un acte séparé. Ces actes de +maintenance et/ou assistance technique n'engageront que la seule +responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule +responsabilité, à ses licenciés une garantie, qui n'engagera que lui, +lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, +dans les conditions qu'il souhaite. Cette garantie et les modalités +financières de son application feront l'objet d'un acte séparé entre le +Concédant et le Licencié. + + + Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la +faculté, sous réserve de prouver la faute du Concédant concerné, de +solliciter la réparation du préjudice direct qu'il subirait du fait du +logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en +application du Contrat et ne saurait être engagée en raison notamment: +(i) des dommages dus à l'inexécution, totale ou partielle, de ses +obligations par le Licencié, (ii) des dommages directs ou indirects +découlant de l'utilisation ou des performances du Logiciel subis par le +Licencié et (iii) plus généralement d'un quelconque dommage indirect. En +particulier, les Parties conviennent expressément que tout préjudice +financier ou commercial (par exemple perte de données, perte de +bénéfices, perte d'exploitation, perte de clientèle ou de commandes, +manque à gagner, trouble commercial quelconque) ou toute action dirigée +contre le Licencié par un tiers, constitue un dommage indirect et +n'ouvre pas droit à réparation par le Concédant. + + + Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances +scientifiques et techniques au moment de la mise en circulation du +Logiciel ne permet pas d'en tester et d'en vérifier toutes les +utilisations ni de détecter l'existence d'éventuels défauts. L'attention +du Licencié a été attirée sur ce point sur les risques associés au +chargement, à l'utilisation, la modification et/ou au développement et à +la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous +moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et +de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder +l'ensemble des droits attachés au Logiciel (comprenant notamment les +droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le +Concédant sans autre garantie, expresse ou tacite, que celle prévue à +l'article 9.2 et notamment sans aucune garantie sur sa valeur +commerciale, son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt +d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible +avec l'équipement du Licencié et sa configuration logicielle ni qu'il +remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le +Logiciel ne porte pas atteinte à un quelconque droit de propriété +intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout +autre droit de propriété. Ainsi, le Concédant exclut toute garantie au +profit du Licencié contre les actions en contrefaçon qui pourraient être +diligentées au titre de l'utilisation, de la modification, et de la +redistribution du Logiciel. Néanmoins, si de telles actions sont +exercées contre le Licencié, le Concédant lui apportera son aide +technique et juridique pour sa défense. Cette aide technique et +juridique est déterminée au cas par cas entre le Concédant concerné et +le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage +toute responsabilité quant à l'utilisation de la dénomination du +Logiciel par le Licencié. Aucune garantie n'est apportée quant à +l'existence de droits antérieurs sur le nom du Logiciel et sur +l'existence d'une marque. + + + Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa +charge par le Contrat, le Concédant pourra résilier de plein droit le +Contrat trente (30) jours après notification adressée au Licencié et +restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à +utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les +licences qu'il aura concédées antérieurement à la résiliation du Contrat +resteront valides sous réserve qu'elles aient été effectuées en +conformité avec le Contrat. + + + Article 11 - DISPOSITIONS DIVERSES + + + 11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance +d'exécution du Contrat qui serait dû à un cas de force majeure, un cas +fortuit ou une cause extérieure, telle que, notamment, le mauvais +fonctionnement ou les interruptions du réseau électrique ou de +télécommunication, la paralysie du réseau liée à une attaque +informatique, l'intervention des autorités gouvernementales, les +catastrophes naturelles, les dégâts des eaux, les tremblements de terre, +le feu, les explosions, les grèves et les conflits sociaux, l'état de +guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou +plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du +Contrat, ne pourra en aucun cas impliquer renonciation par la Partie +intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite +ou orale, entre les Parties sur le même objet et constitue l'accord +entier entre les Parties sur cet objet. Aucune addition ou modification +aux termes du Contrat n'aura d'effet à l'égard des Parties à moins +d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat +s'avèrerait contraire à une loi ou à un texte applicable, existants ou +futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les +amendements nécessaires pour se conformer à cette loi ou à ce texte. +Toutes les autres dispositions resteront en vigueur. De même, la +nullité, pour quelque raison que ce soit, d'une des dispositions du +Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + + + 11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces +deux versions faisant également foi. + + + Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de +ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé +et ne peut être modifié que par les auteurs de la licence, lesquels se +réservent le droit de publier périodiquement des mises à jour ou de +nouvelles versions du Contrat, qui possèderont chacune un numéro +distinct. Ces versions ultérieures seront susceptibles de prendre en +compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra +faire l'objet d'une diffusion ultérieure que sous la même version du +Contrat ou une version postérieure, sous réserve des dispositions de +l'article 5.3.4. + + + Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent +de tenter de régler à l'amiable les différends ou litiges qui +viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter +de leur survenance et sauf situation relevant d'une procédure d'urgence, +les différends ou litiges seront portés par la Partie la plus diligente +devant les Tribunaux compétents de Paris. + + +Version 2.0 du 2005-05-21. diff --git a/thirdparty/tralics-2.15.2/Modele/amsldoc.xml b/thirdparty/tralics-2.15.2/Modele/amsldoc.xml new file mode 100644 index 0000000..5618911 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/amsldoc.xml @@ -0,0 +1,2357 @@ + + + + +User's Guide for the <EM r='pkg'>amsmath</EM> Package (Version 2.0)American Mathematical Society1999-12-13 (revised 2002-02-25)

+
+ +Introduction +

The amsmath package is a package that provides +miscellaneous enhancements for improving the information structure and +printed output of documents that contain mathematical formulas. Readers +unfamiliar with should refer to . If you have an +up-to-date version of , the amsmath package is normally +provided along with it. Upgrading when a newer version of the +amsmath package is released can be done via +http://www.ams.org/tex/amsmath.html or +ftp://ftp.ams.org/pub/tex/.

+

This documentation describes the features of the amsmath package +and discusses how they are intended to be used. It also covers some +ancillary packages:

+amsbsy +amstext +amscd +amsxtra +amsopn +

+These all have something to do with the contents of math formulas. For +information on extra math symbols and math fonts, see +and http://www.ams.org/tex/amsfonts.html. For documentation of the +amsthm package or AMS document classes (amsart, +amsbook, etc.) see or and +http://www.ams.org/tex/author-info.html.

+

If you are a long-time user and have lots of mathematics in what +you write, then you may recognize solutions for some familiar problems +in this list of amsmath features:

+ +

A convenient way to define new `operator name' commands analogous +to sin and lim, including proper side spacing and automatic +selection of the correct font style and size (even when used in +sub- or superscripts).

+
+

Multiple substitutes for the eqnarray environment to make +various kinds of equation arrangements easier to write.

+
+

Equation numbers automatically adjust up or down to avoid +overprinting on the equation contents (unlike eqnarray).

+
+

Spacing around equals signs matches the normal spacing in the +equation environment (unlike eqnarray).

+
+

A way to produce multiline subscripts as are often used with +summation or product symbols.

+
+

An easy way to substitute a variant equation number for a given +equation instead of the automatically supplied number.

+
+

An easy way to produce subordinate equation numbers of the form +(1.3a) (1.3b) (1.3c) for selected groups of equations.

+
+

The amsmath package is distributed together with some small +auxiliary packages:

+ +

Primary package, provides various features for +displayed equations and other mathematical constructs.

+
+

Provides a text command for +typesetting a fragment of text inside a display.

+
+

Provides DeclareMathOperator for defining new +`operator names' like sin and lim.

+
+

For backward compatibility this package continues +to exist but use of the newer bm package that comes with +is recommended instead.

+
+

Provides a CD environment for simple +commutative diagrams (no support for diagonal arrows).

+
+

Provides certain odds and ends such as +fracwithdelims and accentedsymbol, for compatibility with +documents created using version 1.1.

+
+

The amsmath package incorporates amstext, amsopn, and +amsbsy. The features of amscd and amsxtra, however, +are available only by invoking those packages separately.

+
+Options for the amsmath package +

The amsmath package has the following options:

+ +

(default) For a split equation, place equation +numbers vertically centered +on the total height of the equation.

+
+

`Top-or-bottom tags': For a split equation, place +equation numbers level with +the last (resp. first) line, if numbers are on the right (resp. +left).

+
+

(default) Place the subscripts and +superscripts of summation symbols +above and below, in displayed equations. This option also affects other +symbols of the same type—\prod , \coprod , \bigotimes , +\bigoplus , and so forth—but excluding integrals (see below).

+
+

Always place the subscripts and superscripts of +summation-type symbols to the side, even in displayed equations.

+
+

Like sumlimits, but for +integral symbols.

+
+

(default) Opposite of intlimits.

+
+

(default) Like sumlimits, but for certain +`operator names' such as det\det , inf\inf , lim\lim , max\max , min\min , that +traditionally have subscripts placed underneath when they occur in a displayed +equation.

+
+

Opposite of namelimits.

+
+

To use one of these package options, put the option name in the optional +argument of the usepackage command—e.g., +\usepackage[intlimits]{amsmath}.

+

The amsmath package also recognizes the following options which +are normally selected (implicitly or explicitly) through the +documentclass command, and thus need not be repeated in the option +list of the usepackage{amsmath} statement.

+ +

Place equation numbers on the left.

+
+

Place equation numbers on the right.

+
+

Position equations at a fixed indent from the left +margin rather than centered in the text column.

+
+
+Displayed equations + +Introduction +

The amsmath package provides a number of additional displayed +equation structures beyond the ones +provided in basic . The augmented set includes:

+

  equation     equation*     align       align*

+

  gather       gather*       flalign     flalign*

+

  multline     multline*     alignat     alignat*

+

  split

+

(Although the standard eqnarray environment remains available, +it is better to use align or equation+split instead.)

+

Except for split, each environment has both starred and unstarred +forms, where the unstarred forms have automatic numbering using +'s equation counter. You can suppress the number on any +particular line by putting notag before the \\; you can also +override it with a tag of your own +using tag{\langle label\rangle }, where \langle label\rangle means arbitrary text such +as $*$ or ii used to “number†the equation. There is also a +tag* command that causes the text you supply to be typeset +literally, without adding parentheses around it. tag and tag* +can also be used within the unnumbered versions of all the amsmath +alignment structures. Some examples of the use of tag may be found +in the sample files testmath.tex and subeqn.tex provided with +the amsmath package.

+

The split environment is a special subordinate form that is used +only inside one of the others. It cannot be used inside +multline, however.

+

In the structures that do alignment (split, align and +variants), relation symbols have an & before them but not +after—unlike eqnarray. Putting the & after the +relation symbol will interfere with the normal spacing; it has to go +before.

+Comparison of displayed equation environments (vertical lines +indicating nominal margins) +

\begin{equation*}

+

a=b

+

\end{equation*}

+ +a=b +a=b + +

\begin{equation}

+

a=b

+

\end{equation}

+ +a=b +a=b + +

\begin{equation}\label{xx}

+

\begin{split}

+

a& =b+c-d\\

+

 & \quad +e-f\\

+

 & =g+h\\

+

 & =i

+

\end{split}

+

\end{equation}

+ +a=b+c-d+e-f=g+h=i +\begin{split} +a& =b+c-d\\ +& \quad +e-f\\ +& =g+h\\ +& =i +\end{split} + +

\begin{multline}

+

a+b+c+d+e+f\\

+

+i+j+k+l+m+n

+

\end{multline}

+ +a+b+c+d+e+f+i+j+k+l+m+n +a+b+c+d+e+f\\ ++i+j+k+l+m+n + +

\begin{gather}

+

a_1=b_1+c_1\\

+

a_2=b_2+c_2-d_2+e_2

+

\end{gather}

+ +a 1 =b 1 +c 1 a 2 =b 2 +c 2 -d 2 +e 2 +a_1=b_1+c_1\\ +a_2=b_2+c_2-d_2+e_2 + +

\begin{align}

+

a_1& =b_1+c_1\\

+

a_2& =b_2+c_2-d_2+e_2

+

\end{align}

+ +a 1 =b 1 +c 1 a 2 =b 2 +c 2 -d 2 +e 2 +a_1& =b_1+c_1\\ +a_2& =b_2+c_2-d_2+e_2 + +

\begin{align}

+

a_{11}& =b_{11}&

+

  a_{12}& =b_{12}\\

+

a_{21}& =b_{21}&

+

  a_{22}& =b_{22}+c_{22}

+

\end{align}

+ +a 11 =b 11 a 12 =b 12 a 21 =b 21 a 22 =b 22 +c 22 +a_{11}& =b_{11}& +a_{12}& =b_{12}\\ +a_{21}& =b_{21}& +a_{22}& =b_{22}+c_{22} + +

\begin{flalign*}

+

a_{11}& =b_{11}&

+

  a_{12}& =b_{12}\\

+

a_{21}& =b_{21}&

+

  a_{22}& =b_{22}+c_{22}

+

\end{flalign*}

+ +a 11 =b 11 a 12 =b 12 a 21 =b 21 a 22 =b 22 +c 22 +a_{11}& =b_{11}& +a_{12}& =b_{12}\\ +a_{21}& =b_{21}& +a_{22}& =b_{22}+c_{22} + +

+
+Single equations +

The equation environment is for a single equation with an +automatically generated number. The equation* environment is the +same except for omitting the number.Basic doesn't provide an equation* environment, +but rather a functionally equivalent environment named +displaymath.

+
+Split equations without alignment +

The multline environment is a variation of the equation +environment used for equations that don't fit on a single line. The +first line of a multline will be at the left margin and the last +line at the right margin, except for an indention on both sides in the +amount of multlinegap. Any additional lines in between will be +centered independently within the display width (unless the fleqn +option is in effect).

+

Like equation, multline has only a single equation number +(thus, none of the individual lines should be marked with notag). +The equation number is placed on the last line (reqno option) or +first line (leqno option); vertical centering as for split +is not supported by multline.

+

It's possible to force one of the middle lines to the left or right with +commands shoveleft, shoveright. These commands take the entire +line as an argument, up to but not including the final \\; for +example

+

MISSING

+

\begin{multline}

+

\framebox[.65\columnwidth]{A}\\

+

\framebox[.5\columnwidth]{B}\\

+

\shoveright{\framebox[.55\columnwidth]{C}}\\

+

\framebox[.65\columnwidth]{D}

+

\end{multline}

+

The value of multlinegap can be changed with the usual +commands setlength or addtolength.

+
+Split equations with alignment +

Like multline, the split environment is for single +equations that are too long to fit on one line and hence must be split +into multiple lines. Unlike multline, however, the split +environment provides for alignment among the split lines, using & to +mark alignment points. Unlike the other amsmath equation +structures, the split environment provides no numbering, because +it is intended to be used only inside some other displayed +equation structure, usually an equation, align, or +gather environment, which provides the numbering. For example:

+H c =1 2n l=0 n (-1) l (n-l) p-2 l 1 ++l p =l i=1 p n i l i ·[(n-l)-(n i -l i )] n i -l i ·(n-l) 2 - j=1 p (n i -l i ) 2 .\begin{split} +H_c&=\frac{1}{2n} \sum ^n_{l=0}(-1)^{l}(n-{l})^{p-2} +\sum _{l _1+\dots + l _p=l}\prod ^p_{i=1} \binom{n_i}{l _i}\\ +&\quad \cdot [(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot \Bigl [(n-l )^2-\sum ^p_{j=1}(n_i-l _i)^2\Bigr ]. +\hspace{-20.0pt}\end{split} +

\begin{equation}\label{e:barwq}\begin{split}

+

H_c&=\frac{1}{2n} \sum^n_{l=0}(-1)^{l}(n-{l})^{p-2}

+

\sum_{l _1+\dots+ l _p=l}\prod^p_{i=1} \binom{n_i}{l _i}\\

+

&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot

+

\Bigl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\Bigr].

+

\end{split}\end{equation}

+

The split structure should constitute the entire body of the +enclosing structure, apart from commands like label that produce no +visible material.

+
+Equation groups without alignment +

The gather environment is used for a group of consecutive +equations when there is no alignment desired among them; each one is +centered separately within the text width (see Table ). +Equations inside gather are separated by a \\ command. +Any equation in a gather may consist of a \begin{split} +... \end{split} structure—for example:

+

\begin{gather}

+

  first equation\\

+

  \begin{split}

+

    second & equation\\

+

           & on two lines

+

  \end{split}

+

  \\

+

  third equation

+

\end{gather}

+
+Equation groups with mutual alignment +

The align environment is used for two or more equations when +vertical alignment is desired; usually binary relations such as equal +signs are aligned (see Table ).

+

To have several equation columns side-by-side, use extra ampersands +to separate the columns:

+x=yX=Ya=b+cx ' =y ' X ' =Y ' a ' =bx+x ' =y+y ' X+X ' =Y+Y ' a ' b=c ' b +x&=y & X&=Y & a&=b+c\\ +x^{\prime }&=y^{\prime } & X^{\prime }&=Y^{\prime } & a^{\prime }&=b\\ +x+x^{\prime }&=y+y^{\prime } & X+X^{\prime }&=Y+Y^{\prime } & a^{\prime }b&=c^{\prime }b + +

\begin{align}

+

x&=y       & X&=Y       & a&=b+c\\

+

x'&=y'     & X'&=Y'     & a'&=b\\

+

x+x'&=y+y' & X+X'&=Y+Y' & a'b&=c'b

+

\end{align}

+

Line-by-line annotations on an equation can be done by judicious +application of text inside an align environment:

+x=y 1 -y 2 +y 3 -y 5 +y 8 -by()=y ' y * by()=y(0)y ' byAxiom1. +x& = y_1-y_2+y_3-y_5+y_8-\dots && \text{by (\ref {eq:C})}\\ +& = y^{\prime }\circ y^* && \text{by (\ref {eq:D})}\\ +& = y(0) y^{\prime } && \text{by Axiom 1.} + +

\begin{align}

+

x& = y_1-y_2+y_3-y_5+y_8-\dots

+

                    && \text{by \eqref{eq:C}}\\

+

 & = y'\circ y^*    && \text{by \eqref{eq:D}}\\

+

 & = y(0) y'        && \text {by Axiom 1.}

+

\end{align}

+

A variant environment alignat allows the horizontal space between +equations to be explicitly specified. This environment takes one argument, +the number of “equation columnsâ€: count the maximum number of &s +in any row, add 1 and divide by 2.

+x=y 1 -y 2 +y 3 -y 5 +y 8 -by()=y ' y * by()=y(0)y ' byAxiom1. +x& = y_1-y_2+y_3-y_5+y_8-\dots &\quad & \text{by (\ref {eq:C})}\\ +& = y^{\prime }\circ y^* && \text{by (\ref {eq:D})}\\ +& = y(0) y^{\prime } && \text{by Axiom 1.} + +

\begin{alignat}{2}

+

x& = y_1-y_2+y_3-y_5+y_8-\dots

+

                  &\quad& \text{by \eqref{eq:C}}\\

+

 & = y'\circ y^*  && \text{by \eqref{eq:D}}\\

+

 & = y(0) y'      && \text {by Axiom 1.}

+

\end{alignat}

+
+Alignment building blocks +

Like equation, the multi-equation environments gather, +align, and alignat are designed to produce a structure +whose width is the full line width. This means, for example, that one +cannot readily add parentheses around the entire structure. But variants +gathered, aligned, and alignedat are provided whose +total width is the actual width of the contents; thus they can be used +as a component in a containing expression. E.g.,

+B ' =-×E,E ' =×B-4πj,Maxwell'sequations +\left.\begin{aligned} +B^{\prime }&=-\partial \times E,\\ +E^{\prime }&=\partial \times B - 4\pi j, +\end{aligned} +\right\rbrace +\qquad \text{Maxwell's equations} + +

\begin{equation*}

+

\left.\begin{aligned}

+

  B'&=-\partial\times E,\\

+

  E'&=\partial\times B - 4\pi j,

+

\end{aligned}

+

\right\}

+

\qquad \text{Maxwell's equations}

+

\end{equation*}

+

Like the array environment, these -ed variants also take +an optional [t] or [b] argument to specify vertical +positioning.

+

“Cases†constructions like the following are common in +mathematics:

+P r-j =0ifr-jisodd,r!(-1) (r-j)/2 ifr-jiseven. +P_{r-j}= +{\left\lbrace \begin{array}{ll} +0& \text{if $r-j$ is odd},\\ +r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}. +\end{array}\right.} + +

and in the amsmath package there is a cases environment to +make them easy to write:

+

P_{r-j}=\begin{cases}

+

    0&  \text{if $r-j$ is odd},\\

+

    r!\,(-1)^{(r-j)/2}&  \text{if $r-j$ is even}.

+

  \end{cases}

+

Notice the use of text (cf. §) and the nested +math formulas.

+
+Adjusting tag placement +

Placing equation numbers can be a rather complex problem in multiline +displays. The environments of the amsmath package try hard to +avoid overprinting an equation number on the equation contents, if +necessary moving the number down or up to a separate line. Difficulties +in accurately calculating the profile of an equation can occasionally +result in number movement that doesn't look right. There is a +raisetag command provided to adjust the vertical position of the +current equation number, if it has been shifted away from its normal +position. To move a particular number up by six points, write +\raisetag{6pt}. This kind of adjustment is fine tuning like line +breaks and page breaks, and should therefore be left undone until your +document is nearly finalized, or you may end up redoing the fine tuning +several times to keep up with changing document contents.

+
+Vertical spacing and page breaks in multiline displays +

You can use the \\[\langle dimension\rangle ] command to get extra vertical +space between lines in all the amsmath displayed equation +environments, as is usual in . When the amsmath package is +in use page breaks between equation lines are normally disallowed; +the philosophy is that page breaks in such material should receive +individual attention from the author. To get an individual page break +inside a particular displayed equation, a displaybreak command is +provided. displaybreak is best placed immediately before the +\\ where it is to take effect. Like 's pagebreak, +displaybreak takes an optional argument between 0 and 4 denoting +the desirability of the pagebreak. \displaybreak[0] means “it is +permissible to break here†without encouraging a break; +displaybreak with no optional argument is the same as +\displaybreak[4] and forces a break.

+

If you prefer a strategy of letting page breaks fall where they may, +even in the middle of a multi-line equation, then you might put +allowdisplaybreaks[1] in the preamble of your document. An +optional argument 1–4 can be used for finer control: [1] means +allow page breaks, but avoid them as much as possible; values of 2,3,4 +mean increasing permissiveness. When display breaks are enabled with +allowdisplaybreaks, the \\* command can be used to prohibit a +pagebreak after a given line, as usual.

+

Note: Certain equation environments wrap their contents in an +unbreakable box, with the consequence that neither displaybreak nor +allowdisplaybreaks will have any effect on them. These include +split, aligned, gathered, and alignedat. +

+
+Interrupting a display +

The command intertext is used for a short interjection of one or +two lines of text in the middle of a +multiple-line display structure (see also the text command in +§). Its salient feature is preservation of the alignment, +which would not happen if you simply ended the display and then started +it up again afterwards. intertext may only appear right after a +\\ or \\* command. Notice the position of the word “and†in +this example.

+A 1 =N 0 (λ;Ω ' )-ϕ(λ;Ω ' ),A 2 =ϕ(λ;Ω ' )-ϕ(λ;Ω),andA 3 =𝒩(λ;ω). +A_1&=N_0(\lambda ;\Omega ^{\prime })-\phi (\lambda ;\Omega ^{\prime }),\\ +A_2&=\phi (\lambda ;\Omega ^{\prime })-\phi (\lambda ;\Omega ),\\ +\multicolumn{2}{l}{\text{and}}\\ +A_3&=\mathcal {N}(\lambda ;\omega ). + +

\begin{align}

+

A_1&=N_0(\lambda;\Omega')-\phi(\lambda;\Omega'),\\

+

A_2&=\phi(\lambda;\Omega')-\phi(\lambda;\Omega),\\

+

\intertext{and}

+

A_3&=\mathcal{N}(\lambda;\omega).

+

\end{align}

+
+Equation numbering +Numbering hierarchy +

In if you wanted to have equations numbered within +sections—that is, have +equation numbers (1.1), (1.2), ..., (2.1), (2.2), +..., in sections 1, 2, and so forth—you could redefine +theequation as suggested in the manual §6.3, §C.8.4:

+

\renewcommand{\theequation}{\thesection.\arabic{equation}}

+

This works pretty well, except that the equation counter won't be reset +to zero at the beginning of a new section or chapter, unless you do it +yourself using setcounter. To make this a little more convenient, +the amsmath package provides a command numberwithin. To have equation numbering tied to +section numbering, with automatic reset of the equation counter, write

+

\numberwithin{equation}{section}

+

As its name implies, the numberwithin command can be applied to +any counter, not just the equation counter.

+
+Cross references to equation numbers +

To make cross-references to equations easier, an eqref +command is provided. This +automatically supplies the parentheses around the equation number. I.e., +if \ref{abc} produces 3.2 then \eqref{abc} produces +(3.2).

+
+Subordinate numbering sequences +

The amsmath package provides also a subequations +environment to make it +easy to number equations in a particular group with a subordinate +numbering scheme. For example

+

\begin{subequations}

+

...

+

\end{subequations}

+

causes all numbered equations within that part of the document to be +numbered (4.9a) (4.9b) (4.9c) ..., if the preceding numbered +equation was (4.8). A label command immediately after +\begin{subequations} will produce a ref of the parent +number 4.9, not 4.9a. The counters used by the subequations +environment are parentequation and equation and +addtocounter, setcounter, value, etc., can be applied +as usual to those counter names. To get anything other than lowercase +letters for the subordinate numbers, use standard methods for +changing numbering style §6.3, §C.8.4. For example, +redefining theequation as follows will produce roman numerals.

+

\begin{subequations}

+

\renewcommand{\theequation}{\theparentequation \roman{equation}}

+

...

+
+Miscellaneous mathematical features + +Matrices +

The amsmath package provides some environments for +matrices beyond the basic array environment of +. The pmatrix, bmatrix, Bmatrix, vmatrix +and Vmatrix have (respectively) ()(\,), [][\,], {}\lbrace \,\rbrace , +||\vert \,\vert , and +\Vert \,\Vert delimiters built in. For naming consistency there is a +matrix environment sans delimiters. This is not entirely redundant +with the array environment; the matrix environments all use more +economical horizontal spacing than the rather prodigal spacing of the +array environment. Also, unlike the array environment, you +don't have to give column specifications for any of the matrix +environments; by default you can have up to 10 centered columns.More precisely: The maximum number of columns in a matrix is determined +by the counter MaxMatrixCols (normal value = 10), which you can change +if necessary using 's setcounter or addtocounter +commands. (If you need left or right alignment in a column or other special +formats you must resort to array.)

+

To produce a small matrix suitable for use in text, there is a +smallmatrix environment (e.g., +abcd +\bigl ( {\begin{matrix} +a&b\\ c&d +\end{matrix}} \bigr ) +) +that comes closer to fitting within a single text line than a normal +matrix. Delimiters must be provided; there are no p,b,B,v,V +versions of smallmatrix. The above example was produced by

+

\bigl( \begin{smallmatrix}

+

  a&b\\ c&d

+

\end{smallmatrix} \bigr)

+hdotsfor

{\langle number\rangle } produces a row of dots in a +matrix spanning the given number of +columns. For example,

+

abcde\begin{matrix} a&b&c&d\\ +e&\dots &\dots &\dots \end{matrix} +

      

\begin{matrix} a&b&c&d\\

+

e&\hdotsfor{3} \end{matrix}

+

+

The spacing of the dots can be varied through use of a square-bracket +option, for example, \hdotsfor[1.5]{3}. The number in square brackets +will be used as a multiplier (i.e., the normal value is 1.0).

+D 1 t-a 12 t 2 -a 1n t n -a 21 t 1 D 2 t-a 2n t n -a n1 t 1 -a n2 t 2 D n t, +\begin{pmatrix} D_1t&-a_{12}t_2&\dots &-a_{1n}t_n\\ +-a_{21}t_1&D_2t&\dots &-a_{2n}t_n\\ +\dots &\dots &\dots &\dots \\ +-a_{n1}t_1&-a_{n2}t_2&\dots &D_nt\end{pmatrix}, + +

\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\

+

-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\

+

\hdotsfor[2]{4}\\

+

-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix}

+
+Math spacing commands +

The amsmath package slightly extends the set of math +spacing commands, as shown below. +Both the spelled-out and abbreviated forms of these commands are robust, +and they can also be used outside of math.

+Abbrev. +Spelled out +Example +Abbrev. +Spelled out +Example + +no space +\mathord {\Rightarrow \hspace{-0.55542pt}}\mathord {\hspace{-0.55542pt}\Leftarrow } + +no space +\mathord {\Rightarrow \hspace{-0.55542pt}}\mathord {\hspace{-0.55542pt}\Leftarrow } +  +thinspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\,\mathord {\hspace{-0.55542pt}\Leftarrow } +! +negthinspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\!\mathord {\hspace{-0.55542pt}\Leftarrow } +: +medspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\:\mathord {\hspace{-0.55542pt}\Leftarrow } + +negmedspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\hspace{0.0pt}\mathord {\hspace{-0.55542pt}\Leftarrow } +; +thickspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\;\mathord {\hspace{-0.55542pt}\Leftarrow } + +negthickspace +\mathord {\Rightarrow \hspace{-0.55542pt}}\hspace{0.0pt}\mathord {\hspace{-0.55542pt}\Leftarrow } + +quad +\mathord {\Rightarrow \hspace{-0.55542pt}}\quad \mathord {\hspace{-0.55542pt}\Leftarrow } + +qquad +\mathord {\Rightarrow \hspace{-0.55542pt}}\qquad \mathord {\hspace{-0.55542pt}\Leftarrow } +

+For the greatest possible control over math spacing, use mspace +and `math units'. One math unit, or mu, is equal to 1/18 em. Thus to +get a negative quad you could write \mspace{-18.0mu}.

+
+Dots +

For preferred placement of ellipsis dots (raised or on-line) in various +contexts there is no general consensus. It may therefore be considered a +matter of taste. By using the semantically oriented commands

+ +

dotsc for “dots with commasâ€

+
+

dotsb for “dots with binary operators/relationsâ€

+
+

dotsm for “multiplication dotsâ€

+
+

dotsi for “dots with integralsâ€

+
+

dotso for “other dots†(none of the above)

+
+

instead of ldots and cdots, you make it possible for your +document to be adapted to different conventions on the fly, in case (for +example) you have to submit it to a publisher who insists on following +house tradition in this respect. The default treatment for the various +kinds follows American Mathematical Society conventions:

+

Then we have the series $A_1, A_2,

+

\dotsc$, the regional sum $A_1

+

+A_2 +\dotsb $, the orthogonal

+

product $A_1 A_2 \dotsm $, and

+

the infinite integral

+

\[\int_{A_1}\int_{A_2}\dotsi\].

+

+

Then we have the series A 1 ,A 2 ,A_1,A_2,\cdots , +the regional sum A 1 +A 2 +A_1+A_2+\cdots , +the orthogonal product A 1 A 2 A_1A_2\cdots , +and the infinite integral

+ A 1 A 2 .\int _{A_1}\int _{A_2}\cdots . +

+

+ +Nonbreaking dashes +

A command nobreakdash is provided to suppress the possibility +of a linebreak after the following hyphen or dash. For example, if you +write `pages 1–9' as pages 1\nobreakdash--9 then a linebreak will +never occur between the dash and the 9. You can also use +nobreakdash to prevent undesirable hyphenations in combinations +like $p$-adic. For frequent use, it's advisable to make abbreviations, +e.g.,

+

\newcommand{\p}{$p$\nobreakdash}% for "\p-adic"

+

\newcommand{\Ndash}{\nobreakdash--}% for "pages 1\Ndash 9"

+

%    For "\n dimensional" ("n-dimensional"):

+

\newcommand{\n}[1]{$n$\nobreakdash-\hspace{0pt}}

+

The last example shows how to prohibit a linebreak after the hyphen but +allow normal hyphenation in the following word. (It suffices to add a +zero-width space after the hyphen.)

+
+Accents in math +

In ordinary the placement of the second accent in doubled math +accents is often poor. With the amsmath package you +will get improved placement of the second accent: +A ^ ^\hat{\hat{A}} (hat{\hat{A}}).

+

The commands dddot and ddddot are available to produce triple +and quadruple dot accents in addition to the dot and ddot +accents already available in .

+

To get a superscripted hat or tilde character, load the amsxtra +package and use sphat or sptilde. Usage is A\sphat +(note the absence of the ^ character).

+

To place an arbitrary symbol in math accent position, or to get under +accents, see the accents package by Javier Bezos.

+
+Roots +

In ordinary the placement of root indices is sometimes not so +good: k β\@root \beta \of {k} (\sqrt[\beta]{k}). In the +amsmath package leftroot and uproot allow you to adjust +the position of the root:

+

  \sqrt[\leftroot{-2}\uproot{2}\beta]{k}

+

will move the beta up and to the right: +k β\@root \beta \of {k}. The negative argument used +with leftroot moves the β\beta to the right. The units are a small +amount that is a useful size for such adjustments.

+
+Boxed formulas +

The command boxed puts a box around its +argument, like fbox except that the contents are in math mode:

+ηC(δ(η)+Λ M (0,δ)) +\boxed{\eta \le C(\delta (\eta ) +\Lambda _M(0,\delta ))} + +

  \boxed{\eta \leq C(\delta(\eta) +\Lambda_M(0,\delta))}

+
+Over and under arrows +

Basic provides overrightarrow and overleftarrow +commands. Some additional over and under arrow commands are provided +by the amsmath package to extend the set:

+overleftarrow +underleftarrow +overrightarrow +underrightarrow +overleftrightarrow +underleftrightarrow +
+
+Extensible arrows +xleftarrow

and xrightarrow produce +arrows that extend automatically to accommodate +unusually wide subscripts or superscripts. These commands take one +optional argument (the subscript) and one mandatory argument (the +superscript, possibly empty):

+A n+μ-1B T n±i-1C +A\xleftarrow{}B \xrightarrow[T]{n\pm i-1}C + +

  \xleftarrow{n+\mu-1}\quad \xrightarrow[T]{n\pm i-1}

+
+Affixing symbols to other symbols +

provides stackrel for placing a +superscript above a binary relation. +In the amsmath package there are somewhat more general commands, +overset and underset, that can be used to place one symbol +above or below another symbol, whether it's a relation or something +else. The input \overset{*}{X} will place a superscript-size ** above +the XX: X *\overset{*}{X}; underset is the analog for adding a +symbol underneath.

+

See also the description of sideset in §.

+
+Fractions and related constructions +The frac, dfrac, and tfrac commands +

The frac command, which is in the basic command set of +, takes two arguments—numerator and +denominator—and typesets them in normal fraction form. The +amsmath package provides also dfrac and tfrac as +convenient abbreviations for {\displaystyle\frac ... } +andtextstyledisplaystyle {\textstyle\frac ... }.

+1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f) +\frac{1}{k}\log _2 c(f)\quad \tfrac{1}{k}\log _2 c(f)\quad \sqrt{\frac{1}{k}\log _2 c(f)}\quad \sqrt{\dfrac{1}{k}\log _2 c(f)} + +

\begin{equation}

+

\frac{1}{k}\log_2 c(f)\;\tfrac{1}{k}\log_2 c(f)\;

+

\sqrt{\frac{1}{k}\log_2 c(f)}\;\sqrt{\dfrac{1}{k}\log_2 c(f)}

+

\end{equation}

+
+The binom, dbinom, and tbinom commands +

For binomial expressions such as n k\binom{n}{k} +amsmath has binom, dbinom and tbinom:

+2 k -k 12 k-1 +k 22 k-2 +2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2} + +

2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}

+
+The genfrac command +

The capabilities of frac, binom, and their variants are +subsumed by a generalized fraction command genfrac with six +arguments. The last two correspond to frac's numerator and +denominator; the first two are optional delimiters (as seen in +binom); the third is a line thickness override (binom uses +this to set the fraction line thickness to 0—i.e., invisible); and +the fourth argument is a mathstyle override: integer values 0–3 select +respectively displaystyle, textstyle, scriptstyle, and +scriptscriptstyle. If the third argument is left empty, the line +thickness defaults to `normal'.

+

\genfrac{left-delim}{right-delim}{thickness}{mathstyle}{numerator}{denominator}

+

To illustrate, here is how frac, tfrac, and +binom might be defined.

+

\newcommand{\frac}[2]{\genfrac{}{}{}{}{#1}{#2}}

+

\newcommand{\tfrac}[2]{\genfrac{}{}{}{1}{#1}{#2}}

+

\newcommand{\binom}[2]{\genfrac{(}{)}{0pt}{}{#1}{#2}}

+

If you find yourself repeatedly using genfrac throughout a document +for a particular notation, you will do yourself a favor (and your +publisher) if you define a meaningfully-named abbreviation for that +notation, along the lines of frac and binom.

+

The primitive generalized fraction commands over, overwithdelims, +atop, atopwithdelims, above, abovewithdelims produce +warning messages if used with the amsmath package, for reasons +discussed in technote.tex.

+
+Continued fractions +

The continued fraction

+1 2+1 2+1 2+ +\cfrac{1}{\sqrt{2}+ +\cfrac{1}{\sqrt{2}+ +\cfrac{1}{\sqrt{2}+\cdots }}} + +

can be obtained by typing +

+

\cfrac{1}{\sqrt{2}+

+

 \cfrac{1}{\sqrt{2}+

+

  \cfrac{1}{\sqrt{2}+\dotsb

+

}}}

+

This produces better-looking results than straightforward use of +frac. Left or right placement of any of the numerators is +accomplished by using cfrac[l] or cfrac[r] instead of +cfrac.

+
+Smash options +

The command smash is used to typeset a subformula with an effective height and depth of zero, which is sometimes +useful in adjusting the subformula's position with respect to adjacent +symbols. With the amsmath package smash has optional +arguments t and b, because occasionally it is advantageous to be +able to “smash†only the top or only the bottom of something while +retaining the natural depth or height. For example, when adjacent +radical symbols are unevenly sized or positioned because of differences +in the height and depth of their contents, smash can be employed to +make them more consistent. Compare +x+y+z\sqrt{x}+\sqrt{y}+\sqrt{z} and x+y+z\sqrt{x}+\sqrt{\smash[b]{y}}+\sqrt{z}, +where the latter was produced by +$\sqrt{x} + +\sqrt{+\smash[b]{y}} + \sqrt{z}$.

+
+Delimiters +Delimiter sizes +

The automatic delimiter sizing done by left and right has two +limitations: First, it is applied mechanically to produce delimiters +large enough to encompass the largest contained item, and second, the +range of sizes is not even approximately continuous but has fairly large +quantum jumps. This means that a math fragment that is infinitesimally +too large for a given delimiter size will get the next larger size, a +jump of 3pt or so in normal-sized text. There are two or three +situations where the delimiter size is commonly adjusted, using a set of +commands that have `big' in their names.

+Delimiter +text +left +bigl +Bigl +biggl +Biggl +size +size +right +bigr +Bigr +biggr +Biggr +Result +(b)(c d)\displaystyle (b)(\frac{c}{d}) +bc d\displaystyle \left(b\right)\left(\frac{c}{d}\right) +bc d\displaystyle \bigl (b\bigr )\bigl (\frac{c}{d}\bigr ) +bc d\displaystyle \Bigl (b\Bigr )\Bigl (\frac{c}{d}\Bigr ) +bc d\displaystyle \biggl (b\biggr )\biggl (\frac{c}{d}\biggr ) +bc d\displaystyle \Biggl (b\Biggr )\Biggl (\frac{c}{d}\Biggr ) +

+The first kind of situation is a cumulative operator with limits above +and below. With left and right the delimiters usually turn out +larger than necessary, and using the Big or bigg +sizes +instead gives better results:

+ i a i j x ij p 1/p versus i a i j x ij p 1/p +\left[\sum _i a_i\left|\sum _j x_{ij}\right|^p\right]^{1/p} +\quad \text{versus}\quad \biggl [\sum _i a_i\Bigl \vert \sum _j x_{ij}\Bigr \vert ^p\biggr ]^{1/p} + +

\biggl[\sum_i a_i\Bigl\lvert\sum_j x_{ij}\Bigr\rvert^p\biggr]^{1/p}

+

The second kind of situation is clustered pairs of delimiters where +left and right make them all the same size (because that is +adequate to cover the encompassed material) but what you really want +is to make some of the delimiters slightly larger to make the nesting +easier to see.

+(a 1 b 1 )-(a 2 b 2 )(a 2 b 1 )+(a 1 b 2 )versus(a 1 b 1 ) - (a 2 b 2 )(a 2 b 1 ) + (a 1 b 2 ) +\left((a_1 b_1) - (a_2 b_2)\right) +\left((a_2 b_1) + (a_1 b_2)\right) +\quad \text{versus}\quad \bigl ((a_1 b_1) - (a_2 b_2)\bigr ) +\bigl ((a_2 b_1) + (a_1 b_2)\bigr ) + +

\left((a_1 b_1) - (a_2 b_2)\right)

+

\left((a_2 b_1) + (a_1 b_2)\right)

+

\quad\text{versus}\quad

+

\bigl((a_1 b_1) - (a_2 b_2)\bigr)

+

\bigl((a_2 b_1) + (a_1 b_2)\bigr)

+

The third kind of situation is a slightly oversize object in running +text, such as b ' d ' \left|\frac{b^{\prime }}{d^{\prime }}\right| where the +delimiters produced by left and right cause too much line +spreading. In that case bigl and bigr can be used to produce +delimiters that are slightly larger than the base size but still able to +fit within the normal line spacing: +b ' d ' \bigl \vert \frac{b^{\prime }}{d^{\prime }}\bigr \vert .

+

In ordinary big, bigg, Big, and Bigg +delimiters aren't scaled properly over the full range of font +sizes. With the amsmath package they are.

+
+Vertical bar notations +

The amsmath package provides commands lvert, rvert, +lVert, rVert (compare langle, rangle) to address the +problem of overloading for the vert bar character |. This +character is currently used in documents to represent a wide +variety of mathematical objects: the `divides' relation in a +number-theory expression like p|qp\vert q, or the absolute-value +operation |z|\vert z\vert , or the `such that' condition in set +notation, or the `evaluated at' notation f ζ (t)| t=0 f_\zeta (t)\bigr \vert _{t=0}. +The multiplicity of uses in itself is not so bad; what is bad, however, +is that fact that not all of the uses take the same typographical +treatment, and that the complex discriminatory powers of a knowledgeable +reader cannot be replicated in computer processing of mathematical +documents. It is recommended therefore that there should be a one-to-one +correspondence in any given document between the vert bar character +| and a selected mathematical notation, and similarly for the +double-bar command |. This immediately +rules out the use of | +and | for delimiters, because left and right +delimiters are distinct usages that do not relate in the same way to +adjacent symbols; recommended practice is therefore to define suitable +commands in the document preamble for any paired-delimiter use of vert +bar symbols:

+

\providecommand{\abs}[1]{\lvert#1\rvert}

+

\providecommand{\norm}[1]{\lVert#1\rVert}

+

whereupon the document would contain \abs{z} to produce |z|\vert z\vert and \norm{v} to produce v\Vert v\Vert .

+
+Operator names + +Defining new operator names +

Math functions such as log\log , sin\sin , and lim\lim are +traditionally typeset in roman type to make them visually more distinct +from one-letter math variables, which are set in math italic. The more +common ones have predefined names, log, sin, lim, and so +forth, but new ones come up all the time in mathematical papers, so the +amsmath package provides a general mechanism for defining new +`operator names'. To define a math function xxx to work like +sin, you write

+

\DeclareMathOperator{\xxx}{xxx}

+

whereupon ensuing uses of xxx will produce xxx in the +proper font and automatically add proper spacing on either side when necessary, so that you +get AxxxBA\operatorname{xxx}B instead of A xxx BA\mathrm {xxx}B. In the second argument of +DeclareMathOperator (the name text), a pseudo-text mode prevails: +the hyphen character - will print as a text hyphen rather than a +minus sign and an asterisk * will print as a raised text asterisk +instead of a centered math star. (Compare +a-b*c and a-b*ca-b*c.) But otherwise the name +text is printed in math mode, so that you can use, e.g., subscripts and +superscripts there.

+

If the new operator should have subscripts and superscripts placed in +`limits' position above and below as with lim\lim , sup\sup , or max\max , use +the * form of the DeclareMathOperator command:

+

\DeclareMathOperator*{\Lim}{Lim}

+

See also the discussion of subscript placement in +Section .

+

The following operator names are predefined:

+arccos +arccos\arccos +deg +deg\deg +lg +lg\lg +projlim +proj lim\projlim +arcsin +arcsin\arcsin +det +det\det +lim +lim\lim +sec +sec\sec +arctan +arctan\arctan +dim +dim\dim +liminf +lim inf\liminf +sin +sin\sin +arg +arg\arg +exp +exp\exp +limsup +lim sup\limsup +sinh +sinh\sinh +cos +cos\cos +gcd +gcd\gcd +ln +ln\ln +sup +sup\sup +cosh +cosh\cosh +hom +hom\hom +log +log\log +tan +tan\tan +cot +cot\cot +inf +inf\inf +max +max\max +tanh +tanh\tanh +coth +coth\coth +injlim +inj lim\injlim +min +min\min +csc +csc\csc +ker +ker\ker +Pr +Pr\Pr +
+varlimsup +lim \displaystyle \varlimsup +varinjlim +lim \displaystyle \varinjlim +varliminf +lim _\displaystyle \varliminf +varprojlim +lim \displaystyle \varprojlim +
+

There is also a command operatorname such that using

+

\operatorname{abc}

+

in a math formula is equivalent to a use of abc defined by +DeclareMathOperator. This may be occasionally useful for +constructing more complex notation or other purposes. (Use the variant +operatorname* to get limits.)

+
+mod and its relatives +

Commands mod, bmod, pmod, pod are provided to deal +with the special spacing conventions of “mod†notation. bmod and +pmod are available in , but with the amsmath package +the spacing of pmod will adjust to a smaller value if it's used in +a non-display-mode formula. mod and pod are variants of +pmod preferred by some authors; mod omits the parentheses, +whereas pod omits the “mod†and retains the parentheses.

+gcd(n,mmodn);xy(modb);xymodc;xy(d) +\gcd (n,m\bmod n);\quad x\equiv y\pmod {b}; +\quad x\equiv y\mod {c};\quad x\equiv y\hspace{10.0pt}(d) + +

\gcd(n,m\bmod n);\quad x\equiv y\pmod b;

+

\quad x\equiv y\mod c;\quad x\equiv y\pod d

+
+The text command +

The main use of the command text is for words or +phrases in a display. It is very +similar to the command mbox in its effects, but has a +couple of advantages. If you want a word or phrase of text in a +subscript, you can type ..._{\text{word or phrase}}, which is slightly +easier than the mbox equivalent: ..._{\mbox{\scriptsize word +or phrase}}. The other advantage is the more descriptive name.

+f [x i-1 ,x i ] ismonotonic,i=1,,c+1 +f_{[x_{i-1},x_i]} \text{ is monotonic,} +\quad i = 1,\dots ,c+1 + +

f_{[x_{i-1},x_i]} \text{ is monotonic,}

+

\quad i = 1,\dots,c+1

+
+Integrals and sums + +Multiline subscripts and superscripts +

The substack command can be used to produce a multiline subscript +or superscript: for example

+

\sum_{\substack{

+

         0\le i\le m\\

+

         0<j<n}}

+

  P(i,j)

+

+ 0im0<j<n P(i,j)\displaystyle \sum _{\begin{array}{c}0\le i\le m\\ 0<j<n\end{array}} P(i,j) +

+A slightly more generalized form is the subarray environment which +allows you to specify that each line should be left-aligned instead of +centered, as here:

+

\sum_{\begin{subarray}{l}

+

        i\in\Lambda\\ 0<j<n

+

      \end{subarray}}

+

 P(i,j)

+

+ iΛ0<j<n P(i,j)\displaystyle \sum _{{{\scriptstyle \begin{matrix} +i\in \Lambda \\ 0<j<n +\end{matrix}}}} +P(i,j) +

+
+The sideset command +

There's also a command called sideset, for a rather special +purpose: putting symbols at the subscript and +superscript corners of a +large operator symbol such as \sum or \prod . Note: this +command is not designed to be applied to anything other than sum-class symbols. The prime +example is the case when you want to put a prime on a sum symbol. If +there are no limits above or below the sum, you could just use +nolimits: here's +\sum\nolimits' E_n in display mode:

+ ' E n +\sum \nolimits ^{\prime } E_n + +

If, however, you want not only the prime but also something below or +above the sum symbol, it's not so easy—indeed, without +sideset, it would be downright difficult. With sideset, you +can write

+

\sideset{}{'}

+

  \sum_{n<k,\;\text{$n$ odd}} nE_n

+

+' n<k,nodd nE n \displaystyle \mathop {\mmlmultiscripts{\sum {\mmlnone }{\prime }}}\limits _{n<k,\;\text{$n$ odd}} nE_n + +

+The extra pair of empty braces is explained by the fact that +sideset has the capability of putting an extra symbol or symbols at +each corner of a large operator; to put an asterisk at each corner of a +product symbol, you would type

+

\sideset{_*^*}{_*^*}\prod

+

+****\displaystyle \mathop {\mmlmultiscripts{\prod {*}{*}\mmlprescripts {*}{*}}}\limits +

+
+Placement of subscripts and limits +

The default positioning for subscripts depends on the +base symbol involved. The default for sum-class symbols is +`displaylimits' positioning: When a sum-class symbol appears +in a displayed formula, subscript and superscript are placed in `limits' +position above and below, but in an inline formula, they are placed to +the side, to avoid unsightly and wasteful spreading of the +surrounding text lines. +The default for integral-class symbols is to have sub- and +superscripts always to the side, even in displayed formulas. +(See the discussion of the intlimits and related options in +Section .)

+

Operator names such as sin\sin or lim\lim may have either `displaylimits' +or `limits' positioning depending on how they were defined. The standard +operator names are defined according to normal mathematical usage.

+

The commands limits and nolimits can be used to override the +normal behavior of a base symbol:

+ X , A ,lim _ n +\sum \nolimits _X,\qquad \iint \limits _{A}, +\qquad \varliminf \nolimits _{n\rightarrow \infty } + +

To define a command whose subscripts follow the +same `displaylimits' behavior as sum, put +displaylimits at the tail end of the definition. When multiple +instances of limits, nolimits, or displaylimits occur +consecutively, the last one takes precedence.

+
+Multiple integral signs +iint

, iiint, and iiiint give multiple integral +signs with the spacing between them nicely +adjusted, in both text and display style. idotsint is an extension +of the same idea that gives two integral signs with dots between them.

+ A f(x,y)dxdy A f(x,y,z)dxdydz A f(w,x,y,z)dwdxdydz... A f(x 1 ,,x k ) +\iint \limits _A f(x,y)\,dx\,dy\qquad \iiint \limits _A +f(x,y,z)\,dx\,dy\,dz\\ +\iiiint \limits _A +f(w,x,y,z)\,dw\,dx\,dy\,dz\qquad \idotsint \limits _A f(x_1,\dots ,x_k) + +
+Commutative diagrams +

Some commutative diagram commands like the ones in are +available as a separate package, amscd. For complex commutative +diagrams authors will need to turn to more comprehensive packages like +kuvio or , but for simple diagrams without diagonal +arrows the amscd commands +may be more convenient. Here is one example.

+S 𝒲 Λ T jTEndPEndP(ST)/I=(ZT)/J +{\begin{matrix} +S^{{\mathcal {W}}_\Lambda }\otimes T &\xrightarrow{}& T\\ + +\downarrow +&& +\mathbox{mphantom}{\scriptstyle \operatorname{End}P}\downarrow {\scriptstyle \operatorname{End}P} +&&\\ +(S\otimes T)/I &=& (Z\otimes T)/J +\end{matrix}} + +

\begin{CD}

+

S^{{\mathcal{W}}_\Lambda}\otimes T   @>j>>   T\\

+

@VVV                                    @VV{\End P}V\\

+

(S\otimes T)/I                  @=      (Z\otimes T)/J

+

\end{CD}

+

In the CD environment the commands @>>>, +@<<<, @VVV, and @AAA give respectively right, left, down, and up +arrows. For the horizontal arrows, material between the first and second +> or < symbols will be typeset as a superscript, and material +between the second and third will be typeset as a subscript. Similarly, +material between the first and second or second and third As or Vs +of vertical arrows will be typeset as left or right “sidescriptsâ€. +The commands @= and @| give horizontal and vertical double lines. +A “null arrow†command @. can be used instead of a visible arrow +to fill out an array where needed.

+
+Using math fonts + +Introduction +

For more comprehensive information on font use in , see the + font guide (fntguide.tex) or The +Companion . The basic set of math font commands in includes +mathbf, mathrm, mathcal, mathsf, mathtt, +mathit. Additional math alphabet commands such as +mathbb for blackboard bold, mathfrak for Fraktur, and +mathscr for Euler script are available through the packages +amsfonts and euscript (distributed separately).

+
+Recommended use of math font commands +

If you find yourself employing math font commands frequently in your +document, you might wish that they had shorter names, such as mb +instead of mathbf. Of course, there is nothing to keep you from +providing such abbreviations for yourself by suitable newcommand +statements. But for to provide shorter names would actually be a +disservice to authors, as that would obscure a much better alternative: +defining custom command names derived from the names of the underlying +mathematical objects, rather than from the names of the fonts used to +distinguish the objects. For example, if you are using bold to indicate +vectors, then you will be better served in the long run if you define a +`vector' command instead of a `math-bold' command:

+

  \newcommand{\vect}[1]{\mathbf{#1}}

+

you can write \vect{a} + \vect{b} to produce 𝐚+𝐛\mathbf {a} + +\mathbf {b}. +If you decide several months down the road that you want to use the bold +font for some other purpose, and mark vectors by a small over-arrow +instead, then you can put the change into effect merely by changing the +definition of vect; otherwise you would have to replace all +occurrences of mathbf throughout your document, perhaps even +needing to inspect each one to see whether it is indeed +an instance of a vector.

+

It can also be useful to assign distinct +command names for different letters of a particular font:

+

\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}% or use amsfonts package

+

\DeclareMathSymbol{\C}{\mathalpha}{AMSb}{"43}

+

\DeclareMathSymbol{\R}{\mathalpha}{AMSb}{"52}

+

These statements would define the commands C and R to produce +blackboard-bold letters from the `AMSb' math symbols font. If you refer +often to thecomplex numbers or real numbers in your document, you +might find this method more convenient than (let's say) defining a +field command and writing\field{C}, \field{R}. But for +maximum flexibility and control, define such a field command and +then define C and R in terms of that +command:mathbb

+

\usepackage{amsfonts}% to get the \mathbb alphabet

+

\newcommand{\field}[1]{\mathbb{#1}}

+

\newcommand{\C}{\field{C}}

+

\newcommand{\R}{\field{R}}

+
+Bold math symbols +

The mathbf command is commonly used to obtain bold Latin letters in +math, but for most other kinds of math symbols it has no effect, or its +effects depend unreliably on the set of math fonts that are in use. For +example, writing

+

\Delta \mathbf{\Delta}\mathbf{+}\delta \mathbf{\delta}

+

produces ΔΔ+δδ\Delta \mathbf {\Delta }\mathbf {+}\delta \mathbf {\delta }; the mathbf has no effect on the plus +sign or the small delta.

+

The amsmath package therefore provides two additional commands, +boldsymbol and pmb, that can be applied to other kinds of math +symbols. boldsymbol can be used for a math symbol that remains +unaffected by mathbf if (and only if) your current math font set +includes a bold version of that symbol. pmb can be used as a last +resort for any math symbols that do not have a true bold version +provided by your set of math fonts; “pmb†stands for “poor man's +bold†and the command works by typesetting multiple copies of the symbol +with slight offsets. The quality of the output is inferior, especially +for symbols that contain any hairline strokes. When the standard default set of + math fonts are in use (Computer Modern), the only symbols that +are likely to require pmb are large operator symbols like sum, +extended delimiter symbols, or the extra math symbols provided by +the amssymb package .

+

The following formula shows some of the results that are possible:

+

A_\infty + \pi A_0

+

\sim \mathbf{A}_{\boldsymbol{\infty}} \boldsymbol{+}

+

  \boldsymbol{\pi} \mathbf{A}_{\boldsymbol{0}}

+

\sim\pmb{A}_{\pmb{\infty}} \pmb{+}\pmb{\pi} \pmb{A}_{\pmb{0}}

+A +πA 0 𝐀 +π𝐀 0 A +πA 0 +A_\infty + \pi A_0 +\sim \mathbf {A}_{\infty } + +\pi \mathbf {A}_{0} +\sim A_{\infty } +\pi A_{0} + +

If you want to use only the boldsymbol command without loading the +whole amsmath package, the bm package is recommended (this +is a standard package, not an AMS package; you probably have it +already if you have a 1997 or newer version of ).

+
+Italic Greek letters +

For italic versions of the capital Greek letters, the following commands +are provided:

+varGamma +Γ\Gamma +varSigma +Σ\Sigma +varDelta +Δ\Delta +varUpsilon +ϒ\Upsilon +varTheta +Θ\Theta +varPhi +Φ\Phi +varLambda +Λ\Lambda +varPsi +Ψ\Psi +varXi +Ξ\Xi +varOmega +Ω\Omega +varPi +Π\Pi +
+
+Error messages and output problems + +General remarks +

This is a supplement to Chapter 8 of the manual (first +edition: Chapter 6). For the reader's convenience, the set of error +messages discussed here overlaps somewhat with the set in that chapter, +but please be aware that we don't provide exhaustive coverage here. +The error messages are arranged in alphabetical order, disregarding +unimportant text such as ! LaTeX Error: at the beginning, and +nonalphabetical characters such as \\. Where examples are given, we +show also the help messages that appear on screen when you respond to an +error message prompt by entering h.

+

There is also a section discussing some output errors, i.e., instances +where the printed document has something wrong but there was no +error during typesetting.

+
+Error messages +\beginsplit won't work here.

Example:

+

! Package amsmath Error: \begin{split} won't work here.

+

 ...

+

 

+

l.8 \begin{split}

+

 

+

? h

+

\Did you forget a preceding \begin{equation}?

+

If not, perhaps the `aligned' environment is what you want.

+

?

+

Explanation: The split environment does not construct a stand-alone displayed +equation; it needs to be used within some other environment such as +equation or gather.

+
Extra & on this line

Example:

+

! Package amsmath Error: Extra & on this line.

+

 

+

See the amsmath package documentation for explanation.

+

Type  H <return>  for immediate help.

+

 ...

+

 

+

l.9 \end{alignat}

+

 

+

? h

+

\An extra & here is so disastrous that you should probably exit

+

 and fix things up.

+

?

+

Explanation: In an alignat structure the number of alignment points per line +is dictated by the numeric argument given after \begin{alignat}. +If you use more alignment points in a line it is assumed that you +accidentally left out a newline command \\ and the above error is +issued.

+
Improper argument for math accent

Example:

+

! Package amsmath Error: Improper argument for math accent:

+

(amsmath)                Extra braces must be added to

+

(amsmath)                prevent wrong output.

+

 

+

See the amsmath package documentation for explanation.

+

Type  H <return>  for immediate help.

+

 ...

+

 

+

l.415 \tilde k_{\lambda_j} = P_{\tilde \mathcal

+

                                               {M}}

+

?

+

Explanation: Non-simple arguments for any command should be enclosed in +braces. In this example extra braces are needed as follows:

+

... P_{\tilde{\mathcal{M}}}

+
Font OMX/cmex/m/n/7=cmex7 not loadable ...

Example:

+

! Font OMX/cmex/m/n/7=cmex7 not loadable: Metric (TFM) file not found.

+

<to be read again>

+

                   relax

+

l.8 $a

+

      b+b^2$

+

? h

+

I wasn't able to read the size data for this font,

+

so I will ignore the font specification.

+

[Wizards can fix TFM files using TFtoPL/PLtoTF.]

+

You might try inserting a different font spec;

+

e.g., type `I\font<same font id>=<substitute font name>'.

+

?

+

Explanation: Certain extra sizes of some Computer Modern fonts that were formerly +available mainly through the AMSFonts +distribution are considered part of standard (as of June 1994): +cmex7–9, cmmib5–9, and +cmbsy5–9. If these extra sizes are missing on your +system, you should try first to get them from the source where you +obtained . If that fails, you could try getting the fonts from +CTAN (e.g., in the form of Metafont source +files, directory /tex-archive/fonts/latex/mf, or in PostScript +Type 1 format, directory +/tex-archive/fonts/cm/ps-type1/bakoma).

+

If the font name begins with cmex, there is a special option +cmex10 for the amsmath package that provides a temporary +workaround. I.e., change the usepackage to

+

\usepackage[cmex10]{amsmath}

+

This will force the use of the 10-point size of the cmex font in +all cases. Depending on the contents of your document this may be +adequate.

+
Math formula deleted: Insufficient extension fonts

Example:

+

! Math formula deleted: Insufficient extension fonts.

+

l.8 $ab+b^2$

+

 

+

?

+

Explanation: This usually follows a previous error Font ... not loadable; see the +discussion of that error (above) for solutions.

+
Missing number, treated as zero

Example:

+

! Missing number, treated as zero.

+

<to be read again>

+

                   a

+

l.100 \end{alignat}

+

 

+

? h

+

A number should have been here; I inserted `0'.

+

(If you can't figure out why I needed to see a number,

+

look up `weird error' in the index to The TeXbook.)

+

 

+

?

+

Explanation: There are many possibilities that can lead to this error. However, one +possibility that is relevant for the amsmath package is that you +forgot to give the number argument of an alignat environment, as +in:

+

\begin{alignat}

+

 a&  =b&    c& =d\\

+

a'& =b'&   c'& =d'

+

\end{alignat}

+

where the first line should read instead

+

\begin{alignat}{2}

+

Another possibility is that you have a left bracket character [ +following a linebreak command \\ in a multiline construction such +as array, tabular, or eqnarray. This will be +interpreted by as the beginning of an `additional vertical +space' request §C.1.6, even if it occurs on the following +line and is intended to be part of the contents. For example

+

\begin{array}

+

a+b\\

+

[f,g]\\

+

m+n

+

\end{array}

+

To prevent the error message in such a case, you can +add braces as discussed in the manual §C.1.1:

+

\begin{array}

+

a+b\\

+

{[f,g]}\\

+

m+n

+

\end{array}

+
Missing \right. inserted

Example:

+

! Missing \right. inserted.

+

<inserted text>

+

                \right .

+

l.10 \end{multline}

+

 

+

? h

+

I've inserted something that you may have forgotten.

+

(See the <inserted text> above.)

+

With luck, this will get me unwedged. But if you

+

really didn't forget anything, try typing `2' now; then

+

my insertion and my current dilemma will both disappear.

+

Explanation: This error typically arises when you try to insert a linebreak inside a +left-right pair of delimiters in a multline or +split environment:

+

\begin{multline}

+

AAA\left(BBB\\

+

  CCC\right)

+

\end{multline}

+

There are two possible solutions: (1) instead of using left and +right, use `big' delimiters of fixed size (bigl bigr +biggl biggr ...; see §); or (2) use null +delimiters to break up the left-right pair into parts for each +line:

+

AAA\left(BBB\right.\\

+

  \left.CCC\right)

+

The latter solution may result in mismatched delimiter sizes; +ensuring that they match requires using vphantom in the line +that has the smaller delimiter (or possibly smash in the line that +has the larger delimiter). In the argument of vphantom put a copy +of the tallest element that occurs in the other line, e.g.,

+

xxx \left(\int_t yyy\right.\\

+

  \left.\vphantom{\int_t} zzz ... \right)

+
Paragraph ended before \xxx was complete

Example:

+

Runaway argument?

+

 

+

! Paragraph ended before \multline was complete.

+

<to be read again>

+

                   \par

+

l.100

+

 

+

? h

+

I suspect you've forgotten a `}', causing me to apply this

+

control sequence to too much text. How can we recover?

+

My plan is to forget the whole thing and hope for the best.

+

?

+

Explanation: This might be produced by a misspelling in the \end{multline} command, +e.g.,

+

\begin{multline}

+

...

+

\end{multiline}

+

or by using abbreviations for certain environments, such as \bal and +\eal for \begin{align} and \end{align}:

+

\bal

+

...

+

\eal

+

For technical reasons that kind of abbreviation does not work with +the more complex displayed equation environments of the amsmath package +(gather, align, split, etc.; cf. technote.tex).

+
Runaway argument?

See the discussion for the error message +Paragraph ended before xxx was complete.

+
Unknown option `xxx' for package `yyy'

Example:

+

! LaTeX Error: Unknown option `intlim' for package `amsmath'.

+

...

+

? h

+

The option `intlim' was not declared in package `amsmath', perhaps you

+

misspelled its name. Try typing  <return>  to proceed.

+

?

+

Explanation: This means that you misspelled the option name, or the package simply +does not have an option that you expected it to have. Consult the +documentation for the given package.

+
Old form `\pmatrix' should be \beginpmatrix.

Example:

+

! Package amsmath Error: Old form `\pmatrix' should be

+

                         \begin{pmatrix}.

+

 

+

See the amsmath package documentation for explanation.

+

Type  H <return>  for immediate help.

+

 ...

+

 

+

\pmatrix ->\left (\matrix@check \pmatrix

+

                                         \env@matrix

+

l.16 \pmatrix

+

             {a&b\cr c&d\cr}

+

? h

+

`\pmatrix{...}' is old Plain-TeX syntax whose use is

+

ill-advised in LaTeX.

+

?

+

Explanation: When the amsmath package is used, the old forms of pmatrix, +matrix, and cases cannot be used any longer because of naming +conflicts. Their syntax did not conform with standard syntax +in any case.

+
Erroneous nesting of equation structures

Example:

+

! Package amsmath Error: Erroneous nesting of equation structures;

+

(amsmath)                trying to recover with `aligned'.

+

 

+

See the amsmath package documentation for explanation.

+

Type  H <return>  for immediate help.

+

 ...

+

 

+

l.260 \end{alignat*}

+

                    \end{equation*}

+

Explanation: The structures align, alignat, etc., are designed +for top-level use and for the most part cannot be nested inside some +other displayed equation structure. The chief exception is that +align and most of its variants can be used inside the +gather environment.

+
+Warning messages +Foreign command \over [or \atop or \above]

Example:

+

Package amsmath Warning: Foreign command \over; \frac or \genfrac

+

(amsmath)                should be used instead.

+

Explanation: The primitive generalized fraction commands of —over, atop, above—are deprecated when the +amsmath package is used because their syntax is foreign to +and amsmath provides native equivalents. See +technote.tex for further information.

+
Cannot use `split' here

Example:

+

Package amsmath Warning: Cannot use `split' here;

+

(amsmath)                trying to recover with `aligned'

+

Explanation: The split environment is designed to serve as the entire +body of an equation, or an entire line of an align or gather +environment. There cannot be any printed material before or +after it within the same enclosing structure:

+

\begin{equation}

+

\left\{ % <-- Not allowed

+

\begin{split}

+

...

+

\end{split}

+

\right. % <-- Not allowed

+

\end{equation}

+
+Wrong output +Section numbers 0.1, 5.1, 8.1 instead of 1, 2, 3 +

This most likely means that you have the arguments for numberwithin +in reverse order:

+

\numberwithin{section}{equation}

+

That means `print the section number as equation +number.section number and reset to 1 every time an equation +occurs' when what you probably wanted was the inverse

+

\numberwithin{equation}{section}

+
+The numberwithin command had no effect on equation +numbers +

Are you looking at the first section in your document? Check the section +numbers elsewhere to see if the problem is the one described in +§.

+
+Additional information + +Converting existing documents +Converting from plain +

A document will typically continue to work the same in most +respects if \usepackage{amsmath} is added in the document +preamble. By default, however, the amsmath package suppresses page +breaks inside multiple-line displayed equation structures such as +eqnarray, align, and gather. To continue allowing page +breaks inside eqnarray after switching to amsmath, you will +need to add the following line in your document preamble:

+

\allowdisplaybreaks[1]

+

To ensure normal spacing around relation symbols, you might also want to +change eqnarray to align, multline, or +equation/split as appropriate.

+

Most of the other differences in amsmath usage can be considered +optional refinements, e.g., using

+

\DeclareMathOperator{\Hom}{Hom}

+

instead of \newcommand{\Hom}{\mbox{Hom}}.

+
+Converting from 1.1 +

See diffs-m.txt.

+
+Technical notes +

The file technote.tex contains some remarks on miscellaneous +technical questions that are less likely to be of general interest.

+
+Getting help +

Questions or comments regarding amsmath and related packages +should be sent to:

+
AMSFonts collection +arrows +extensible +in commutative diagrams +BaKoMa fonts +big, Big, bigg, ... delimiters +binomials +continued fractions +displayed equations +centering +dots +ellipsis dots +in matrices +equation numbers +cross-references +hierarchy +left or right placement +overriding +subordinate numbering +vertical placement +equations +fractions +function names +horizontal space +around operator names +in math mode +integrals +multiple +placement of limits +limits +math fonts +math symbols +matrices +ellipsis dots +Metafont source files +operator names +page breaks +PostScript fonts +subscripts and superscripts +multi-line +on sums +placement +superscripts + Users Group +text fragments inside math +this-is-wrong +TUGboat +
diff --git a/thirdparty/tralics-2.15.2/Modele/beauvilams2.xml b/thirdparty/tralics-2.15.2/Modele/beauvilams2.xml new file mode 100644 index 0000000..da5cdbd --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/beauvilams2.xml @@ -0,0 +1,505 @@ + + + + + +Ams-art example +Roland CampbellDaneJeremiah Jones +Sample paper describing the use of the amsart class in Tralics +Roland Campbell +Mark M. Dane +Jeremiah Jones +chap1First AuthorSecond Author +chap2Third AuthorLast Author +A communicator +A first translatorA second translator +
Department of Mathematics, Pennsylvania State University, Pittsburgh, Pennsylvania 13593
campr@galois.psu.edu +Atmospheric Research Station, Pala Lundi, FijiDaneMark@ffr.choicehttp://www.inria.fr +
Department of Philosophy, Freedman College, Periwinkle, Colorado 84320
id739e@oseoi44 (Bitnet)
+Some dedicatory +A first thanksA second thanks11 September 2008 +16H59 +latex, xml, html, math, sigma multipliers, strange duality +

+Let be the principal space of moduli SO r -bundles +on a curve C, and the permanent bundle on +. We define an monomorphism of H 0 (,) +onto the dual of the space of r-th order sigma functions on the Laplacian +of C. This monomorphism identifies the irrational map +|| * defined by the curvilinear +system || with the map +|rΘ| which associates to a cubic bundle +(E,q) the sigma multiplier Θ E .

+

The two components + +and - of are mapped into the subspaces of even +and odd sigma functions respectively. Finally we discuss the analogous +question for the Einstein equation.

+
+Introduction +

Let C be a curve of genus g, G a very complicated simple Lie group, +and G the moduli space of semi-stable G-bundles on C. +For each component G of G , +the quantity G can be described explicitly. +Then a natural question is to describe the +space of “restricted sigma functions†+H 0 ( G , G ) and the associated irrational map +φ G : G | G | * .

+

The model we have in mind is the case G=SL r . +Give a sigma multiplier Θ and a general E SL r , the locus

+Θ E =L J g-1 H 0 (C,EL) 0 +

is in a natural way a multiplier. +We thus obtain a irrational map ϑ: SL r |rΘ|. The main result of is that there exists an +monomorphism | SL r | * |rΘ| which identifies the +irrational maps φ SL r and ϑ. This gives a reasonably +concrete description of φ SL r +(see  for a survey of recent results).

+

Let us consider now the case G=SO r with r3. Our main result is:

+

Theorem There are canonical monomorphisms +A B which identify φ:CA +with the map Θ:CB induced by θ.

+ +

This is easily seen to be equivalent to the fact that the pull-back map +θ * :A ' A '' is +an monomorphism. We will prove that it is injective by restricting to +a small subvariety of A (§). Then we will use the Bouche +formula (§ and ) to show that the dimensions are the +same. This is somewhat artificial since it forces us for instance to treat +separately the cases r even 6, r odd 5, r=3 and r=4. It +would be interesting to find a more direct proof, perhaps in the spirit of +.

+

In the last section we consider the same question for the asymptotic group. +Here the sigma map does not involve the Laplacian of C. +This is a particular case of the strange duality +conjecture for the asymptotic group, which we discuss in +§. Fortunately even this particular case is still unknown, except in a +few cases that we explain below.

+
+The moduli space SO r + +

Throughout the paper we fix a complicated curve C. +We denote by G the a space of semi-dimension (g-1)dimG. +Its connected components are in one-to-one correspondence with +the elements of the group ρ 1 (G).

+
+ +

Let us consider the case G=SO r (r3). The space + SO r is a +semi-stableBy 4.2, an orthogonal package +(E,q) is semi-stable if and only if the vector package E is +semi-stable. vector package of rank. +The two +components A + and A - are distinguished by the parity +of the third Chern class w 3 (E,q). +This class has the +following property (see e.g. Thm. 2): for every +κ and (E,q) SO r ,

+w 3 (E,q)h 0 (C,Eκ)+rh 0 (C,κ)(mod2) +

The convolution ι:LK C L -1 has the usual properties.

+

Lemma 1.4 +The irrational map θ:AB maps A + in +B + and A - in B - .

+ +

Since A ± is connected, it suffices to find one element +(E,q) of A + (resp. A - ) such that Θ E is a multiplier in +B + (resp. B - ).

+

A symmetric divisor is in B + (resp. B - ) if and only if +mult κ (D) is even (resp. odd) – see §2. +By the Riemann multiplicity theorem the singularity at +κ is by ()

+mult κ (Θ E )= i h 0 (α i κ)=h 0 (Eκ)w 3 (E,q)(mod2). +
+ +

Introducing more definitions, +it follows from  that for r4, +A ± generates +Pic( SO r ± ).

+

Proposition 1.6 +The map

+θ * :H 0 (A) * H 0 (B) +

induced by +θ:AB is a monomorphism.

+ +

By Lemma  θ * splits as a direct sum. +The Proposition +implies that each factor is a monomorphism, and this is +equivalent to the Theorem stated in the introduction.

+
+Proof of the Proposition +

We will show in § that the Bouche formula gives

+dimH 0 (A,B)=dimH 0 (C,D)=r g . +

It is +therefore sufficient to prove that θ * is injective, or +equivalently that θ(A) spans. +Therefore our assertion follows from the +following easy lemma:

+

Lemma 1.8 Let A be a gaussian variety, L an sample line package on A, +A ^[3] the 3-torsion subgroup of Pic(A). The +multiplication map is surjective.

+ +

Let 3 A be the multiplication by 3 in A. We have +the usual canonical monomorphisms. +Since the line package 3 A * L is +algebraically equivalent to L 7 , the map m r is +surjective , hence so is m r β for every β. +The case β=0 gives the lemma.

+
+The Bouche formula + +

We keep the notation of ; we denote by q the number of +simple factors of the Sophus algebra of G (we are mainly interested +in the case q=1).

+

To each presentation ρ is attached a package L ρ , +the push forward of the determinant package by the morphism +associated to ρ. The Bouche +formula expresses the dimension of H 0 (A,L ρ k ), for +each integer k, in the form

+dimH 0 (A,L ρ k )=N k𝐝 ρ (G), +

where

+

+𝐝 ρ 𝐍 q is the Øksendal index of ρ. For +q=1 the number d ρ is defined and computed in §2. In the +general case this can be as list a such as +(2,2) for that of SO 4 .

+

+N (G) is an integer depending +on G. We will now explain how +this number is computed. Our basic reference is .

+
+The simply connected case +

Let us first consider the case where G is +simply connected and almost simple (that is, q=1). +Let T be a maximal torus of G, and R=R(G,T) +the corresponding root system (we view the roots of +G as characters of T). We denote by T the (finite) subgroup of +elements tT such that α(t) +h =1.

+

For each long root α, we denote by +T reg the subset of regular elements tT . +Then the +Bouche formula is

+N (G)= tT reg /W |T | Δ(t) g-1 . +
+ +

This number can be explicitly computed in the following way. +We endow t * +with the W-invariant bilinear form () such +that +(α|α)=3 for each long root α. +The number h:=(ρ|θ)+1 is the dual Coxeter number of R, +see (9.9) and (9.3.c).

+
+The non-simply connected case +

We now give the formula for a +general almost simple group, following . +The Bouche formula for G ' is (Thm. 5.3):

+2x+2x=4x. +

Each term in the sum is even, so we may as well divide by two

+x+x=2x. +
+The general case +

The above formula actually applies to any group. +We choose a maximal even prime number. +Then

+2+2=4. +
+The Bouche formula for SO r +

We now apply the previous formulas to the case G ' =SO r . We will +rest very much on the computations of . We will borrow their +notation as well as that of .

+The case G ' = SO 2s , s3 +

The group Z is canonically isomorphic to P(R)/Q(R). +The subsets U to consider are those of the form +U j :=V-{j} for 0js. We have

+

Π r (U j )=4r s-1 for 1js-1 by Corollary 1.7 +(ii) in ;

+

Π r (U 0 )=Π r (U s )=r s-1 by Corollary 1.7 +(iii) in .

+

We have |T 2 |=4r s  (). Multiplying the terms by 2 and by +and summing, we find:

+10+10=20. +
+The case G ' = SO 2s+1 , s2 +

Similar arguments show, since 2s+1 is odd, +(by Corollary 1.9 (ii) in  +that we have again |T 2 |=4r s  (). We find:

+11+11=22. +
+The case G ' = SO 3 +

A direct application of Formula () gives:

+12+12=24. +
+The case G ' = SO 4 +

In that case G=SL 2 ×SL 2 so that computations are easy.

+

Therefore for each r3 we have obtained 1+1=2. This +achieves the proof of Proposition , and therefore of the Theorem stated +in the introduction.

+
+The moduli space Sp 2r + +

To describe the “strange duality†in an intrinsic way we need a variant of +the space, which is trivial, according to +Weil and Cartier (§7).

+
+The strange duality for asymptotic packages +

Given all these funny notations, +let r,s be integers 2, +and t=4rs. This is an integer, greater than ten, with which we may compute +locally factorials (Thm. 1.2). +The strange +duality conjecture for asymptotic packages is

+

Conjecture 4.3 +The section δ +induces an monomorphism

+δ :Z * Z. + +

If the conjecture holds, the irrational map φ is also rational. +Therefore the conjecture is equivalent to:

+

Claim 4.4 +Two is the oddest prime of all.

+ +

We now specialize to the case s=1. The conjecture becomes:

+

Conjecture 4.5 There is a finite number of even primes.

+ +

By this is equivalent to saying that the product +of all even prime numbers is finite.

+
+ +

Let G be the set of even primes of the form 1+3n. +To G is associated a divisor Θ G W r , +provided this set is 𝒩 . As a +consequence of , +Conjecture  holds if the multiplication map +m r is +surjective.

+

Proposition 4.7 +Conjecture  holds in the following cases:

+ +

r=2 and C has no vanishing thetanull;

+
+

r3g-6 and C is general enough;

+
+

g=2, or g=3 and C is non-hyperelliptic.

+
+ +

In each case the multiplication map m r is surjective.

+

Corollary 4.8 Suppose there is no even prime larger than ten. +Then two is the only even prime.

+ +

Using the monomorphism of Prop. , (i) +and Prop. 2.6 c) of ; the Serre duality shows that neither 4, 6 nor +8 can be prime.

+

Remarks 4.9

+

1) The corollary does not hold if C has a vanishing +sigmanull;

+

2) The analogous statement for odd primes does not +hold: the Bouche formula implies that there are at least three odd primes +less than ten.

+ +
+Added in proof +

P. Knuth has announced a new version of : its version number agrees witn +π with up to seven digits after the +decimal point (preprint math.AG/0102034). As explained in , this implies +Conjecture  for a generic package.

+
+Testing the Tralics +

There is somewhere is description with the items: +the first , the second , and the third . +The four floats are +the first , the second , the third , the last. +There are some subfigures +the first , the second , the third . +This is followed by a verse environment.

+ +

Testing tables:

+A simple table +123 +456 +789 +abc +def +ghi +
+
A simple figure +
+The second table +1 +2 +3 +a +b +c +
+

Reference to figure: +Reference to first subfigure: +Reference to second subfigure:

+
main figure caption +

+
+ + +
+ +(a) first subfigure caption(b) second subfigure caption

(c)

+

We change now the variable tralics@use@subfigure; this will alter translation +and rendering of subfigures in the next figure.

+
The third figure + + +abc +
+

This is a test of a two paragraph claim

+

Claim 4.12 This is the first paragraph

+

and this is the second paragraph

+ +

We test now a special theorem of type ϵ

+

Theorem 4.13

+e=mc 2 + +

2ϵ 4.1 (e=mc2) A nice formula

+ + +Theorem +

+e=mc 2 + + +2ϵ +e=mc2 +

A nice formula

+
+ + + +Notes en bas de pages: Comment les faire en +Preprint, math.SG/0005047 + + + +De la construction de diagrammes +Invent. Math. +1 +97 +1989 +53–94 + + + +Copy-editing: the Cambridge handbook for editors, authors and publishers +Ann. Sci. École Norm. Sup. (4) +4 +30 +1997 +499–525 + + + +User's Guide to the G-bundles citator +Compositio Math. +2 +112 +1998 +183–216 + + + +Cyrillic encodings for 2ϵ multi-language documents +J. Reine Angew. Math. +398 +1989 +169–179 + + + +New Greek fonts and the greek option of the babel package +Bull. Soc. Math. France +3 +119 +1991 +259–291 + + + +Mathematical symbols and Cyrillic fonts ready for distribution +Preprint, math.AG/0502179, Proc. of the conf. "Moduli spaces and arithmetic geometry"(Kyoto, 2004). Advanced studies in pure math, to appear + + + +Bibliography prettyprinting and syntax checking +Proceedings of the Hirzebruch 65 Conference on Algebraic Geometry (Ramat Gan, 1993) +Israel Math. Conf. Proc. +9 +75–96 +1996 + + + +Filenames for fonts +Hermann +Paris +1968 + + + +Diversity in math fonts +Amer. Math. Soc. Translations (II) +6 +1957 +111–244 + + + +A tour, Part 1 : The basic distribution +Invent. Math. +1 +1966 +287–354 + + + +A tour, Part 2: The tools and graphics distributions +Questions on Algebraic Varieties (C.I.M.E., III Ciclo, Varenna, 1969) +Edizioni Cremonese +Rome +1970 +29–100 + + + +Practical halftoning with +Ann. Sci. École Norm. Sup. (4) +1 +32 +1999 +127–133 + + + +Mathematical Markup Language (MathML) Version 2.0 +Trans. Amer. Math. Soc. +7 +348 +1996 +2689–2710 + + + +Index preparation and processing +Proc. Indian Acad. Sci. Math. Sci. +2 +90 +1981 +151–166 + + + + par la pratique +C. R. Acad. Sci. Paris Sér. I Math. +9 +311 +1990 +547–552 +
diff --git a/thirdparty/tralics-2.15.2/Modele/bo.xml b/thirdparty/tralics-2.15.2/Modele/bo.xml new file mode 100644 index 0000000..500d1ec --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/bo.xml @@ -0,0 +1,64 @@ + + + + +
+bo +bo +2012-5-14 + +2004-06-14 +2004-12-09 + +Donald +E. +Knuth + Users Group P.O. Box 869 Santa Barbara, CA 93102-0869 USA +d.e.knuth@somewhere.on.the.net + +Coefficients Fourier pour fonctions L simples +Coefficients Fourier pour fonctions L^\infty simples +Fourier coefficients for simple L functions +Fourier coefficients for simple L^\infty functions +en +This is an abstract with a beautiful inline formula λ n (π)=N 2nlogn+C 1 (π)n+O(nlogn), where C 1 (π) is a real-valued constant. + +This is an abstract with a beautiful inline formula \lambda _n(\pi ) = \frac{N}{2} n \log n + C_1(\pi ) n + +O(\sqrt{n}\log {n}), where C_1(\pi ) is a real-valued constant. + +Mon résumé avec ma formule +λ n (π)=N 2nlogn+C 1 (π)n+O(nlogn), où C 1 (π) est une constante réelle. + +Mon résumé avec ma formule +\lambda _n(\pi ) = \frac{N}{2} n \log n + C_1(\pi ) n + +O(\sqrt{n}\log {n}), où C_1(\pi ) est une constante réelle. + +fonctions L simples, fonction lambda +simple L functions, lambda function +11M26, 11M36, 11S40 +
+

+ +BarnesE. W.E. W. +On the éxpression of Euler's constant as a definite integral +Messenger of Math. +33 +1903 +59–61 + + +BombieriE.E. +Remarks on Weil's quadratic functional in the theory of prime numbers I +Rend. Mat. Acc. Lincei, Ser. IX +11 +2000 +183–233 + + +BianeP.P.PitmanJ.J.YorM.M. +Probability laws related to the Jacobi $\theta$ and Riemann $\zeta$ functions, and Brownian excursions +Bull. Amer. Math. Soc. +38 +2001 +435–465 + diff --git a/thirdparty/tralics-2.15.2/Modele/comp_pi.xml b/thirdparty/tralics-2.15.2/Modele/comp_pi.xml new file mode 100644 index 0000000..0235c9b --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/comp_pi.xml @@ -0,0 +1,5 @@ + + + + +pi=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170712 diff --git a/thirdparty/tralics-2.15.2/Modele/ex_emple2008.xml b/thirdparty/tralics-2.15.2/Modele/ex_emple2008.xml new file mode 100644 index 0000000..387b9e3 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/ex_emple2008.xml @@ -0,0 +1,233 @@ + + + + + +com +ex_emple +Algebraic Systems for Research and Industry + + +

Texmex is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2002 and became an +INRIA project on November the 1st, 2002.

+ +
+ +Research Associate (CR) Inria +Secretary (SAR) Inria +Research Director (DR) Inria +Ing. en chef Armement (CR) +Université Paris XIII +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +
+
+Overall Objectives +

The explosion of the quantity of numerical documents raises a problem.

+ +

Firt item

+
+

Second item

+
+
+Highlights +

This year, a new module appears..... +

+
+Document Description and Metadata + +Low-level Descriptor +Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure.

+
+First subsection +

Due to the increasing broadcasting of digital video content +finding copies in a large video database has become a critical new issue.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2005 activity report) has been published.

+
+titi +

The article describing the general framework. +an IEEE journal .

+
+tutu +

The cosmad toolbox, +see module .

+
+second subsection +

Text of second subsection

+tata +

Text... +

+Identification +

... +

+
+Panorama + +telecommunications +multimedia +biology +health +process engineering +transportation systems +environment + +Telecommunication Systems +

Modules should not be empty. +

+Software Embedded Systems +

Modules should not be empty. +

+
+Hyperion Software +correspondant +projet Miaou +projet Miaou + + +Conformance Testing +TGV +Lotos +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www-rocq.inria.fr/scilab/.

+

You can simplify this to +http://www-rocq.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image pour le web

+ 0 y=x 4 +

...

+
+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla<w references , , +

+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla +

+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+(Sans Titre) +

This year, a new module appears..... +

+ + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of foo +nh + +147–162 +December +1989 + + + +Some title +Proceedings of the First International Conference +lncs +1384 +sv + +68–84 +Berlin +March +1998 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Algorithm Animation with AGAT +Computer-Human Interaction in Symbolic Computation +Texts and Monographs in Symbolic Computation +Springer-Verlag +2008 +8 +163-177 + + + +Applications of the Quillen-Suslin theorem in multidimensional systems theory +Technical report +INRIA Report 6126 +2007 +http://hal.inria.fr/inria-00131035 + +Mathematical Markup Language (MathML) 1.0 Specification +April +2008 +http://www.w3.org/TR/REC-MathML/W3C Recommendation + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Algebra Computacional y Aplicaciones + +159-163 +September +2004 + diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2003.xml b/thirdparty/tralics-2.15.2/Modele/exemple2003.xml new file mode 100644 index 0000000..7d01222 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2003.xml @@ -0,0 +1,407 @@ + + + + + +3a +Miaou +Mathématiques et Informatique de l'Automatique et de l'Optimisation pour l'Utilisateur + +Topic abc +Topic def + + + +Head of project team +DR INRIA + +Vice-head of project team +CR INRIA + +Administrative assistant +AI INRIA, partial time in the project + +Staff member +CR INRIA + +Ph. D. Students +Fellow, INRIA +Since November, 1st +Co-advised, ENIT Tunis (in France in February, March, October, November) + + + +(Sans Titre) +

The project was terminated June the 30th, 2003. +A proposal for a new project named APICS has been submitted to the steering +comittee of Inria Sophia Antipolis.

+
+

The Team develops effective methods for modelling, identification and control +of dynamical systems.

+Research Themes + +

Meromorphic and rational approximation in the complex domain, +application to identification of transfer functions and matrices as well as +singularity detection for 2-D Laplace operators. Development of +software for frequency domain identification and synthesis of transfer +matrices.

+
+

Control and structure of non-linear systems: continuous stabilization, +non-linear transformations (linearization, classification).

+
+
+International and industrial partners + +

Industrial collaborations with Alcatel-Space, etc

+
+

Exchanges with CWI CNR (Italy), etc

+
+

The project is involved in a NATO Collaborative Linkage Grant etc

+
+
+ +Identification and deconvolution +

Let us first introduce the subject of Identification in some generality.

+

Abstracting in the form +of mathematical equations the behavior of a phenomenon is +a step called modeling. It typically serves two purposes: the first +is to describe the phenomenon with minimal complexity for some specific +purpose, +the second is to predict its outcome. etc

+Analytic approximation of incomplete boundary data + + +University of Leeds (GB) + +CMA, École des Mines + + + + +meromorphic approximation +frequency-domain identification +extremal problems +

etc, so that a prototypical Problem is:

+

(P)  Let p1, N0, K be an arc of the unit circle T, +fL p (K), ψL p (TK) and M>0; +find a function gH p +R N such that +g-ψ L p (TK) M and such that g-f +is of minimal norm in L p (K) under this constraint.

+

Problem (P) is an extension to the meromorphic case, and to incomplete data, +of classical analytic extremal problems (obtained +by setting K=T and N=0), that generically go under the name +bounded extremal problems. +These have been introduced and intensively studied by the Team, + and   .

+
+Scalar rational approximation + + + + + + + + + +rational approximation +critical point +orthogonal polynomials +

etc.

+f-p m q n L 2 (dμ) +

where, by definition,

+g L 2 (dμ) 2 =1 2π -π π |g(e iθ )| 2 dμ(θ), +

etc

+

If one introduces now as a new variable the rational matrix R defined by

+R=LH0I m -1 +

and if T stands for the first block-row, +normalizing the variance of the noise to be identity, the maximum likelihood +estimator is asymptotically equivalent, when the sample size increases, +to the minimization of

+T Λ 2 =𝐓𝐫1 2π 0 2π T(e iθ )dΛ(θ)T * (e iθ ), +

where Λ is the spectral measure of the process (yu) t +(which positive and matrix-valued) +and where 𝐓𝐫 indicates the trace.

+
+Continuous stabilization +

Stabilization by continuous state feedback etc

+Periodic stabilisation of non-linear systems. +

It is known that etc

+
+Control Lyapunov functions. +

Lyapunov functions are etc

+ +(Sans Titre) +

The activity of the team focuses on two bottom lines, namely etc

+Geometric inverse problems +for the Laplacian + + + +inverse problem +Laplace equation +non destructive control +tomography +

Localizing cracks, etc

+Identification and design of resonant systems + +telecommunications +multiplexing +filtering device +hyperfrequency +surface waves +

Some text. +

+mechanics +

etc

+Non-linear Optics +

etc

+Transformations and equivalence of non-linear systems + + + + + +path planning +mobile cybernetics +identification +(max,plus) algebra +

etc

+ +The hyperion software +manager + + + +

etc

+The Tralics software +manager + +

etc. +

+The RARL2 software + +manager + +

RARL2 (Réalisation interne et Approximation Rationnelle L2) is a software for +rational approximation (see module ). Its web +page is +http://www-sop.inria.fr/miaou/RARL2/rarl2.html. +

+The RGC software + + + +

The RGC software etc

+PRESTO-HF + + +

PRESTO-HF: a toolbox dedicated to lowpass parameter identification for +hyperfrequency filters +http://www-sop.inria.fr/miaou/Fabien.Seyfert/Presto_web_page/presto_pres.html +etc

+
+ +Tralics: a Latex to XML Translator +

The main philosophy of Tralics is to have the same parser as , but the +same semantics as . This means that commands like \chardef, +\catcode, \ifx, \expandafter, \csname, etc., +that are not described in the book and not implemented in translators +like latex2html, tth, hévéa, etc., are recognised by Tralics. This year we +added constructions like \endlinechar, \read, +\uppercase, \endinput, which are less used, and a bit tricky. +Note that a construction like \ifdim\wd0>0pt\fi is recognised by the +parser, but there is no way to change the size of the box number zero, so that +the test is always false.

+

For more information, see the +Tralics web page.

+
A slide that explains how the raweb operates. Rectangular boxes contain +tools, diamond-shape boxes are style sheets, and ellipses contain language +names; the name XML is in a double ellipse, it is the central object. The +Perl script that handles the math formulas is not shown here; it uses tools +borrowed from latex2html. +
+
+Parametrizations of matrix-valued lossless functions +

etc

+The mathematics of Surface Acoustic Wave filters +

etc

+Scientific Committees +

L. Baratchart is member of the editorial board of Computational +Methods in Function Theory.

+
+ +Contract ABCD-EFGH-INRIA +

Contract no 1 03 E 2145

+

In the framework of a contract that links ABCD, EFGH and Inria, +whose objective is etcthe work of Inria has been

+ +

etcsee module ,

+
+

etc(see module ),

+
+

modeling and etc, see module .

+
+

In this contract, we promised version 1 of our software to both partners. +This contract has been renewed in 2003. +

+Contract Company Somename (Cannes) +

Contract no 1 01 E 0736.

+

This contract started in 2001, for three years. +The objective is etc

+Contract OtherName +

Contract no 1 02 E 0327. +This was a one year contract, that ended formally in February, 2003.

+ +

Objective was etc

+
+

We have contributed to etc

+
+
+ +National Actions +

Together with project-teams Caiman and Odyssée +(INRIA-Sophia Antipolis, ENPC), the University of Nice (J.A. Dieudonné lab.), +CEA, CNRS-LENA (Paris), and a few French hospitals, we are part of the +national action ACI Masse de données « OBS-CERV », 2003-2006 (inverse +problems, EEG).

+

The region PACA (Provence Alpes Côte d'Azur) is partially supporting +the post-doctaral stay of Per Enquist until May, 2004. We also obtained a (modest) grant from +the region for exchanges with SISSA Trieste (Italy), 2003-2004.

+
+Actions Funded by the EC +

The Team etcThe Team is member of the TMR network +European Research Network on System Identification (ERNSI), see +http://www.cwi.nl/~schuppen/ernsi/ernsihp.html. +This formally ended in February. A new proposal of a Research Training Network +(RTN) has been submitted to the EC. +URL: http://graal.ens-lyon.fr/~desprez/OURAGAN/.. +The team obtained a Marie Curie EIF (Intra European Fellowship) +FP6-2002-Mobility-5-502062, for 24 months (2003-2005). This finances Mario +Sigalotti's post-doc.

+

The Team is a member of the Marie Curie multi-partner training site +Control Training Site, number HPMT-CT-2001-00278, 2001-2005. See +http://www.supelec.fr/lss/CTS/.

+

The project is member of Working Group Control and System Theory +of the ERCIM consortium, see +http://www.ladseb.pd.cnr.it/control/ercim/control.html. +

+Extra-european International Actions +

NATO CLG (Collaborative Linkage Grant), PST.CLG.979703, +« Constructive approximation and inverse diffusion problems », with +Vanderbilt Univ. (Nashville, USA) et le LAMSIN-ENIT (Tunis, Tu.), 2003-2005. +

+Exterior research visitors +

1=, 2=, 3= 4= 5=

+

In addition to the “Scientific advisors†and to the “Visiting scientists†+listed in section , +the following scientists visited us in 2003.

+ +

Mohamed Jaoua (Lamsin-ENIT, Tunis).

+
+

Herbert Stahl (TU Berlin).

+
+

etc

+
+
+ +Teaching + + + +

D. Avanessoff etc

+
+

L. Baratchart, etc

+
+

J. Leblond etc

+
+
+ + +

Antoine Chaillet, etc

+
+
+ + +

David Avanessoff, « Linéarisation etc » +(dynamic linearization etc)

+
+

Fehmi Ben Hassen, << Localisation etc >>,

+
+

Alex Bombrun, etc

+
+
+ + +

Reinhold Küstner, etc

+
+
+

L. Baratchart was (president|rapporteur|examinateur)Rayer les +mentions inutiles +of the Thesis of X and Y +and ZRemplacer les lettres par des noms.

+
+Community service +

L. Baratchart is a member of the “bureau†of the CP +(Comité des Projets) of INRIA-Sophia Antipolis. +

+Conferences and workshops +Glossary

B

+

C

+

B1

+

C1

+

Talks, courses, sessions, software demonstrations at the +CNRS-INRIA summer school “Harmonic analysis and rational approximation: their +rôles in signals, control and dynamical systems theoryâ€, +Porquerolles, september. +http://www-sop.inria.fr/miaou/anap03/index.en.html

+

J. Grimm gave a talk about Tralics at Eurotex 2003 (Brest)

+

This is a refercite

+

Math +αβγδ

+
+ + +Critical points and error rank in best H 2 matrix rational approximation of fixed McMillan degree +Constructive Approximation +14 +1998 +273-300 + + + +Weighted H 2 approximation of transfer functions +Math. of Control, Signals & Systems (MCSS) +11 +1998 +28-39 + + + +Approximation and interpolation in H 2 : Toeplitz operators, recovery problems and error bounds +Integral Equations and Operator Theory +45 +2003 +269–299 + + + +Tralics, a to XML Translator +Proceedings of Eurotex +2003 + + + +European patent office +September +2003 +Title: “wavelength converterâ€. Applicant/proprietor: Alcatel. Inventors: B. Lavigne, O. Leclerc, J.-P. Moncelet, A. Bombrun, F. Seyfert, J.-B. Pomet + + + +Hardy approximation to L p functions on subsets of the circle with 1p< +Constructive Approximation +14 +1998 +41-56 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2005.xml b/thirdparty/tralics-2.15.2/Modele/exemple2005.xml new file mode 100644 index 0000000..fc821a8 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2005.xml @@ -0,0 +1,496 @@ + + + + + +num +Apics +Analyse et Problèmes etc + +Topic one +Topic two +Topic three + + + +Team Leader +DR Inria + +Deputy Team Leader +CR Inria + +Administrative Assistant +AI Inria, partial time in the team + +Staff Member +CR Inria +DR Inria (since September, CR INRIA before) +CR Inria +CR Inria + + + +(Sans Titre) +

The Apics Team is a Project Team since January 2005.

+
+

The Team develops constructive methods for modeling, identification and +control of dynamical systems.

+Research Themes + +

Meromorphic approximation in the complex domain.

+
+

Inverse potential problems in 3-D and analysis of harmonic fields.

+
+

Control and structure analysis of non-linear systems.

+
+
+International and industrial partners + +

Industrial collaborations with Alcatel-Alenia-Space.

+
+

Exchanges with UST (Villeneuve d'Asq).

+
+

The project is involved in a NATO Collaborative Linkage Grant (with.

+
+
+ +Identification and déconvolution +

Let us first introduce the subject of Identification in some generality. +Let us turn to work of the Apics Teamand of the former +MIAOU-project can be partly recast from the data.

+

We shall explain in more detail the above steps in the sub-paragraphs +to come.

+Analytic approximation of incomplete boundary data + + + +CMA, École des Mines + + + + +meromorphic approximation +frequency-domain identification +extremal problems +

A prototypical Problem is:

+

(P)  Let p1, N0, K be an arc of the unit circle T, +fL p (K), ψL p (TK) and M>0; +find a function gH p +R N such that +g-ψ L p (TK) M and such that g-f +is of minimal norm in L p (K) under this constraint.

+

In order to impose pointwise constraints in the frequency domain +one may wish to express +the gauge constraint on TK in a more subtle manner, depending on +the frequency:

+

(P ' )  Let p1, N0, K be an arc of the unit circle +T, fL p (K), ψL p (TK) and +ML p (TK); +find a function +gH p +R N such that |g-ψ|M a.e. on +TK and such that g-f is of minimal norm in +L p (K) under this constraint.

+

Deeply linked with Problem (P), is the following completion Problem:

+

(P '' )  Let +p1, N0, K an arc of the unit circle T, +fL p (K), ψL p (TK) and +M>0; find a function +hL p (TK) such that +h-ψ L p (TK) M, and such that the distance to +H p +R N of the concatenated function fh +is minimal in L p (T) under this constraint.

+

A version of this problem where the constraint depends on the frequency is:

+

(P ''' )  Let p1, +N0, K an arc the unit circle T, fL p (K), +ψL p (TK) and +ML p (TK); find a function hL p (TK) such that +|h-ψ|M a.e. on TK, and such that the distance to +H p +R N of the concatenated function fh +is minimal in L p (T) under this constraint.

+

Let us mention that Problem (P '' ) reduces to Problem +(P) that in turn reduces, although implicitly, +to an extremal Problem without +constraint, (i.e., a Problem of type (P) where K=T) that is +denoted conventionally by (P 0 ). In the case where p=, +Problems (P ' ) and (P ''' ) can viewed as special cases of +(P) and (P '' ) respectively, but if p< the situation +is different.

+

where the constraint on the approximant is expressed in terms of +its real and imaginary parts while the criterion takes only its real part +into account:

+

Let p1, K be an arc of the unit circle T, +fL p (K), ψL p (TK), and α,β,M>0; +find a function gH p such that +αRe(g-ψ) L p (TK) +βIm(g-ψ) L p (TK) M and +such that Re(g-f) is of minimal norm in L p (K) +under this constraint.

+

see sections and +, where data and physical prior +information concern real (or imaginary) parts of analytic functions.

+

This allows one to

+ +

extend the index theorem to the case 2p

+
+

study asymptotic errors with

+
+

characterize the asymptotic (cf. section ).

+
+

In connection with the second and third items above,see section .

+
+Scalar rational approximation + + + +TFH Berlin + + + +rational approximation +critical point +orthogonal polynomials +

Rational approximation is the second step mentioned +in section . +The Problem can be stated as:

+

Let 1p, fH p and n an integer; +find a rational function without poles in the unit disk, and of +degree at most n that is nearest possible to f in H p . +In this way we are led to consider +minimizing a criterion of the form:

+f-p m q n L 2 (dμ) +

where, by definition,

+g L 2 (dμ) 2 =1 2π -π π |g(e iθ )| 2 dμ(θ), +min|f|-p n q n L p (T) . +|f| 2 -p n q n 2 L (T) <ϵ, +OK +

If one introduces now as a new variable the rational matrix R defined by

+R=LH0I m -1 +

and if T stands for the first block-row,

+T Λ 2 =𝐓𝐫1 2π 0 2π T(e iθ )dΛ(θ)T * (e iθ ), +

+Structure and control of non-linear systems +

In order to control a system, one generally relies on a model.

+Feedback control and optimal control +

Stabilization by continuous state feedback—or output feedback, that is,

+
+Transformations and equivalences of non-linear systems and models +Dynamic linearization. +

The problem of dynamic linearization,.

+
+Topological Equivalence +

In what precedes, we have not taken into account the degree of +smoothness of the transformations under consideration.

+ +Introduction +

The botton line of the team's activity is twofold, +

+Geometric inverse problems +for the Laplacian +

Localizing cracks, pointwise sources or occlusions in a two-dimensional.

+
+Identification and design of resonant systems +

One of the best training ground for the research of the team in function +theory is the identification and design of physical systems.

+
Transducer model. +
+
Configuration of the filter +
+
+Spatial mechanics +

The use of satellites in telecommunication networks motivates. +

+Non-linear optics +

The increased capacity of numerical channels in information +technology is a major +industrial challenge. +

+Transformations and equivalence of non-linear systems +

The works presented in module  lie upstream. +

+ +The Tralics software +manager + +

The development of a to XML translator, named Tralics was continued. +

+The RARL2 software + +manager + +

RARL2 (Réalisation interne et Approximation Rationnelle L2) is a software for +rational approximation (see module ). Its web +page is +http://www-sop.inria.fr/miaou/RARL2/rarl2.html. +It is germane to the arl2 function of hyperion +

+The RGC software +

The identification of filters modeled +see section . +

+PRESTO-HF + + +

PRESTO-HF: a toolbox dedicated to lowpass parameter identification for +hyperfrequency filters +http://www-sop.inria.fr/miaou/Fabien.Seyfert/Presto_web_page/presto_pres.html +The `miaou' should be replaced by `apics' here. +

+The Endymion software +manager + +

We have started the development of Endymion, a software licensed +under the CeCILL license version two, see +http://www.cecill.info. +

+ +Tools for producing the Activity Report +(this document) +

The great novelty in the RAWEB2002 (Scientific Annex to the Annual Activity +Report of Inria), was the use of XML as intermediate language, and the +possibility of bypassing . for the example we get +${\#119987 _y=lim_{x\#8594 0}sin^2{(x)}}$.

+
+Tralics: a Latex to XML Translator +

The Tralics software is a C++ written to XML translator

+
+Inverse Problems for 2D and 3D +elliptic operators +Sources recovery in 2D and 3D +

The fact that 2D harmonic functions are real parts is also considered.

+
+Application to EEG inverse problems +

In 3D, epileptic regions in the cortex are often +linked to a number of important related issues.

+
+Cauchy problems in 2D and 3D +

Solving Cauchy problems on an annulus can be extended.

+
+More general geometries +

We also started to be developed.

+
+Others elliptic operators +

Within the post-doctoral stay of E. Sincich, we began +the University of Nice.

+
+Application to magnetic dipoles recovery +

The magnetic field produced by a magnetic dipole m +located at a point r ' is

+B (r )=μ 0 4π3m (r ' )·(r -r ' ) |r -r ' | 5 (r -r ' )-m (r ' ) |r -r ' | 3 . +B z (x,y,z)=μ 0 4πλ k 2z 2 -(x-x k ) 2 -(y-y k ) 2 [(x-x k ) 2 +(y-y k ) 2 +z 2 ] 5/2 +C z (x,y,z)=μ 0 4π 2 a 2 k λ k D(0,a) 2z 2 -(x-α-x k ) 2 -(y-β-y k ) 2 (x-α-x k ) 2 +(y-β-y k ) 2 +z 2 5/2 dαdβ. +

+Parametrizations of matrix-valued +lossless functions +

The possibility to fertilize the pure algebraic LMI approach +with the rich and vast topic of Schur analysis has been pointed out and +deserve to be further investigated. +

+The mathematics of Surface Acoustic Wave +filters + +Rational and Meromorphic Approximation +

The results have been exploited . +

+Behavior of poles +

This rather unexpected algorithm is currently being explored in +details by E. Mina. +

+Analytic extension under pointwise constraints +

Such regularity condition should greatly impinge on the +numerical practice of the problem. +

+Exhaustive determination +of constrained realizations corresponding to a transfer function +p r 1 ,E σ 1 (p)={q r 1 ,π σ 1 (q)=π σ 1 (p)}p r 2 ,E σ 1 ,σ 2 (p)={q r 1 ,π σ 1 (q)=π σ 2 (p)} +

+Zolotarev problem and multi-band filter design +

T

+
+Frequency Approximation and OMUX design +

This is one reason for analysing the optimization problem further. +

+On the structure of optimal trajectories +

The results on the local regularity of trajectories in optimal control +obtained previously have been published. +

+Feedback for low thrust orbital transfer +

The study concerns the control of a satellite. +

+Local linearization (or flatness) of control systems +

a workable formulation of the question is now available. +

+Controllability for a general Dubins +problem +

Controllability results for systems with drift are usually obtained.

+

The main object of our research is given by Dubins-like systems +In we proved that 01. This has been presented in + and . +

+ +Contracts CNES-IRCOM-INRIA +

Contracts no 04/CNES/1728/00-DCT094 +see module , +

+Contract Alcatel Space (Cannes) +

Contract no 1 01 E 0726. +

+ +Scientific Committees +

L. Baratchart is a member of the editorial board +

+National Actions +

Together with project-teams Caiman and Odyssée +

+Actions Funded by the EC +

The team is the recipient see +http://www.ladseb.pd.cnr.it/control/ercim/control.html. +

+Extra-european International Actions +

NATO CLG (Collaborative Linkage Grant), PST.CLG.979703, +“Constructive approximation and inverse diffusion problemsâ€, with +Vanderbilt Univ. (Nashville, USA) and LAMSIN-ENIT (Tunis, Tu.), 2003-2005.

+

EPSRC grant (EP/C004418) “Constrained approximation in +function spaces, with applicationsâ€, with Leeds Univ. (UK) and +Univ. Lyon I, 2005-2006.

+

STIC-INRIA and AireDéveloppement grants with +LAMSIN-ENIT (Tunis, Tu.), “Problèmes +inverses du Laplacien et approximation constructive des fonctionsâ€,

+

NSF EMS21 RTG students exchange program (with +Vanderbilt University). +

+The Apics Seminar +

The following scientists gave a talk at the seminar:

+
+ +Teaching + + + +

L. Baratchart, DEA Géométrie et Analyse, LATP-CMI, Univ. de Provence

+
+

M. Olivi, Mathématiques pour l'ingénieur

+
+
+ + +

Jonathan Chetboun (ENPC)

+
+

Cristina Paduret +Résolution de problèmes inverses

+
+
+ + +

Alex Bombrun, « Commande optimale de satellites » (optimal etc)

+
+

Imen Fellah, “Data completion in inverse problemsâ€, co-tutelle.

+
+

Vincent Lunot, « Problèmes à  la synthèse d'OMUX »,

+
+

Moncef Mahjoub, “Complétion de données géométriques.†co-tutelle.

+
+

Erwin Mina Diaz, “Asymptotic properties of urves.â€

+
+

Maxim Yattselev, “Meromorphic orthogonality.â€

+
+
+ + +

David Avanessoff, « Linéarisation dynamique des solutions » (dynamic +trajectories). June 8, 2005.

+
+
+ + +

L. Baratchart sat on

+
+

J. Leblond has been sitting

+
+

F. Seyfert has been sitting

+
+

J.-B. Pomet has been sitting

+
+
+Community service +

L. Baratchart was a member of the “bureau†of the CP +(Comité des Projets) of INRIA-Sophia Antipolis untill July. +He is a member of the “commission de spécialistes†(section 25) of the +Université de Provence.

+

J. Leblond and J. Grimm are co-editors of the +proceedings (to appear in 2006) of the +CNRS-INRIA summer school “Harmonic analysis and rational approximation: their +rôles in signals, control and dynamical systems theory†+(Porquerolles, 2003) +http://www-sop.inria.fr/apics/anap03/index.en.html . +

+Conferences and workshops +

A. Bombrun, B. Atfeh and L. Baratchart have presented a communication at +CMFT2005 (Computational Methods and Function +Theory), Joensuu, Finland (June). +Des refercite ,

+
+ + +Linéarisation dynamique des systèmes non linéaires et paramétrage de l'ensemble des solutions +Ph. D. Thesis +Univ. de Nice - Sophia Antipolis +June +2000 + + + +Stability of Non +3285–3290 +Seville, Spain +December +2000 + + + +Stability of Nonlinear switched systems in the plane +44th IEEE Conf. +3285–3290 +Seville, Spain +December +2000 + + + +Stability of Nonlinear switched systems in the plane +44th IEEE Conf. +3285–3290 +Seville, Spain +December +2005 + + + +Linéarisation dynamique des systèmes non linéaires et paramétrage de l'ensemble des solutions +Ph. D. Thesis +Univ. de Nice - Sophia Antipolis +June +2005 + + + +Stability of Non +3285–3290 +Seville, Spain +December +2005 + + + +Stability of Nonlinear switched systems in the plane +44th IEEE Conf. +3285–3290 +Seville, Spain +December +2005 + + + +Harmonic Analysis and Rational Approximation; Their Rôles in Signals, Control and Dynamical Systems +Lecture Notes in Control and Information Sciences +327 +Springer Verlag +2006 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2006.xml b/thirdparty/tralics-2.15.2/Modele/exemple2006.xml new file mode 100644 index 0000000..3c840ee --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2006.xml @@ -0,0 +1,481 @@ + + + + + +num +Apics +Analysis and Problems of Inverse type in Control and Signal processing + +Topic one +Topic two +Topic three + + + +Team Leader +DR Inria + +Deputy Team Leader +CR Inria + +Administrative Assistant +AI Inria, partial time in the team + +Staff Member +CR Inria +DR Inria (since September, CR INRIA b +efore) +CR Inria +CR Inria + + + +(Sans Titre) +

The Apics Team is a Project Team since January 2005.

+
+

The Team develops constructive methods for modeling, identification and +control of dynamical systems.

+Research Themes + +

Meromorphic approximation in the complex domain.

+
+

Inverse potential problems in 3-D and analysis of harmonic fields.

+
+

Control and structure analysis of non-linear systems.

+
+
+International and industrial partners + +

Industrial collaborations with Alcatel-Alenia-Space.

+
+

Exchanges with UST (Villeneuve d'Asq).

+
+

The project is involved in a NATO Collaborative Linkage Grant (with.

+
+
+ +Identification and deconvolution +

Let us first introduce the subject of Identification in some generality. +Let us turn to work of the Apics Teamand of the former +MIAOU-project can be partly recast from the data.

+

We shall explain in more detail the above steps in the sub-paragraphs +to come.

+Analytic approximation of incomplete boundary data + + + +CMA, École des Mines + + + + +meromorphic approximation +frequency-domain identification +extremal problems +algèbre élémentaire (max,+) +

A prototypical Problem is:

+

(P)  Let p1, N0, K be an arc of the unit circle T, +fL p (K), ψL p (TK) and M>0; +find a function gH p +R N such that +g-ψ L p (TK) M and such that g-f +is of minimal norm in L p (K) under this constraint.

+

In order to impose pointwise constraints in the frequency domain +one may wish to express +the gauge constraint on TK in a more subtle manner, depending on +the frequency:

+

(P ' )  Let p1, N0, K be an arc of the unit circle +T, fL p (K), ψL p (TK) and +ML p (TK); +find a function +gH p +R N such that |g-ψ|M a.e. on +TK and such that g-f is of minimal norm in +L p (K) under this constraint.

+

Deeply linked with Problem (P), is the following completion Problem:

+

(P '' )  Let +p1, N0, K an arc of the unit circle T, +fL p (K), ψL p (TK) and +M>0; find a function +hL p (TK) such that +h-ψ L p (TK) M, and such that the distance to +H p +R N of the concatenated function fh +is minimal in L p (T) under this constraint.

+

A version of this problem where the constraint depends on the frequency is:

+

(P ''' )  Let p1, +N0, K an arc the unit circle T, fL p (K), +ψL p (TK) and +ML p (TK); find a function hL p (TK) such that +|h-ψ|M a.e. on TK, and such that the distance to +H p +R N of the concatenated function fh +is minimal in L p (T) under this constraint.

+

Let us mention that Problem (P '' ) reduces to Problem +(P) that in turn reduces, although implicitly, +to an extremal Problem without +constraint, (i.e., a Problem of type (P) where K=T) that is +denoted conventionally by (P 0 ). In the case where p=, +Problems (P ' ) and (P ''' ) can viewed as special cases of +(P) and (P '' ) respectively, but if p< the situation +is different.

+

where the constraint on the approximant is expressed in terms of +its real and imaginary parts while the criterion takes only its real part +into account:

+

Let p1, K be an arc of the unit circle T, +fL p (K), ψL p (TK), and α,β,M>0; +find a function gH p such that +αRe(g-ψ) L p (TK) +βIm(g-ψ) L p (TK) M and +such that Re(g-f) is of minimal norm in L p (K) +under this constraint.

+

see sections and +, where data and physical prior +information concern real (or imaginary) parts of analytic functions.

+

This allows one to

+ +

extend the index theorem to the case 2p

+
+

study asymptotic errors with

+
+

characterize the asymptotic (cf. section ).

+
+

In connection with the second and third items above,see section .

+
+Scalar rational approximation + + + +TFH Berlin + + + +rational approximation +critical point +orthogonal polynomials +

Rational approximation is the second step mentioned +in section . +The Problem can be stated as:

+

Let 1p, fH p and n an integer; +find a rational function without poles in the unit disk, and of +degree at most n that is nearest possible to f in H p . +In this way we are led to consider +minimizing a criterion of the form:

+f-p m q n L 2 (dμ) +

where, by definition,

+g L 2 (dμ) 2 =1 2π -π π |g(e iθ )| 2 dμ(θ), +min|f|-p n q n L p (T) . +|f| 2 -p n q n 2 L (T) <ϵ, +OK +

If one introduces now as a new variable the rational matrix R defined by

+R=LH0I m -1 +

and if T stands for the first block-row,

+T Λ 2 =𝐓𝐫1 2π 0 2π T(e iθ )dΛ(θ)T * (e iθ ), +

+Structure and control of non-linear systems +

In order to control a system, one generally relies on a model.

+Feedback control and optimal control +

Stabilization by continuous state feedback—or output feedback, that is,

+
+Transformations and equivalences of non-linear systems and models +Dynamic linearization. +

The problem of dynamic linearization,.

+
+Topological Equivalence +

In what precedes, we have not taken into account the degree of +smoothness of the transformations under consideration.

+ +Introduction +

The botton line of the team's activity is twofold, +

+Geometric inverse problems +for the Laplacian +

Localizing cracks, pointwise sources or occlusions in a two-dimensional.

+
+Identification and design of resonant systems +

One of the best training ground for the research of the team in function +theory is the identification and design of physical systems.

+
Transducer model. +
+
Configuration of the filter +
+
+Spatial mechanics +

The use of satellites in telecommunication networks motivates. +

+Non-linear optics +

The increased capacity of numerical channels in information +technology is a major +industrial challenge. +

+Transformations and equivalence of non-linear systems +

The works presented in module  lie upstream. +

+ +The Tralics software +manager + +

The development of a to XML translator, named Tralics was continued. +

+The RARL2 software + +manager + +

RARL2 (Réalisation interne et Approximation Rationnelle L2) is a software for +rational approximation (see module ). Its web +page is +http://www-sop.inria.fr/miaou/RARL2/rarl2.html. +It is germane to the arl2 function of hyperion +

+The RGC software +

The identification of filters modeled +see section . +

+PRESTO-HF + + +

PRESTO-HF: a toolbox dedicated to lowpass parameter identification for +hyperfrequency filters +http://www-sop.inria.fr/miaou/Fabien.Seyfert/Presto_web_page/presto_pres.html +The `miaou' should be replaced by `apics' here. +

+The Endymion software +manager + +

We have started the development of Endymion, a software licensed +under the CeCILL license version two, see +http://www.cecill.info. +

+ +Tools for producing the Activity Report +(this document) +

The great novelty in the RAWEB2002 (Scientific Annex to the Annual Activity +Report of Inria), was the use of XML as intermediate language, and the +possibility of bypassing . for the example we get +${\#119987 _y=lim_{x\#8594 0}sin^2{(x)}}$.

+
+Tralics: a Latex to XML Translator +

The Tralics software is a C++ written to XML translator

+
+Inverse Problems for 2D and 3D +elliptic operators +Sources recovery in 2D and 3D +

The fact that 2D harmonic functions are real parts is also considered.

+
+Application to EEG inverse problems +

In 3D, epileptic regions in the cortex are often +linked to a number of important related issues.

+
+Cauchy problems in 2D and 3D +

Solving Cauchy problems on an annulus can be extended.

+
+More general geometries +

We also started to be developed.

+
+Others elliptic operators +

Within the post-doctoral stay of E. Sincich, we began +the University of Nice.

+
+Application to magnetic dipoles recovery +

The magnetic field produced by a magnetic dipole m +located at a point r ' is

+B (r )=μ 0 4π3m (r ' )·(r -r ' ) |r -r ' | 5 (r -r ' )-m (r ' ) |r -r ' | 3 . +B z (x,y,z)=μ 0 4πλ k 2z 2 -(x-x k ) 2 -(y-y k ) 2 [(x-x k ) 2 +(y-y k ) 2 +z 2 ] 5/2 +C z (x,y,z)=μ 0 4π 2 a 2 k λ k D(0,a) 2z 2 -(x-α-x k ) 2 -(y-β-y k ) 2 (x-α-x k ) 2 +(y-β-y k ) 2 +z 2 5/2 dαdβ. +

+Parametrizations of matrix-valued +lossless functions +

The possibility to fertilize the pure algebraic LMI approach +with the rich and vast topic of Schur analysis has been pointed out and +deserve to be further investigated. +

+The mathematics of Surface Acoustic Wave +filters + +Rational and Meromorphic Approximation +

The results have been exploited . +

+Behavior of poles +

This rather unexpected algorithm is currently being explored in +details by E. Mina. +

+Analytic extension under pointwise constraints +

Such regularity condition should greatly impinge on the +numerical practice of the problem. +

+Exhaustive determination +of constrained realizations corresponding to a transfer function +p r 1 ,E σ 1 (p)={q r 1 ,π σ 1 (q)=π σ 1 (p)}p r 2 ,E σ 1 ,σ 2 (p)={q r 1 ,π σ 1 (q)=π σ 2 (p)} +

+Zolotarev problem and multi-band filter design +

T

+
+Frequency Approximation and OMUX design +

This is one reason for analysing the optimization problem further. +

+On the structure of optimal trajectories +

The results on the local regularity of trajectories in optimal control +obtained previously have been published. +

+Feedback for low thrust orbital transfer +

The study concerns the control of a satellite. +

+Local linearization (or flatness) of control systems +

a workable formulation of the question is now available. +

+Controllability for a general Dubins +problem +

Controllability results for systems with drift are usually obtained.

+

The main object of our research is given by Dubins-like systems +In we proved that 01. This has been presented in + and . +

+ +Contracts CNES-IRCOM-INRIA +

Contracts no 04/CNES/1728/00-DCT094 +see module , +

+Contract Alcatel Space (Cannes) +

Contract no 1 01 E 0726. +

+ +Scientific Committees +

L. Baratchart is a member of the editorial board +

+National Actions +

Together with project-teams Caiman and Odyssée +

+Actions Funded by the EC +

The team is the recipient see +http://www.ladseb.pd.cnr.it/control/ercim/control.html. +

+Extra-european International Actions +

NATO CLG (Collaborative Linkage Grant), PST.CLG.979703, +“Constructive approximation and inverse diffusion problemsâ€, with +Vanderbilt Univ. (Nashville, USA) and LAMSIN-ENIT (Tunis, Tu.), 2003-2005.

+

EPSRC grant (EP/C004418) “Constrained approximation in +function spaces, with applicationsâ€, with Leeds Univ. (UK) and +Univ. Lyon I, 2005-2006.

+

STIC-INRIA and AireDéveloppement grants with +LAMSIN-ENIT (Tunis, Tu.), “Problèmes +inverses du Laplacien et approximation constructive des fonctionsâ€,

+

NSF EMS21 RTG students exchange program (with +Vanderbilt University). +

+The Apics Seminar +

The following scientists gave a talk at the seminar:

+
+ +Teaching + + + +

L. Baratchart, DEA Géométrie et Analyse, LATP-CMI, Univ. de Provence

+
+

M. Olivi, Mathématiques pour l'ingénieur

+
+
+ + +

Jonathan Chetboun (ENPC)

+
+

Cristina Paduret +Résolution de problèmes inverses

+
+
+ + +

Alex Bombrun, « Commande optimale de satellites » (optimal etc)

+
+

Imen Fellah, “Data completion in inverse problemsâ€, co-tutelle.

+
+

Vincent Lunot, « Problèmes à  la synthèse d'OMUX »,

+
+

Moncef Mahjoub, “Complétion de données géométriques.†co-tutelle.

+
+

Erwin Mina Diaz, “Asymptotic properties of urves.â€

+
+

Maxim Yattselev, “Meromorphic orthogonality.â€

+
+
+ + +

David Avanessoff, « Linéarisation dynamique des solutions » (dynamic +trajectories). June 8, 2005.

+
+
+ + +

L. Baratchart sat on

+
+

J. Leblond has been sitting

+
+

F. Seyfert has been sitting

+
+

J.-B. Pomet has been sitting

+
+
+Community service +

L. Baratchart was a member of the “bureau†of the CP +(Comité des Projets) of INRIA-Sophia Antipolis untill July. +He is a member of the “commission de spécialistes†(section 25) of the +Université de Provence.

+

J. Leblond and J. Grimm are co-editors of the +proceedings (to appear in 2006) of the +CNRS-INRIA summer school “Harmonic analysis and rational approximation: their +rôles in signals, control and dynamical systems theory†+(Porquerolles, 2003) +http://www-sop.inria.fr/apics/anap03/index.en.html . +

+Conferences and workshops +

A. Bombrun, B. Atfeh and L. Baratchart have presented a communication at +CMFT2005 (Computational Methods and Function +Theory), Joensuu, Finland (June). + +

+ + +Linéarisation dynamique des systèmes non linéaires et paramétrage de l'ensemble des solutions +Ph. D. Thesis +Univ. de Nice - Sophia Antipolis +June +2006 + + + +Stability of Nonlinear switched systems in the plane +44th IEEE Conf. +3285–3290 +Seville, Spain +December +2005 + + + +Linéarisation dynamique des systèmes non linéaires et paramétrage de l'ensemble des solutions +Ph. D. Thesis +Univ. de Nice - Sophia Antipolis +June +2006 + + + +Stability of Non +3285–3290 +Seville, Spain +December +2006 + + + +Stability of Nonlinear switched systems in the plane +44th IEEE Conf. +3285–3290 +Seville, Spain +December +2005 + + + +Harmonic Analysis and Rational Approximation; Their Rôles in Signals, Control and Dynamical Systems +Lecture Notes in Control and Information Sciences +327 +Springer Verlag +2006 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2007.xml b/thirdparty/tralics-2.15.2/Modele/exemple2007.xml new file mode 100644 index 0000000..c05921f --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2007.xml @@ -0,0 +1,233 @@ + + + + + +com +ExemplE +Algebraic Systems for Research and Industry + + +

Texmex is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2002 and became an +INRIA project on November the 1st, 2002.

+
+ + +Head of project-team +Research Associate (CR) Inria + +Administrative assistant +Secretary (SAR) Inria + +Research scientist Inria +Research Director (DR) Inria + +Reserch scientists (external) +Ing. en chef Armement (CR) +Université Paris XIII + +Visiting scientist +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 + + + +Overall Objectives +

The explosion of the quantity of numerical documents raises a problem.

+ +

Firt item

+
+

Second item

+
+
+Highlights +

This year, a new module appears..... +

+ +Document Description and Metadata + +Low-level Descriptor +Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure.

+
+First subsection +

Due to the increasing broadcasting of digital video content +finding copies in a large video database has become a critical new issue.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2005 activity report) has been published .

+
+titi +

The article describing the general framework. +an IEEE journal .

+
+tutu +

The cosmad toolbox, +see module .

+
+second subsection +

Text of second subsection

+tata +

Text... +

+Identification +

... +

+ +Panorama + +telecommunications +multimedia +biology +health +process engineering +transportation systems +environment + +Telecommunication Systems +

Modules should not be empty. +

+Software Embedded Systems +

Modules should not be empty. +

+ +Hyperion Software +correspondant +projet Miaou +projet Miaou + + +Conformance Testing +TGV +Lotos +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www-rocq.inria.fr/scilab/.

+

You can simplify this to +http://www-rocq.inria.fr/scilab/. +

+ +Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+ +EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image pour le web

+ 0 y=x 4 +

...

+
+ +National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla<w references , , +

+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla +

+ +Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+ + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of foo +nh + +147–162 +December +1989 + + + +Some title +Proceedings of the First International Conference +lncs +1384 +sv + +68–84 +Berlin +March +1998 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Algorithm Animation with AGAT +Computer-Human Interaction in Symbolic Computation +Texts and Monographs in Symbolic Computation +Springer-Verlag +2007 +8 +163-177 + + +Mathematical Markup Language (MathML) 1.0 Specification +April +2007 +http://www.w3.org/TR/REC-MathML/W3C Recommendation + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Algebra Computacional y Aplicaciones + +159-163 +September +2004 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2008.xml b/thirdparty/tralics-2.15.2/Modele/exemple2008.xml new file mode 100644 index 0000000..478dde7 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2008.xml @@ -0,0 +1,225 @@ + + + + + +com +ExemplE +Algebraic Systems for Research and Industry + + +

Texmex is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2002 and became an +INRIA project on November the 1st, 2002.

+
+
+Research Associate (CR) Inria +Secretary (SAR) Inria +Research Director (DR) Inria +Ing. en chef Armement (CR) +Université Paris XIII +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +
+
+Overall Objectives +

The explosion of the quantity of numerical documents raises a problem.

+ +

Firt item

+
+

Second item

+
+
+Highlights +

This year, a new module appears..... +

+
+Document Description and Metadata + +Low-level Descriptor +Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure.

+
+First subsection +

Due to the increasing broadcasting of digital video content +finding copies in a large video database has become a critical new issue.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2005 activity report) has been published .

+
+titi +

The article describing the general framework. +an IEEE journal .

+
+tutu +

The cosmad toolbox, +see module .

+
+second subsection +

Text of second subsection

+tata +

Text... +

+Identification +

... +

+
+Panorama + +telecommunications +multimedia +biology +health +process engineering +transportation systems +environment + +Telecommunication Systems +

Modules should not be empty. +

+Software Embedded Systems +

Modules should not be empty. +

+
+Hyperion Software +correspondant +projet Miaou +projet Miaou + + +Conformance Testing +TGV +Lotos +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www-rocq.inria.fr/scilab/.

+

You can simplify this to +http://www-rocq.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image pour le web

+ 0 y=x 4 +

...

+
+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla<w references , , +

+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla +

+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+(Sans Titre) +

This year, a new module appears..... +

+ + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of foo +nh + +147–162 +December +1989 + + + +Some title +Proceedings of the First International Conference +lncs +1384 +sv + +68–84 +Berlin +March +1998 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Algorithm Animation with AGAT +Computer-Human Interaction in Symbolic Computation +Texts and Monographs in Symbolic Computation +Springer-Verlag +2008 +8 +163-177 + + +Mathematical Markup Language (MathML) 1.0 Specification +April +2008 +http://www.w3.org/TR/REC-MathML/W3C Recommendation + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Algebra Computacional y Aplicaciones + +159-163 +September +2004 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2009.xml b/thirdparty/tralics-2.15.2/Modele/exemple2009.xml new file mode 100644 index 0000000..298c25e --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2009.xml @@ -0,0 +1,236 @@ + + + + + +Dummy +ExemplE +Algebraic Systems for Research and Industry + + +

Texmex is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2002 and became an +INRIA project on November the 1st, 2002.

+
+
+Research Associate (CR) Inria +Secretary (SAR) Inria +Research Director (DR) Inria +Ing. en chef Armement (CR) +Université Paris XIII +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +
+
+Overall Objectives +

The explosion of the quantity of numerical documents raises a problem.

+ +

Firt item

+
+

Second item

+
+
+Highlights +

This year, a new module appears..... +

+
+Document Description and Metadata + +Low-level Descriptor +Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure.

+
+First subsection +

Due to the increasing broadcasting of digital video content +finding copies in a large video database has become a critical new issue.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2005 activity report) has been published .

+
+titi +

The article describing the general framework. +an IEEE journal .

+
+tutu +

The cosmad toolbox, +see module .

+
+second subsection +

Text of second subsection

+tata +

Text... +

+Identification +

... +

+
+Panorama + +telecommunications +multimedia +biology +health +process engineering +transportation systems +environment + +Telecommunication Systems +

Modules should not be empty. +

+Software Embedded Systems +

Modules should not be empty. +

+
+Hyperion Software +correspondant +projet Miaou +projet Miaou + + +Conformance Testing +TGV +Lotos +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www-rocq.inria.fr/scilab/.

+

You can simplify this to +http://www-rocq.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image pour le web

+ 0 y=x 4 +

...

+
+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla<w references , , +

+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla +

+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+(Sans Titre) +

This year, a new module appears..... +Mon brevet: +

+ + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 +yes +yes +yes +GB + + + +Compilation of LOTOS Abstract Data Types +Proceedings of foo +nh + +147–162 +December +1989 + + + +Some title +Proceedings of the First International Conference +lncs +1384 +sv + +68–84 +Berlin +March +1998 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Algorithm Animation with AGAT +Computer-Human Interaction in Symbolic Computation +Texts and Monographs in Symbolic Computation +Springer-Verlag +2009 +8 +163-177 + + +Mathematical Markup Language (MathML) 1.0 Specification +April +2009 +http://www.w3.org/TR/REC-MathML/W3C Recommendation + + + +patent: Algorithmics and Athletics +2009 +CH,HK + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Algebra Computacional y Aplicaciones + +159-163 +September +2004 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2011.xml b/thirdparty/tralics-2.15.2/Modele/exemple2011.xml new file mode 100644 index 0000000..d504144 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2011.xml @@ -0,0 +1,513 @@ + + + + + +Dummy +ExemplE +Algebraic Systems for Research and Industry + + +

This project is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2010 and became an +INRIA project on November the 1st, 2010.

+
+
+Team leader, Senior Researcher Inria +shared with another team +Senior Researcher Inria +Ing. en chef Armement +Professor, Université Paris 13 +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +IGHCA, Unicode team +
+
+Overall Objectives +

The explosion of the quantity of numerical documents raises the problem +of the management of these documents. Beyond the storage, +we are interested in the problems linked to the management of the contents: +how to exploit the large databases of documents, how to classify documents, how to +index them in order to search efficiently their contents, how to visualize +their contents? +The two major challenges of the field aims at tackling are the following ones:

+ +

it is necessary, first of all, to be able to +process large sets of documents: it is important to develop techniques +that scale up gracefully with respect to the quantity of documents +taken into account (millions of images, months of videos), and to evaluate +their results in quality as well as in speed;

+
+

multimedia documents are not a simple juxtaposition of +independent media, and it is important to better exploit the +existing links between the various media composing a unique +document;

+
+
+Highlights +

Les Highlights (Faits Marquants) doivent être relatifs aux résultats de votre équipe. La bonne mesure pour un fait marquant est l'impact estimé. Seuls les résultats scientifiques importants ou des prix liés à des résultats justifient la présence de la rubrique Highlights. +

+
+Document Description and Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure working on user selected time series.

+
+First subsection +

Due to the increasing broadcasting of digital video content (TV +Channels, Web-TV, Video Blogs, etc), finding copies in a large video +database has become a critical new issue and Content Based Copy +Detection (CBCD) presents an alternative to the watermarking +approach to identify video sequences.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2009 activity report) has been published .

+
+titi +

The article describing the general framework encompassing +most well known subspace approaches (either output-only or input/output, +should they be covariance, data or frequency driven), +and proving general consistency theorems for subspace methods under non stationary excitation, +has been accepted for publication in +an IEEE journal .

+
+tutu +

Different case studies have been performed to test the capacity and robustness +of the on-line monitoring method implemented in the cosmad toolbox, +see module . +The results of the analysis +of long datasets from different scenarios in the Bradford Stadium (international benchmark)

+
+second subsection +

Text of second subsection

+tata +

Text...

+
+tyty +

Text... +

+Identification +

...

+

A patend:

+

...

+Pθ 1 θ r =Q+R, +
+
+Panorama + + + + +

Because ... and ... æ Æ à À â Â ä Ä ç Ç é É è È ê Ê ë Ë î Î ï à ô Ô ö Ö ù Ù û Û ü Ü ÿ

+
+Telecommunication Systems +

Modules should not be empty so there is some symbols: n and also π. +

+Software Embedded Systems +

Modules should not be empty.

+
An example of a jpeg image +
+
+
+Hyperion Software +correspondant +Nancy +projet Miaou +projet Miaou + +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www.loria.fr/infos/.

+

You can simplify this to +http://www.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image math pour le web

+ 0 y=x 4 +

...

+
+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla...

+

Some references , ,

+
+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla

+
An example of an eps file +
+
+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a pdf map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+O +

n propose un nouvel environnement de la forme suivante

+

\begin{action}[args]{type}{shortname}

+

   \title{longname}

+

   \duration{date1}{date2}

+

   \url{someurl}

+

   \abstract{text}

+

   \funded{name}{args}

+

   \participant{firstname}{name}{args}

+

   \participant{firstname}{name}{args}

+

   \begin{organism}{name}{args}

+

       \collaborator{firstname}{name}{args}

+

       \collaborator{firstname}{name}{args}

+

   \end{organism}

+

   \begin{organism}{name}{args}\end{organism}

+

\end{action}

+

L'exemple contient deux participants, mais on peut en mettre plus ou moins (ou +aucun). L'exemple contient deux organismes, mais on peut en mettre plus ou moins (ou +aucun). Chaque organisme peut avoir, zéro, un ou plusieurs collaborateurs. Le +premier argument de action est facultatif.

+

Les arguments args sont des listes d'association, voir plus bas

+

Le type d'une action peut être contract, mobility , un +programme européen comme “FP7-Cooperation†ou international comme “ STIC +Amsudâ€, etc. Si une action a deux noms, longs et courts, on met le nom court +comme argument shortname de l'environnement action, et le nom long +dans l'argument de la commande \title. S'il y a un seul nom, on ne +remplit pas \title.

+

La durée est spécfiée par \duration. Les mois sont donnés en lettres et +non en chiffres. Exemple de durée valide

+

   \duration{2003}{2008}

+

   \duration{April 2007}{June 2007}

+

   \duration{07 Sep. 2009}{12 Sep. 2009}

+

La commande \url permet de spécifier une URL, la commande +\abstract permet de décrire avec plus ou moins de détails l'action. +La commande \participant donne le prénom, nom et autres information +d'un participant Inria à l'action. L'environnement organism permet de +décrire un organisme participant, et , via \collaborateurs iune list +de collaborateurs dans l'organisme.

+ +

La clé siid est toujours acceptée, la valeur est +générée automatiquement, il vaut mieux ne pas la modifier.

+
+

Chaque participant ou collaborateur peut avoir un ou plusieurs rôles, +donné par role, il peut être “contactâ€, “coordinatorâ€, “visitorâ€, +etc. On peut dire role=coordinator pour une action (si c'est l'équipe +Inria qui joue le rôle de coordinateur), ou pour un organisme (si c'est cet +organisme qui est le coordinateur).

+
+

La clé nature caractérise une action de type mobility. La valeur peut +être visit, internship, sabbatic, explorator.

+
+

La clé title permet de spécifier un titre (Professor, Doctor, +Dean, etc) pour un collaborateur.

+
+

Les clé country et city permettent de spécifier la +localisation d'un organisme.

+
+

La clé department permet de spécifier un département (une partie) +d'un organisme.

+
+

La clé name permet de spécifier le nom alternatif d'un organisme. +(par exemple UCSC pour University of Califoria Santa Cruz).

+
+ +The goal of the action is to implement and validate algorithms etc +ww.inria.fr + + + + + + + + + + + + + +International Initiatives + +During the first three years of the COMMUNITY... +https://www.inria.fr + + + + + +Participation In International Programs + +Having quantified elements on urban dynamics is necessary +if one wants to implement policies ... + + + + + + + +Participation in International Program + +This action aims to design realistic models of the physical layer in order.. +https://www.inria.f + + + +Visits of International Scientists + +Guillaume Gravier was invited to the ... + + + +Visits of International Scientists + +JB spent five months in the Texmex action-team to work on audio indexing... + + + + + + + +Contracts whith Industry + + +https://www.inria.f + + + +Contracts whith Industry + + + + + + + + + +Marelle test + +The objective of this project is to develop libraries of formalised +mathematics concerning algebra, linear algebra, real number computation, and +algebraic topology. The libraries that we plan to develop in this proposal are +especially chosen to have long-term applications in areas where software +interacts with the physical world. The main originality of the work is to +structure these libraries as a software development, relying on a basis that +has already shown its power in the formal proof of the four-colour theorem, +and to address topics that were mostly left untouched by previous research in +formal proof or formal methods. +http://wiki.portal.chalmers.se/cse/pmwiki.php/ForMath/ForMath + + + +
+ + +OPEN/CÆSAR: An Open Software Architecture for Verification, Simulation, and Testing +Proceedings of the First International Conference on Tools and Algorithms for the Construction and Analysis of Systems TACAS'07 (Lisbon, Portugal) +Lecture Notes in Computer Science +1384 +Springer Verlag + +68–84 +Berlin +March +2007 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of the 2nd International Conference on Formal Description Techniques FORTE'89 (Vancouver B.C., Canada) +North-Holland + +147–162 +December +1989 + + + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP WG 6.1 International Conference on Formal Techniques for Networked and Distributed Systems FORTE'2001 (Cheju Island, Korea) +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 +http://www.inria.fr/rrrt/rr-4223.htmlFull version available as INRIA Research Report RR-4223 + + + +Numerical Journals : theoretical aspects +Universitext Series +Springer-Verlag +2007 +http://www.inrialpes.fr/no +no +yes + + +Proceedings of the 19th IEEE Symposium on Computer Arithmetic + +IEEE Conference Publishing Services +2010 +yes +yes + + + +Développement d'objets avec XML +2010 +http://www.inria.fr/ + + +TEI +Ph. D. Thesis +Humboldt-Universitat zu Berlin +2010 +http://www.hu-berlin.de/ + + +Color, Broadcasting and Prototyping +Springer-Verlag +April +2010 +248-350 +http://hal.inria.fr/no +yes +UK,GB +To appear + + + +The Future of Electronic Journals +Serials Review +4 +2011 +80 +http://www.cnrs.fr/yes +yes +US,PT +http://hal.archives-ouvertes.fr/hal-00362159/fr/ + + + +Bioprocess Control +Lavosier +May +2008 +5 +43-50 +no +yes + + + +Electronic Journals Increase +Online 2007, London +December +2010 +yes +no +IT,VN + + + +Optimizing the ontology of complex neural networks +European Conference on Complex Systems +JISC Publishing +2009 +yes +yes +yes +GB + + + +XML and XSLT +Feb +2010 +yes + + + +Tralics, a LaTeX to XML translator +Technical report +INRIA +2010 + + + +Algorithmes unicode pour les lettres Ààéçœ et Ñ +2010 +CH,HK + + + +Evolutionary Algorithms on Large Networks +2010 +US + + + +Algorithmics and Athletics +2010 +CH,HK + + + +Un web sémantique en entreprise +Masters thesis +Université Paris VI +2011 + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Ãlgebra Computacional y Aplicaciones + +159-163 +September +2007 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exemple2013.xml b/thirdparty/tralics-2.15.2/Modele/exemple2013.xml new file mode 100644 index 0000000..85829fc --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exemple2013.xml @@ -0,0 +1,513 @@ + + + + + +Dummy +ExemplE +Algebraic Systems for Research and Industry + + +

This project is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2010 and became an +INRIA project on November the 1st, 2010.

+
+
+Team leader, Senior Researcher Inria +shared with another team +Senior Researcher Inria +Ing. en chef Armement +Professor, Université Paris 13 +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +IGHCA, Unicode team +
+
+Overall Objectives +

The explosion of the quantity of numerical documents raises the problem +of the management of these documents. Beyond the storage, +we are interested in the problems linked to the management of the contents: +how to exploit the large databases of documents, how to classify documents, how to +index them in order to search efficiently their contents, how to visualize +their contents? +The two major challenges of the field aims at tackling are the following ones:

+ +

it is necessary, first of all, to be able to +process large sets of documents: it is important to develop techniques +that scale up gracefully with respect to the quantity of documents +taken into account (millions of images, months of videos), and to evaluate +their results in quality as well as in speed;

+
+

multimedia documents are not a simple juxtaposition of +independent media, and it is important to better exploit the +existing links between the various media composing a unique +document;

+
+
+Highlights +

Les Highlights (Faits Marquants) doivent être relatifs aux résultats de votre équipe. La bonne mesure pour un fait marquant est l'impact estimé. Seuls les résultats scientifiques importants ou des prix liés à des résultats justifient la présence de la rubrique Highlights. +

+
+Document Description and Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure working on user selected time series.

+
+First subsection +

Due to the increasing broadcasting of digital video content (TV +Channels, Web-TV, Video Blogs, etc), finding copies in a large video +database has become a critical new issue and Content Based Copy +Detection (CBCD) presents an alternative to the watermarking +approach to identify video sequences.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2009 activity report) has been published .

+
+titi +

The article describing the general framework encompassing +most well known subspace approaches (either output-only or input/output, +should they be covariance, data or frequency driven), +and proving general consistency theorems for subspace methods under non stationary excitation, +has been accepted for publication in +an IEEE journal .

+
+tutu +

Different case studies have been performed to test the capacity and robustness +of the on-line monitoring method implemented in the cosmad toolbox, +see module . +The results of the analysis +of long datasets from different scenarios in the Bradford Stadium (international benchmark)

+
+second subsection +

Text of second subsection

+tata +

Text...

+
+tyty +

Text... +

+Identification +

...

+

A patend:

+

...

+Pθ 1 θ r =Q+R, +
+
+Panorama + + + + +

Because ... and ... æ Æ à À â Â ä Ä ç Ç é É è È ê Ê ë Ë î Î ï à ô Ô ö Ö ù Ù û Û ü Ü ÿ

+
+Telecommunication Systems +

Modules should not be empty so there is some symbols: n and also π. +

+Software Embedded Systems +

Modules should not be empty.

+
An example of a jpeg image +
+
+
+Hyperion Software +correspondant +Nancy +projet Miaou +projet Miaou + +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www.loria.fr/infos/.

+

You can simplify this to +http://www.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image math pour le web

+ 0 y=x 4 +

...

+
+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla...

+

Some references , ,

+
+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla

+
An example of an eps file +
+
+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a pdf map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+O +

n propose un nouvel environnement de la forme suivante

+

\begin{action}[args]{type}{shortname}

+

   \title{longname}

+

   \duration{date1}{date2}

+

   \url{someurl}

+

   \abstract{text}

+

   \funded{name}{args}

+

   \participant{firstname}{name}{args}

+

   \participant{firstname}{name}{args}

+

   \begin{organism}{name}{args}

+

       \collaborator{firstname}{name}{args}

+

       \collaborator{firstname}{name}{args}

+

   \end{organism}

+

   \begin{organism}{name}{args}\end{organism}

+

\end{action}

+

L'exemple contient deux participants, mais on peut en mettre plus ou moins (ou +aucun). L'exemple contient deux organismes, mais on peut en mettre plus ou moins (ou +aucun). Chaque organisme peut avoir, zéro, un ou plusieurs collaborateurs. Le +premier argument de action est facultatif.

+

Les arguments args sont des listes d'association, voir plus bas

+

Le type d'une action peut être contract, mobility , un +programme européen comme “FP7-Cooperation†ou international comme “ STIC +Amsudâ€, etc. Si une action a deux noms, longs et courts, on met le nom court +comme argument shortname de l'environnement action, et le nom long +dans l'argument de la commande \title. S'il y a un seul nom, on ne +remplit pas \title.

+

La durée est spécfiée par \duration. Les mois sont donnés en lettres et +non en chiffres. Exemple de durée valide

+

   \duration{2003}{2008}

+

   \duration{April 2007}{June 2007}

+

   \duration{07 Sep. 2009}{12 Sep. 2009}

+

La commande \url permet de spécifier une URL, la commande +\abstract permet de décrire avec plus ou moins de détails l'action. +La commande \participant donne le prénom, nom et autres information +d'un participant Inria à l'action. L'environnement organism permet de +décrire un organisme participant, et , via \collaborateurs iune list +de collaborateurs dans l'organisme.

+ +

La clé siid est toujours acceptée, la valeur est +générée automatiquement, il vaut mieux ne pas la modifier.

+
+

Chaque participant ou collaborateur peut avoir un ou plusieurs rôles, +donné par role, il peut être “contactâ€, “coordinatorâ€, “visitorâ€, +etc. On peut dire role=coordinator pour une action (si c'est l'équipe +Inria qui joue le rôle de coordinateur), ou pour un organisme (si c'est cet +organisme qui est le coordinateur).

+
+

La clé nature caractérise une action de type mobility. La valeur peut +être visit, internship, sabbatic, explorator.

+
+

La clé title permet de spécifier un titre (Professor, Doctor, +Dean, etc) pour un collaborateur.

+
+

Les clé country et city permettent de spécifier la +localisation d'un organisme.

+
+

La clé department permet de spécifier un département (une partie) +d'un organisme.

+
+

La clé name permet de spécifier le nom alternatif d'un organisme. +(par exemple UCSC pour University of Califoria Santa Cruz).

+
+ +The goal of the action is to implement and validate algorithms etc +ww.inria.fr + + + + + + + + + + + + + +International Initiatives + +During the first three years of the COMMUNITY... +https://www.inria.fr + + + + + +Participation In International Programs + +Having quantified elements on urban dynamics is necessary +if one wants to implement policies ... + + + + + + + +Participation in International Program + +This action aims to design realistic models of the physical layer in order.. +https://www.inria.f + + + +Visits of International Scientists + +Guillaume Gravier was invited to the ... + + + +Visits of International Scientists + +JB spent five months in the Texmex action-team to work on audio indexing... + + + + + + + +Contracts whith Industry + + +https://www.inria.f + + + +Contracts whith Industry + + + + + + + + + +Marelle test + +The objective of this project is to develop libraries of formalised +mathematics concerning algebra, linear algebra, real number computation, and +algebraic topology. The libraries that we plan to develop in this proposal are +especially chosen to have long-term applications in areas where software +interacts with the physical world. The main originality of the work is to +structure these libraries as a software development, relying on a basis that +has already shown its power in the formal proof of the four-colour theorem, +and to address topics that were mostly left untouched by previous research in +formal proof or formal methods. +http://wiki.portal.chalmers.se/cse/pmwiki.php/ForMath/ForMath + + + +
+ + +OPEN/CÆSAR: An Open Software Architecture for Verification, Simulation, and Testing +Proceedings of the First International Conference on Tools and Algorithms for the Construction and Analysis of Systems TACAS'07 (Lisbon, Portugal) +Lecture Notes in Computer Science +1384 +Springer Verlag + +68–84 +Berlin +March +2007 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of the 2nd International Conference on Formal Description Techniques FORTE'89 (Vancouver B.C., Canada) +North-Holland + +147–162 +December +1989 + + + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP WG 6.1 International Conference on Formal Techniques for Networked and Distributed Systems FORTE'2001 (Cheju Island, Korea) +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 +http://www.inria.fr/rrrt/rr-4223.htmlFull version available as INRIA Research Report RR-4223 + + + +Numerical Journals : theoretical aspects +Universitext Series +Springer-Verlag +2013 +http://www.inrialpes.fr/no +no +yes + + +Proceedings of the 19th IEEE Symposium on Computer Arithmetic + +IEEE Conference Publishing Services +2013 +yes +yes + + + +Développement d'objets avec XML +2013 +http://www.inria.fr/ + + +TEI +Ph. D. Thesis +Humboldt-Universitat zu Berlin +2013 +http://www.hu-berlin.de/ + + +Color, Broadcasting and Prototyping +Springer-Verlag +April +2013 +248-350 +http://hal.inria.fr/no +yes +UK,GB +To appear + + + +The Future of Electronic Journals +Serials Review +4 +2013 +80 +http://www.cnrs.fr/yes +yes +US,PT +http://hal.archives-ouvertes.fr/hal-00362159/fr/ + + + +Bioprocess Control +Lavosier +May +2013 +5 +43-50 +no +yes + + + +Electronic Journals Increase +Online 2007, London +December +2013 +yes +no +IT,VN + + + +Optimizing the ontology of complex neural networks +European Conference on Complex Systems +JISC Publishing +2013 +yes +yes +yes +GB + + + +XML and XSLT +Feb +2013 +yes + + + +Tralics, a LaTeX to XML translator +Technical report +INRIA +2013 + + + +Algorithmes unicode pour les lettres Ààéçœ et Ñ +2013 +CH,HK + + + +Evolutionary Algorithms on Large Networks +2013 +US + + + +Algorithmics and Athletics +2013 +CH,HK + + + +Un web sémantique en entreprise +Masters thesis +Université Paris VI +2013 + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Ãlgebra Computacional y Aplicaciones + +159-163 +September +2007 +
diff --git a/thirdparty/tralics-2.15.2/Modele/exempleb2011.xml b/thirdparty/tralics-2.15.2/Modele/exempleb2011.xml new file mode 100644 index 0000000..032b3b3 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/exempleb2011.xml @@ -0,0 +1,364 @@ + + + + + +Dummy +ExemplE +Algebraic Systems for Research and Industry + + +

This project is a common project with CNRS, University of Rennes 1 and INSA. The +team has been created on January the 1st, 2010 and became an +INRIA project on November the 1st, 2010.

+
+
+Team leader, Senior Researcher Inria +shared with another team +Senior Researcher Inria +Ing. en chef Armement +Professor, Université Paris 13 +AUF Grant/ Gaston Berger University, Saint-Louis, Senegal, from March 1st till August 31 +IGHCA, Unicode team + + +

ok +

+
+Overall Objectives +

The explosion of the quantity of numerical documents raises the problem +of the management of these documents. Beyond the storage, +we are interested in the problems linked to the management of the contents: +how to exploit the large databases of documents, how to classify documents, how to +index them in order to search efficiently their contents, how to visualize +their contents? +The two major challenges of the field aims at tackling are the following ones:

+ +

it is necessary, first of all, to be able to +process large sets of documents: it is important to develop techniques +that scale up gracefully with respect to the quantity of documents +taken into account (millions of images, months of videos), and to evaluate +their results in quality as well as in speed;

+
+

multimedia documents are not a simple juxtaposition of +independent media, and it is important to better exploit the +existing links between the various media composing a unique +document;

+
+
+Highlights +

Les Highlights (Faits Marquants) doivent être relatifs aux résultats de votre équipe. La bonne mesure pour un fait marquant est l'impact estimé. Seuls les résultats scientifiques importants ou des prix liés à des résultats justifient la présence de la rubrique Highlights. +

+
+Document Description and Metadata + +1621-1695 + + +Glossary

the process of extracting from a +document (here a picture) compact and structured significant visual +features that will be used and compared during the interactive +search.

+

Common activity with LoveGeom project.

+
+xx +

Usually subspace identification is a one step procedure working on user selected time series.

+
+First subsection +

Due to the increasing broadcasting of digital video content (TV +Channels, Web-TV, Video Blogs, etc), finding copies in a large video +database has become a critical new issue and Content Based Copy +Detection (CBCD) presents an alternative to the watermarking +approach to identify video sequences.

+toto +

The article describing and comparing output-only and input/output covariance-driven subspace +identification methods (see 2009 activity report) has been published .

+
+titi +

The article describing the general framework encompassing +most well known subspace approaches (either output-only or input/output, +should they be covariance, data or frequency driven), +and proving general consistency theorems for subspace methods under non stationary excitation, +has been accepted for publication in +an IEEE journal .

+
+tutu +

Different case studies have been performed to test the capacity and robustness +of the on-line monitoring method implemented in the cosmad toolbox, +see module . +The results of the analysis +of long datasets from different scenarios in the Bradford Stadium (international benchmark)

+
+second subsection +

Text of second subsection

+tata +

Text...

+
+tyty +

Text... +

Threre should be no text between modules. This line provokes an error. +

+Identification +

...

+

A patend:

+

...

+Pθ 1 θ r =Q+R, +
+
+Panorama + + + + +

Because ... and ... æ Æ à À â Â ä Ä ç Ç é É è È ê Ê ë Ë î Î ï à ô Ô ö Ö ù Ù û Û ü Ü ÿ

+
+Telecommunication Systems +

Modules should not be empty so there is some symbols: n and also π. +

+Software Embedded Systems +

Modules should not be empty.

+
An example of a jpeg image +
+
+Hyperion Software +correspondant +Nancy +projet Miaou +projet Miaou + +

See also the web page +http://www-rocq.inria.fr/scilab/.

+

Alternate versions (note order of arguments) +http://www.loria.fr/infos/.

+

You can simplify this to +http://www.inria.fr/scilab/. +

+
+Tralics: a LaTeX to XML Translator +

(...) On a le développement suivant:

+fC -T 2;T 2,t-T 2;T 2,f(τ)= k=- + e 2iπk Tt ×1 T -T 2 T 2 f(t)e -2iπk Tt dt a k =f ˜ν=k T +

et puisque (...)

+
+
+EDF + + + + +

ici des math en html +... y=x 2 ...

+

et ici on génére une image math pour le web

+ 0 y=x 4 +

...

+
+Document Description and Metadata +

ok +

+
+National Actions +Incitative Action FIABLE + + + +

blabla

+
+Incitative Action MOUAI + + + +

blabla...

+

Some references , ,

+
+Actions Funded by the EC +Projet LTR TURLU EP-9134867 +

A citation using the \footcite command

+
+Réseau TMR RATA +

blabla

+
An example of an eps file +
+
+
+Animation de la Communauté scientifique +

A citation using the \refercite +(major publications of the Team). +

+Teaching +

... +Note. Optional arguments like [htbp] to the figure environment will be ignored.

+
An example of a pdf map reconstructed by using geometrical methods in detecting landmarks +
+

... +citation using \cite for publications of current year.

+

... +

+ + +OPEN/CÆSAR: An Open Software Architecture for Verification, Simulation, and Testing +Proceedings of the First International Conference on Tools and Algorithms for the Construction and Analysis of Systems TACAS'07 (Lisbon, Portugal) +Lecture Notes in Computer Science +1384 +Springer Verlag + +68–84 +Berlin +March +2007 +http://www.inria.fr/rrrt/rr-3352.htmlFull version available as INRIA Research Report RR-3352 + + + +Compilation of LOTOS Abstract Data Types +Proceedings of the 2nd International Conference on Formal Description Techniques FORTE'89 (Vancouver B.C., Canada) +North-Holland + +147–162 +December +1989 + + + +SVL: a Scripting Language for Compositional Verification +Proceedings of the 21st IFIP WG 6.1 International Conference on Formal Techniques for Networked and Distributed Systems FORTE'2001 (Cheju Island, Korea) +IFIP +Kluwer Academic Publishers + +377–392 +August +2001 +http://www.inria.fr/rrrt/rr-4223.htmlFull version available as INRIA Research Report RR-4223 + + + +Numerical Journals : theoretical aspects +Universitext Series +Springer-Verlag +2007 +http://www.inrialpes.fr/no +no +yes + + +Proceedings of the 19th IEEE Symposium on Computer Arithmetic + +IEEE Conference Publishing Services +2010 +yes +yes + + + +Développement d'objets avec XML +2010 +http://www.inria.fr/ + + +TEI +Ph. D. Thesis +Humboldt-Universitat zu Berlin +2010 +http://www.hu-berlin.de/ + + +Color, Broadcasting and Prototyping +Springer-Verlag +April +2010 +248-350 +http://hal.inria.fr/no +yes +UK,GB +To appear + + + +The Future of Electronic Journals +Serials Review +4 +2011 +80 +http://www.cnrs.fr/yes +yes +US,PT +http://hal.archives-ouvertes.fr/hal-00362159/fr/ + + + +Bioprocess Control +Lavosier +May +2008 +5 +43-50 +no +yes + + + +Electronic Journals Increase +Online 2007, London +December +2010 +yes +no +IT,VN + + + +Optimizing the ontology of complex neural networks +European Conference on Complex Systems +JISC Publishing +2009 +yes +yes +yes +GB + + + +XML and XSLT +Feb +2010 +yes + + + +Tralics, a LaTeX to XML translator +Technical report +INRIA +2010 + + + +Algorithmes unicode pour les lettres Ààéçœ et Ñ +2010 +CH,HK + + + +Evolutionary Algorithms on Large Networks +2010 +US + + + +Algorithmics and Athletics +2010 +CH,HK + + + +Un web sémantique en entreprise +Masters thesis +Université Paris VI +2011 + + + +Efficient Algorithms for Linear Ordinary Differential Equations +Cuarto Encuentro de Ãlgebra Computacional y Aplicaciones + +159-163 +September +2007 +
diff --git a/thirdparty/tralics-2.15.2/Modele/fptest.xml b/thirdparty/tralics-2.15.2/Modele/fptest.xml new file mode 100644 index 0000000..bff31b5 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/fptest.xml @@ -0,0 +1,958 @@ + + + + +

DOCSTART

+testing fp +Testing fp +

-8.9=-8.9

+
+Characters +Ѐ +Ё +Ђ +Ѓ +Є +Ѕ +І +Ї +Ј +Љ +Њ +Ћ +Ќ +Ѝ +Ў +Џ +А +Б +В +Г +Д +Е +Ж +З +И +Й +К +Л +М +Н +О +П +Р +С +Т +У +Ф +Х +Ц +Ч +Ш +Щ +Ъ +Ы +Ь +Э +Ю +Я +а +б +в +г +д +е +ж +з +и +й +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +щ +ъ +ы +ь +э +ю +я +ѐ +ё +ђ +ѓ +є +ѕ +і +ї +ј +љ +њ +ћ +ќ +ѝ +ў +џ +Ґ +ґ +Ғ +ғ +94 +95 +Җ +җ +Ҙ +ҙ +Қ +қ +Ҝ +ҝ +9e +9f +Ҡ +ҡ +Ң +ң +Ҥ +ҥ +a6 +a7 +a8 +a9 +Ҫ +ҫ +ac +ad +Ү +ү +Ұ +ұ +Ҳ +ҳ +b4 +b5 +Ҷ +ҷ +Ҹ +ҹ +Һ +һ +bc +bd +be +bf +Ӏ +Ӂ +ӂ +c3 +c4 +Ӆ +ӆ +c7 +c8 +Ӊ +ӊ +cb +cc +Ӎ +ӎ +ӏ +Ӑ +ӑ +Ӓ +ӓ +Ӕ +ӕ +Ӗ +ӗ +Ә +ә +Ӛ +ӛ +Ӝ +ӝ +Ӟ +ӟ +e0 +e1 +Ӣ +ӣ +Ӥ +ӥ +Ӧ +ӧ +Ө +ө +Ӫ +ӫ +Ӭ +ӭ +Ӯ +ӯ +Ӱ +ӱ +Ӳ +ӳ +Ӵ +ӵ +- +- +Ӹ +ӹ +Ӻ +ӻ +Ӽ +ӽ +Ӿ +ӿ +
+Ẁ +Ạ+Ẃ +ẃ +Ẅ +ẅ +Ẇ +ẇ +Ẉ +ẉ +Ẋ +ẋ +Ẍ +Ạ+Ẏ +Ạ+Ạ+ẑ +Ẓ +ẓ +Ẕ +ẕ +ẖ +ẗ +ẘ +ẙ +? + +Ạ +ạ +Ả +ả +Ấ +ấ +Ầ +ầ +Ẩ +ẩ +Ẫ +ẫ +Ậ +ậ +Ắ +ắ +Ằ +ằ +Ẳ +ẳ +Ẵ +ẵ +Ặ +ặ +Ẹ +ẹ +Ẻ +ẻ +Ẽ +ẽ +Ế +ế +Ề +Ỡ+Ể +ể +Ễ +ễ +Ệ +ệ +Ỉ +ỉ +Ị +ị +Ọ +Ỡ+Ỏ +Ỡ+Ỡ+ố +Ồ +ồ +Ổ +ổ +Ỗ +ỗ +Ộ +ộ +Ớ +ớ +Ờ +Ỡ+Ở +ở +Ỡ +ỡ +Ợ +ợ +Ụ +ụ +Ủ +ủ +Ứ +ứ +Ừ +ừ +Ử +ử +Ữ +ữ +Ự +ự +Ỳ +ỳ +Ỵ +ỵ +Ỷ +ỷ +Ỹ +ỹ +

+ç, Å‘, È, ö, Ä…, ḇ, ạ, ă, ȃ, ÇŽ, ḛ, Ã¥, á¸, +ả, ḙ. +è é ê ë ã Ä— Ä“ +ǣǽǻǿíǡ ÇŸ ǘ Çœ Çš ḉ Ḡ+ṩ ế

+

Ṻ Çž Ȫ Ç— Ḯ Ç› Ç  È° +Ȭ Ǭ Ṹ Ǿ á¹’ Ḗ Ṥ Ḉ +Ấ á»

+

Ế ṠḔ Ḹ Ṝ +Ầ Ề Ứ Ớ Ừ Ờ Ử Ở +Ữ Ỡ Ự Ợ Ậ

+

Ộ Ệ Ẫ +Ỗ Ễ Ẩ Ổ Ể Ắ Ằ Ẳ +Ẵ Ặ Ṏ ỠỒ Ḝ Ṧ Ṩ

+

1d400𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏1d410𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐚𝐛𝐜𝐝𝐞𝐟1d420𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯1d430𝐰𝐱𝐲𝐳𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿1d440𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍𝑎𝑏1d450𝑐𝑑𝑒𝑓𝑔+𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟1d460𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯1d470𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿1d480𝒀𝒁𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏1d490𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛𝒜+𝒞𝒟1d4a0++𝒢++𝒥𝒦++𝒩𝒪𝒫𝒬+𝒮𝒯1d4b0𝒰𝒱𝒲𝒳𝒴𝒵𝒶𝒷𝒸𝒹+𝒻+𝒽𝒾𝒿1d4c0𝓀𝓁𝓂𝓃+𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏1d4d0𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟1d4e0𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩𝓪𝓫𝓬𝓭𝓮𝓯1d4f0𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿

+

1d500𝔀𝔁𝔂𝔃𝔄𝔅+𝔇𝔈𝔉𝔊++𝔍𝔎𝔏1d510𝔐𝔑𝔒𝔓𝔔+𝔖𝔗𝔘𝔙𝔚𝔛𝔜+𝔞𝔟1d520𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯1d530𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷𝔸𝔹+𝔻𝔼𝔽𝔾+1d540𝕀𝕁𝕂𝕃𝕄+𝕆+++𝕊𝕋𝕌𝕍𝕎𝕏1d550𝕐+𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟1d560𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫𝕬𝕭𝕮𝕯1d570𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿1d580𝖀𝖁𝖂𝖃𝖄𝖅𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏1d590𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟1d5a0𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯1d5b0𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹𝖺𝖻𝖼𝖽𝖾𝖯1d5c0𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏1d5d0𝗐𝗑𝗒𝗓𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟1d5e0𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭𝗮𝗯1d5f0𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿

+

1d600𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏1d610𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟1d620𝘠𝘡𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯1d630𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻𝘼𝘽𝘾𝘿1d640𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏1d650𝙐𝙑𝙒𝙓𝙔𝙕𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟1d660𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯1d670𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿1d670𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿1d680𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉𝚊𝚋𝚌𝚍𝚎𝚏1d690𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟1d6a0𝚠𝚡𝚢𝚣𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯1d6b0𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷𝚸𝚹𝚺𝚻𝚼𝚽𝚾𝚿1d6c0𝛀𝛁𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏1d6d0𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚𝛛𝛜𝛝𝛞𝛟1d6e0𝛠𝛡𝛢𝛣𝛤𝛥𝛦𝛧𝛨𝛩𝛪𝛫𝛬𝛭𝛮𝛯1d6f0𝛰𝛱𝛲𝛳𝛴𝛵𝛶𝛷𝛸𝛹𝛺𝛻𝛼𝛽𝛾𝛿

+

1d700𝜀𝜁𝜂𝜃𝜄𝜅𝜆𝜇𝜈𝜉𝜊𝜋𝜌𝜍𝜎𝜏1d710𝜐𝜑𝜒𝜓𝜔𝜕𝜖𝜗𝜘𝜙𝜚𝜛𝜜𝜝𝜞𝜟1d720𝜠𝜡𝜢𝜣𝜤𝜥𝜦𝜧𝜨𝜩𝜪𝜫𝜬𝜭𝜮𝜯1d730𝜰𝜱𝜲𝜳𝜴𝜵𝜶𝜷𝜸𝜹𝜺𝜻𝜼𝜽𝜾𝜿1d740𝝀𝝁𝝂𝝃𝝄𝝅𝝆𝝇𝝈𝝉𝝊𝝋𝝌𝝍𝝎𝝏1d750𝝐𝝑𝝒𝝓𝝔𝝕𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝𝝞𝝟1d760𝝠𝝡𝝢𝝣𝝤𝝥𝝦𝝧𝝨𝝩𝝪𝝫𝝬𝝭𝝮𝝯1d7c0𝟎𝟏1d7d0𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟1d7e0𝟠𝟡𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫𝟬𝟭𝟮𝟯1d7f0𝟰𝟱𝟲𝟳𝟴𝟵𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿

+

23002310232023302340235026002640265026602680

+

220022102220223022402250226022702280229022a022b022c022d022e022f0

+

&#x2100;&#x2101;&#x2103;&#x2104;&#x2105;&#x2106;&#x2107;&#x2108;&#x2109;&#x210A;&#x210B;&#x210C;&#x210D;&#x210E;&#x210F;&#x2110;&#x2111;&#x2112;&#x2113;&#x2114;&#x2115;&#x2116;&#x2117;&#x2118;&#x2119;&#x211A;&#x211B;&#x211C;&#x211D;&#x211E;&#x211F;&#x2120;&#x2121;&#x2122;&#x2123;&#x2124;&#x2125;&#x2126;&#x2127;&#x2128;&#x2129;&#x212A;&#x212B;&#x212C;&#x212D;&#x212E;&#x212F;&#x2130;&#x2131;&#x2132;&#x2133;&#x2134;&#x2135;&#x2136;&#x2137;&#x2138;&#x2139;&#x213A;&#x213B;&#x213D;&#x213E;&#x213F;&#x2140;&#x2141;&#x2142;&#x2143;&#x2144;&#x2145;&#x2146;&#x2147;&#x2148;&#x2149;&#x214A;&#x214B;

+

2190.21A0.&#x21af;21B0....21C021D0..21E0............21F0............

+Ḁ +Ḡ+Ḃ +ḃ +Ḅ +ḅ +Ḇ +ḇ +Ḉ +ḉ +Ḋ +ḋ +Ḍ +Ḡ+Ḏ +Ḡ+Ḡ+ḑ +Ḓ +ḓ +Ḕ +ḕ +Ḗ +ḗ +Ḙ +ḙ +Ḛ +ḛ +Ḝ +Ḡ+Ḟ +ḟ +Ḡ +ḡ +Ḣ +ḣ +Ḥ +ḥ +Ḧ +ḧ +Ḩ +ḩ + + +Ḭ +ḭ +Ḯ +ḯ +Ḱ +ḱ +Ḳ +ḳ +Ḵ +ḵ +Ḷ +ḷ +Ḹ +ḹ +Ḻ +ḻ +Ḽ +ḽ +Ḿ +ḿ +Ṁ +Ṡ+Ṃ +ṃ +Ṅ +ṅ +Ṇ +ṇ +Ṉ +ṉ +Ṋ +ṋ +Ṍ +Ṡ+Ṏ +Ṡ+Ṡ+ṑ +Ṓ +ṓ +Ṕ +ṕ +Ṗ +ṗ +Ṙ +ṙ +Ṛ +ṛ +Ṝ +Ṡ+Ṟ +ṟ +Ṡ +ṡ +Ṣ +ṣ +Ṥ +ṥ +Ṧ +ṧ +Ṩ +ṩ +Ṫ +ṫ +Ṭ +ṭ +Ṯ +ṯ +Ṱ +ṱ + + +Ṵ +ṵ +Ṷ +ṷ +Ṹ +ṹ +Ṻ +ṻ +Ṽ +ṽ +Ṿ +ṿ +
+

 â Ấ ấ Ầ ầ Ẩ ẩ Ẫ ẫ +Ậ ậ Ĉ ĉ

+

Ê ê Ế ế Ề ỠỂ +ể Ễ á»… Ệ ệ Äœ Ä Ä¤ Ä¥ ÃŽ î Ä´ ĵ

+

Ô ô Ỡố Ồ ồ Ổ ổ Ỗ ỗ +Ộ ộ Ŝ ŠÛ û Ŵ ŵ Ŷ ŷ Ạẑ +à á Ǻ ǻ Ǽ ǽ Ấ ấ Ắ ắ +Ć ć Ḉ ḉ É é Ḗ +ḗ Ế ế Ǵ ǵ à í

+

Ḯ ḯ Ḱ ḱ Ĺ ĺ Ḿ +ḿ Ń ń Ó ó Ǿ ǿ Ṍ ṠṒ ṓ Ỡ+ố Ớ ớ

+

Ṕ ṕ Ŕ ŕ Ś ś +Ṥ ṥ Ú ú Ǘ ǘ Ṹ ṹ Ứ ứ +Ẃ ẃ à ý Ź ź +À à Ầ ầ Ằ ằ È è Ḕ ḕ Ề +ỠÌ ì Ǹ ǹ

+

Ò ò Ṡṑ Ồ ồ +Ờ ỠÙ ù Ǜ ǜ Ừ ừ Ẁ ẠỲỳ +Ä ä Ǟ ǟ Ë ë Ḧ ḧ à ï Ḯ ḯ Ö ö +Ȫ ȫ Ṏ Ṡẗ

+

Ãœ ü Ṻ á¹» Ç› Çœ +Ç— ǘ Ç™ Çš Ẅ ẅ Ẍ ẠŸ ÿ +Ç ç Ḉ ḉ Ḡḑ Ȩ È© Ḝ á¸

+

Ḩ ḩ Ä¢ Ä£ Ķ Ä· Ä» ļ Å… ņ Å– Å— Åž ÅŸ Å¢ Å£ +È€ È È„ È… Ȉ ȉ ÈŒ È È È‘ È” È• +Ä‚ ă Ằ ằ Ắ ắ Ẳ ẳ Ẵ ẵ +Ặ ặ

+

Ä” Ä• Ḝ ḠĞ ÄŸ Ĭ Ä­ +ÅŽ ŠŬ Å­ +Ç ÇŽ ÄŒ Ä ÄŽ Ä Äš Ä› Ǧ ǧ Èž ÈŸ Ǩ Ç© +Ç Ç Ç° Ľ ľ Ň ň

+

Ǒ +ǒ Ř ř Š š Ť ť Ǔ ǔ Ǚ ǚ Ṧ +ṧ Ž ž +Šő Ű ű

+

Ớ ớ Ờ ỠỞ ở Ỡ ỡ +Ợ ợ

+

Ứ ứ Ừ ừ Ử ử Ữ +ữ Ự ự +Ả ả Ẩ ẩ Ẳ ẳ Ẻ ẻ Ể ể Ỉ +ỉ

+

Ỏ ỠỔ ổ Ở ở Ủ ủ +Ử ử Ỷ ỷ +Ą ą Ę ę Į į Ǫ ǫ Ǭ ǭ Ų ų +Å å Ů ů ẘ ẙ +Ạ ạ Ậ ậ Ặ ặ Ḅ ḅ Ḍ ḠẸ ẹ +Ệ ệ Ḥ ḥ Ị ị Ḳ ḳ Ḷ ḷ Ḹ ḹ

+

Ṃ ṃ Ṇ ṇ Ọ ỠỘ ộ Ợ ợ +Ṛ ṛ Ṝ ṠṢ ṣ Ṩ ṩ Ṭ

+

á¹­ Ụ ụ á»° á»± á¹¾ +ṿ Ẉ ẉ á»´ ỵ Ẓ ẓ +Ḁ Ḡ+Ḇ ḇ Ḏ Ḡẖ Ḵ ḵ Ḻ ḻ +Ṉ ṉ Ṟ ṟ á¹® ṯ Ẕ ẕ +È‚ ȃ Ȇ ȇ ÈŠ È‹ ÈŽ È È’ È“ È– È— +Ḛ ḛ Ḭ ḭ á¹´ á¹µ +Ḓ ḓ Ḙ ḙ Ḽ ḽ Ṋ ṋ á¹° á¹± Ṷ á¹· +Ä€ Ä Çž ÇŸ Ç  Ç¡ ǢǣĒ Ä“ Ḗ ḗ +Ḕ ḕ Ḡ ḡ Ħ ħ

+

Ī ī Ḹ ḹ Ō ŠǬ ǭ Ȫ ȫ Ȭ +ȭ Ȱ ȱ Ṡṑ Ṓ ṓ

+

Ṝ Ṡ+Ŧ ŧ Ū ū Ṻ ṻ Ȳ ȳ +Ȧ ȧ Ǡ ǡ Ḃ ḃ Ċ ċ Ḋ ḋ Ė ė Ḟ ḟ Ġ ġ Ḣ +ḣ İ

+

Ŀ ŀ Ṁ ṠṄ ṅ Ȯ ȯ Ȱ ȱ Ṗ ṗ Ṙ ṙ

+

Ṡ +ṡ Ṩ ṩ Ṧ ṧ Ṥ ṥ Ṫ ṫ Ẇ ẇ Ẋ +ẋ Ẏ ẠŻ ż

+

✠✂ ✃ ✄ ☎ ✆ ✇ +✈ ✉ ☛ ☞ ✌ ✠✎ âœ

+

✠✑ ✒ ✓ ✔ ✕ ✖ ✗ +✘ ✙ ✚ ✛ ✜ ✠✞ ✟

+

✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ +★ ✩ ✪ ✫ ✬ ✭ ✮ ✯

+

✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ +✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿

+

†â â‚ âƒ â„ â… â† â‡ +∠≠⊠⋠◠â â–  â

+

â â‘ â’ â–² â–¼ â—† â– â—— +☠♠⚠⛠✠â âž

+

⡠⢠⣠⤠⥠⦠⧠+♣ ♦ ♥ ♠ ① ② ③ ④

+

⑤ â‘¥ ⑦ ⑧ ⑨ â‘© ⶠⷠ+⸠⹠⺠⻠⼠⽠⾠â¿

+

➀ âž âž‚ ➃ âž„ âž… ➆ ➇ +➈ ➉ ➊ âž‹ ➌ ➠➎ âž

+

➠➑ ➒ ➓ ➔ → ↔ ↕ +➘ ➙ ➚ ➛ ➜ ➠➞ ➟

+

➠ ➡ ➢ ➣ ➤ ➥ ➦ ➧ +➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯

+

➱ ➲ ➳ ➴ ➵ ➶ ➷ +➸ ➹ ➺ ➻ ➼ ➽ ➾

+

฿₩₦₤₫€ƒ‰‱※†‡‶a″a‵a′℃â…â†â„¦â„§â„žâ„—â„–â„ ƒf℠℮• ‽ +

+

TABLE + +  ¡ ¢ £ ¤ ¥ +¦ § ¨ © +ª « ¬ ­ +® ¯

+

° ± ² ³ ´ +µ ¶ · ¸ +¹ º » ¼ +½ ¾ ¿

+

À à Â Ã Ä Ã… Æ Ç È É Ê Ë ÃŒ à Î Ã

+

à Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü à Þ ß

+

à á â ã ä å æ ç è é ê ë ì í î ï

+

ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

+

LATIN1

+  +¡ +¢ +£ +¤ +¥ +¦ +§ +¨ +© +ª +« +¬ +- +® +¯ +° +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +½ +¾ +¿ +À +à +Â +Ã +Ä +Å +Æ +Ç +È +É +Ê +Ë +Ì +à +Î +à +à +Ñ +Ò +Ó +Ô +Õ +Ö +× +Ø +Ù +Ú +Û +Ü +à +Þ +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +ì +í +î +ï +ð +ñ +ò +ó +ô +õ +ö +÷ +ø +ù +ú +û +ü +ý +þ +ÿ +

+

+ +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ + +

+

+Ä€ +Ä +Ä‚ +ă +Ä„ +Ä… +Ć +ć +Ĉ +ĉ +ÄŠ +Ä‹ +ÄŒ +Ä +ÄŽ +Ä +Ä +Ä‘ +Ä’ +Ä“ +Ä” +Ä• +Ä– +Ä— +Ę +Ä™ +Äš +Ä› +Äœ +Ä +Äž +ÄŸ +Ä  +Ä¡ +Ä¢ +Ä£ +Ĥ +Ä¥ +Ħ +ħ +Ĩ +Ä© +Ī +Ä« +Ĭ +Ä­ +Ä® +į +Ä° +ı +IJ +ij +Ä´ +ĵ +Ķ +Ä· +ĸ +Ĺ +ĺ +Ä» +ļ +Ľ +ľ +Ä¿ +Å€ +Å +Å‚ +Ń +Å„ +Å… +ņ +Ň +ň +ʼn +ÅŠ +Å‹ +ÅŒ +Å +ÅŽ +Å +Å +Å‘ +Å’ +Å“ +Å” +Å• +Å– +Å— +Ř +Å™ +Åš +Å› +Åœ +Å +Åž +ÅŸ + +Å  +Å¡ +Å¢ +Å£ +Ť +Å¥ +Ŧ +ŧ +Ũ +Å© +Ū +Å« +Ŭ +Å­ +Å® +ů +Å° +ű +Ų +ų +Å´ +ŵ +Ŷ +Å· +Ÿ +Ź +ź +Å» +ż +Ž +ž +ſ +

+

+

$%& {}_# +j™

+

​â£\SS

+

/.

+

1F: ǵ +A:  ¡§© »

+

B: ¶« ¿

+

C:ÅÆ

+

D: ØÃÞß

+

E: åæ

+

F:øðýþ

+

é è é ê ë ã ė ē +ç, ĕ, ě, ő, ę, ů

+

Ç ç Ḉ ḉ Ḡḑ Ȩ È© Ḝ á¸

+

Ḩ ḩ Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ +

+

Ả ả Ẩ ẩ Ẳ ẳ Ẻ ẻ Ể ể Ỉ +ỉ

+

Ỏ ỠỔ ổ Ở ở Ủ ủ +Ử ử Ỷ ỷ

+

pounds££

+

a » b« c« d »e +a » b« c«d»e +a« b« c«  d« e  »f  »g »h »i +a<<b<< c<< d<< e >>f >>g >>h>>i +a« b« c«  d« e  »f  »g »h »i +a«b« c« d« e »f »g »h»i

+

a refaire +the love that men to hym owen.

+

AT_DOC_END

+
diff --git a/thirdparty/tralics-2.15.2/Modele/hello.xml b/thirdparty/tralics-2.15.2/Modele/hello.xml new file mode 100644 index 0000000..3b9fd37 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/hello.xml @@ -0,0 +1,6 @@ + + + + +

Hello, world! +

diff --git a/thirdparty/tralics-2.15.2/Modele/hello1-no.xml b/thirdparty/tralics-2.15.2/Modele/hello1-no.xml new file mode 100644 index 0000000..01de241 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/hello1-no.xml @@ -0,0 +1,7 @@ + + + +
+

Hello, world! +

+
diff --git a/thirdparty/tralics-2.15.2/Modele/hello1.xml b/thirdparty/tralics-2.15.2/Modele/hello1.xml new file mode 100644 index 0000000..0272540 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/hello1.xml @@ -0,0 +1,7 @@ + + + + +

Hello, world! +

+
diff --git a/thirdparty/tralics-2.15.2/Modele/hello2.xml b/thirdparty/tralics-2.15.2/Modele/hello2.xml new file mode 100644 index 0000000..3276ed4 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/hello2.xml @@ -0,0 +1,7 @@ + + + +
+

Hello, world! +

+
diff --git a/thirdparty/tralics-2.15.2/Modele/hello3.xml b/thirdparty/tralics-2.15.2/Modele/hello3.xml new file mode 100644 index 0000000..db65d71 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/hello3.xml @@ -0,0 +1,11 @@ + + + + +
+<abstract>No abstract given</abstract> +<author>José Grimm</author> + +

Hello, world! +

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testb.xml b/thirdparty/tralics-2.15.2/Modele/testb.xml new file mode 100644 index 0000000..4d25430 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testb.xml @@ -0,0 +1,21 @@ + + + + + +

Joe And, Joe And, Joe-And, et al. +X.

+

A b Cde. +X.

+

Charles Louis Xavier Joseph de la Vallée Poussin. +X.

+

Maria De La Cruz. +X.

+

, , , ,

+

a: (prenote ;;;;, postnote) +b: (;;;;) +d: (;;;;, post) +e: (pre ;;;;) +f: (pre )

+

Hey

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testb0.xml b/thirdparty/tralics-2.15.2/Modele/testb0.xml new file mode 100644 index 0000000..259c375 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testb0.xml @@ -0,0 +1,718 @@ + + + + + + + + + + + +b-title +c-journal +d-number +e-volume +f-month +g-year +h-pages +some-urli-note + + + +b-title +c-journal +d-number +e-volume +f-month +g-year +h-pages +some-urli-note + + + + +c-title +d-edition +e-series +f-number +g-volume +h-publisher +i-address +j-month +k-year +l-note + + + +b-title +c-howpublished +d-address +e-month +f-year +g-note + + + +b-title +Ph. D. Thesis +c-school +d-year + + + +b-title +c-type +d-school +e-address +f-month +g-year +h-note + + + +b-title +Masters thesis +c-school +d-year + + + +b-title +c-type +d-school +e-address +g-month +h-year +i-note + + + +b-title +Technical report +c-institution +d-year + + + +Title, Majuscule, Majuscule, Majuscule +journal +2003 + + + +b-title +c-type +d-number +e-institution +f-addres +g-month +h-year +i-note + + + +b +c-organization +d-edition +e-address +f-month +g-year +h-note + + + +b-title +c-note + + + +b-title +c-month +d-year +e-note + + + +b-title +c-howpublished +d-month +e-year +f-note + + + +b-title, ACCENTáéíóúý, ÃÉÃÓÚà àèìòù, ÀÈÌÒÙ, âêîôû, ÂÊÎÔÛ äëïöüÿ, ÄËÃÖÜ ñ Ñ +c-booktitle + + + +b-title +c-booktitle +d-series +e-number +f-volume +g-organization +h-publisher + +j-pages +k-address +l-month +m-year +n-note + + + +b-title : et du texte +c-booktitle +http://www.inria.fr/~grimm + + +b-title + +d-booktitle +e-series +f-number +g-volume +h-publisher +i-address +j-month +k-year +l-chapter +m-pages +n-note + + + + +c-title +d-edition +e-series +f-number +g-volume +h-publisher +i-address +j-month +k-year +l-chapter +m-pages +n-note + + + +A beautiful title +A journal +16 +17 +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + + +A beautiful title +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Available by anonymous ftp +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + + +A beautiful title +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +January +2000 +First and second +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +Title of the book +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +January +2000 +First and second +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Title of the book +15 +16 +17 +Unknown Organisation +Publishing&Co, Inc. + +12-13 +Paris, New Yorkm, Amsterdam +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Unknown Organisation +Second +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Some type +The best school in the word +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Available by anonymous ftp + +Title of the book +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Some type +The best school in the word +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +Some type +16 +Some well-known institution +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + + +X + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +X + + + +BRACETEST1 leave leave a leave H + + + +Some title +http://www.inria.fr/rrrt/rt-0265.html50 +70 +21 +some note + + + +De XML à PDF avec xmltex et Passive +Cahiers Gutenberg +35-36 +79-114 +2000 + + + +Mathematical Markup Language (MathML) Version 2.0 +http://www.w3.org/TR/MathML2/ +2001 + + + +X + + + +BRACETEST6 leaveABCx del delIetc + + + +X + + +a11 + + +c +d +e-number +f-volume +g +h +i +j-year +k + + +A beautiful title + +Unknown Organisation +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +January +2000 +12-13 +A DOI +http://www.mysite.mycountry/mypage + + +BRACETEST4 leaveABCx deltc leaveIetc + + + +BRACETEST5 leaveABCx deltc leaveIetc + + + +The companion +Addison Wesley +1993 + + + +Extending ML with semi-explicit higher-order polymorphism +Journal of Functional Programming +1/2 +155 +1999 +134-169 +ftp://ftp.inria.fr/INRIA/Projects/Cristal/iandc.ps.gz + + +Outils pour la manipulation du rapport d'activité +Technical report +RT-0265 +Inria +2002 +http://www.inria.fr/rrrt/rt-0265.html + + +A title +somewhere +http://www.inria.fr +The Big Organizer +2010 + + + +BRACETEST2 delABCx delHh + + + +BRACETEST3 leaveABCx leaveH delAb + + + +Produire du MathML et autres ...ML à partir d'Ω : Ω se généralise +Cahiers Gutenberg +33-34 +173-182 +1999 + + + + +a14 + + +a22 + + +a10 +b-year + + +c, L 2 +d–e—f +e-year + + + +The book +Addison Wesley +1984 + + + +Une expérience d'utilisation de LaTeX : le Rapport d'activité de l'INRIA +Cahiers Gutenberg +0 +apr +1988 +17-24 + + + + + + +Passive +http://www.tei-c.org.uk/Software/passivetex/ +2003 + + + +Problèmes extrémaux dans les espaces de Hardy, Application à l'identification de filtres hyperfréquences à cavités couplées +Ph. D. Thesis +Ecole de Mines de Paris +1998 + + + +Problèmes extrémaux dans les espaces de Hardy, Application à l'identification de filtres hyperfréquences à cavités couplées + +Thèse de doctorat +Ecole de Mines de Paris +1998 +foo + + +c-title +e-publisher +f-year +d-chapter + + + +The Unicode Standard, version 3.0 +Addison Wesley +2000 + + +journal +2003 + + + + + + + + + + + +Docbook. The Definite Guide +O'Reilly & Associates, Inc +1999 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2003 + + + +1789 + + + + + + + + + + + + + + + + + + + + + + + + +X + + + +X + diff --git a/thirdparty/tralics-2.15.2/Modele/testb1.xml b/thirdparty/tralics-2.15.2/Modele/testb1.xml new file mode 100644 index 0000000..e479381 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testb1.xml @@ -0,0 +1,854 @@ + + + + + + + + + + + +b-title +c-journal +d-number +e-volume +h-pages +f-month +g-year +some-urli-note + + + +b-title +c-journal +d-number +e-volume +h-pages +f-month +g-year +some-urli-note + + + +c-title + +d-edition +e-series +f-number +g-volume +h-publisher +i-address +j-month +k-year +l-note + + + +b-title +d-address +c-howpublished +e-month +f-year +g-note + + + +b-title + +Ph. D. Thesis +c-school +d-year + + + +b-title +e-address +c-type +d-school +f-month +g-year +h-note + + + +b-title +Masters thesis +c-school +d-year + + + +b-title +e-address +c-type +d-school +g-month +h-year +i-note + + + +b-title +Technical report +c-institution +d-year + + + +Title, Majuscule, Majuscule, Majuscule +journal +2003 + + + +b-title +d-number +f-addres +c-type +e-institution +g-month +h-year +i-note + + + +b +d-edition +e-address +c-organization +f-month +g-year +h-note + + + +b-title +c-note + + + +b-title +c-month +d-year +e-note + + + +b-title +c-howpublished +d-month +e-year +f-note + + + +b-title, ACCENTáéíóúý, ÃÉÃÓÚà àèìòù, ÀÈÌÒÙ, âêîôû, ÂÊÎÔÛ äëïöüÿ, ÄËÃÖÜ ñ Ñ +c-booktitle + + + +b-title + +d-series +e-number +f-volume +h-publisher +k-address +c-booktitle +g-organization +j-pages +l-month +m-year +n-note + + + +b-title : et du texte +c-booktitle +http://www.inria.fr/~grimm + + +b-title + +xo-edition +e-series +f-number +g-volume +h-publisher +i-address +d-booktitle +m-pages +l-chapter +xl-type +j-month +k-year +n-note + + + +c-title + +d-edition +e-series +f-number +g-volume +h-publisher +i-address +m-pages +l-chapter +xk +j-month +k-year +n-note + + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + + +X + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +X + + + +BRACETEST1 leave leave a leave H + + + +Some title +http://www.inria.fr/rrrt/rt-0265.html50 +70 +21 +some note + + + +De XML à PDF avec xmltex et Passive +35-36 +Cahiers Gutenberg +79-114 +2000 + + + +Mathematical Markup Language (MathML) Version 2.0 +http://www.w3.org/TR/MathML2/ +2001 + + + +X + + + +BRACETEST6 leaveABCx del delIetc + + + +X + + +a11 + + +d +e-number +f-volume +g +h +c +i +j-year +k + + + +A beautiful title + +A journal +Second +15 +16 +17 +Publishing&Co, Inc. +Paris, New Yorkm, Amsterdam +Available by anonymous ftp +Title of the book +Unknown Organisation +12-13 +First and second +Some type +The best school in the word +Some well-known institution +January +2000 +A DOI +http://www.mysite.mycountry/mypage + + +BRACETEST4 leaveABCx deltc leaveIetc + + + +BRACETEST5 leaveABCx deltc leaveIetc + + + +The companion +Addison Wesley +1993 + + + +Extending ML with semi-explicit higher-order polymorphism +Journal of Functional Programming +1/2 +155 +134-169 +1999 +ftp://ftp.inria.fr/INRIA/Projects/Cristal/iandc.ps.gz + + +Outils pour la manipulation du rapport d'activité +RT-0265 +Technical report +Inria +2002 +http://www.inria.fr/rrrt/rt-0265.html + + +A title +somewhere +http://www.inria.fr +The Big Organizer +2010 + + + +BRACETEST2 delABCx delHh + + + +BRACETEST3 leaveABCx leaveH delAb + + + +Produire du MathML et autres ...ML à partir d'Ω : Ω se généralise +33-34 +Cahiers Gutenberg +173-182 +1999 + + + + +a14 + + +a22 + + +a10 +b-year + + +c, L 2 +d–e—f +e-year + + + +The book +Addison Wesley +1984 + + + +Une expérience d'utilisation de LaTeX : le Rapport d'activité de l'INRIA +Cahiers Gutenberg +0 +17-24 +apr +1988 + + + + + + +Passive +http://www.tei-c.org.uk/Software/passivetex/ +2003 + + + +Problèmes extrémaux dans les espaces de Hardy, Application à l'identification de filtres hyperfréquences à cavités couplées +Ph. D. Thesis +Ecole de Mines de Paris +1998 + + + +Problèmes extrémaux dans les espaces de Hardy, Application à l'identification de filtres hyperfréquences à cavités couplées + +Thèse de doctorat +Ecole de Mines de Paris +1998 +foo + + +c-title +e-publisher +d-chapter +f-year + + + +The Unicode Standard, version 3.0 +Addison Wesley +2000 + + +journal +2003 + + + + + + + + + + + +Docbook. The Definite Guide +O'Reilly & Associates, Inc +1999 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2003 + + + +1789 + + + + + + + + + + + + + + + + + + + + + + + + +X + + + +X + diff --git a/thirdparty/tralics-2.15.2/Modele/testbe.xml b/thirdparty/tralics-2.15.2/Modele/testbe.xml new file mode 100644 index 0000000..6a2faf3 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testbe.xml @@ -0,0 +1,116 @@ + + + + + +

Test of bordermatrix

+

abcdef(ghij)klmnopqrst

+

no row +one row 123 +first row empty 1(23) +first row small 11(23) +second row empty 1212 +second row small 123 +first row OK 123(4<)

+

Testing spaces in math +8.53581pt25.0pt36.0ptx 2 ++=0y 2 +x 2 ++=0y 2 +x 2 aabbccddy 2 +x 2 aabbccddy 2

+

xxyy

+

Test of spaces between \begin{description} and \item

+Requirements + + + +

the input distribution : inputDistribution

+
+

: Distribution

+
+ + +
+
Results + + + +

the random input vector : inputRandomVector

+
+

: RandomVector which implementation is a UsualRandomVector

+
+ + +
+
+

class Exception {

+

public :

+

        Exception ( const char *description, const char * comment = 0 ) ;

+

        virtual ~Exception( ) throw();

+

        /* ... */

+

        friend ostream & operator<< (ostream &, const Exception & e ) ;

+

} ;

+

This is a test file for the listings package + +// In a case like \def\bar#1foo#2{...}, this returns the value of #1 +// given the token list foo as argument. +TokenList Parser::read_delimited (const TokenList& L) +{ + TokenList res; + scanner_status = ss_matching; + scan_group_del(res,L); + scanner_status = ss_normal; + return res; +}

+

+one +

Footnotes and fontsnormalitalic after note.

+

Hey Footnotes and fontsnormalitalic after note.

+

This is large This is red +This is italicsNormalNote small note blue note after the note after italic

+

after red +after large

+
+Two +

Some text.

+

Texte1.

+ +

Rule A

+
+

texte fin1.

+

Texte2.

+ +

Rule B

+
+

texte fin2.

+

Texte3

+ +

Rule C

+
+

texte fin3.

+

Liens et et . Lien +

+

3 ok'3 + 4 ok4 + 5 ok5 + 6 OK6

+

+

foo bar +

+

We are in H-mode here

+
+One in appendix +

Some text.

+
+Two in appendix +

Some text. +References ,

+

this is the verbatim stuff

+

Test grabenv +CxDAyzBt +AyzBt=

+

http://www.inria.fr +http://www.inria.fr +http://www.inria.fr

+

a~b~n_d +a~b~n_d

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testclass.xml b/thirdparty/tralics-2.15.2/Modele/testclass.xml new file mode 100644 index 0000000..e00475e --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testclass.xml @@ -0,0 +1,23 @@ + + + + +

OK +ok +ok

+

Reference to figure: +Reference to first subfigure: +Reference to second subfigure:

+
main figure caption +first subfigure caption +second subfigure caption + +
+foo + +sec1Sec + +foo2chapter two + +sec2 +
diff --git a/thirdparty/tralics-2.15.2/Modele/testerr.xml b/thirdparty/tralics-2.15.2/Modele/testerr.xml new file mode 100644 index 0000000..298fe0c --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testerr.xml @@ -0,0 +1,315 @@ + + + + +

This document contains a number of errors. +. +This is a normal + line

+

F1

+

Line1

+

Line2

+

after F1 +F2Line3 +Line4 +after F2 +F3after F3 +Line after input should be OK

+

xA=x +y= +xB=x +y=

+

x incomplete + + +A=a

+

b=cA=a=b]c +A=axparb=c

+

dA=axparb=cd +A=a=b]cA=a=b]c +A=axparb=cdA=axparb=cd

+

Test outer + +>

+

Some math only commands x y

+

Counter overflow +azAZ*Newcommand + + + + + +barbar + + + +

+

WWX

+

WWX + +

+foo +=x=

+

Acc + +ế + + + + + + +

+

Arrays + + + + +w

+

+xx +xx +

+

Testing Optional Argument. +text is Ok +text is Ok +text is Ok +text +textarx

+ + +zt

ok

+

ok +

runaway errors signaled above, and a missing unit here +

+xxx +

+

Is current mode ok here +

+

etc

+

3 errors

+

This is new par +a ba ba ba ba ba b +a b[a +a box

+

Testing get_r_token + + + + + mm 10 +Cannot define 10 +Bad redefinition + +Multiple labels

+

Checking some math errors +x=1 +x=2\frac{3}{4}5 +\left.=\right. +\left(\right. + + we are out of math +

+ x = +

out of math a{bc}\frac{x}{yz}(17)

+

xz +a b c +a +x x y x x y x y z u v + +This is out of math mode

+

More tests +option +Ok outside RA +RC is tested outside RA +d +d +Error here +d +d

+

Xand +

+ +

+ +com +ProjB +ProjC + + +

x() + + +fooAgeefooBgee +fooAgeefooBgee +fooAetcA.fooBetcB. +

+

Check for some unimplemented commands +0,,�,, +,,,, +okok +ok +. +text + +

+

X +foo + +Here we try to converts tokens to numbers +pt `ATesting incompatible mu, first from mu to something else +now scanning mu +bad mu +mu Missing unit +X +fooA \hbox{foo} 412 +No err signaled if etc removed...! + etcbar First arg of \xboxis normal, scond like hbox +FOOO + + +

+ +uu +vu +xxww +zz +

Next par

+

how to check overflow here ? +12pt +12pt This one should be OK + +Ok + + by 1 +ok and bad + + + + +

+

An example of all the font commands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+

OKlykeyA +OK +OKfamilykeyA +OK

+

Errors from FO + ok + overflow + bad + + + + + + + + + + + + +ok=1 +

+

This is OK + fail +OK +bad + good + bad

+

Lines that follow give missing unit but \badis not called +. Missing unit here +. . .

+

This is a good accent Ắ and Ắ +

+

Now errors + + + + + + +

+

What is the result here ?

+

ok1 +ok2 + + + + + + +

+

Lets try some files foo ok bar bad +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+

Case of special chars in commande names ! +!

+

More catcodes on Unicode chars +gives foobar OK +givesokbar OK bad €bar bad +okok okok ok +givesok bar OK okbar good +OK + ok OK ok OK + okOOk + okOOk + +aaNull𒍅bb + +aa"12345 bb

+ diff --git a/thirdparty/tralics-2.15.2/Modele/testhtml.xml b/thirdparty/tralics-2.15.2/Modele/testhtml.xml new file mode 100644 index 0000000..d91be7f --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testhtml.xml @@ -0,0 +1,208 @@ + + + + + +

This file tests the html package.

+

It also tests abstract and keyval

+
+

Some font tests

+

B + C D +E +E

+

xxxx + +Some dummy tex file

+

This is piece of code that comes from torture + 1 +2 +3 +4

+

foo +foo +foo

+

AB +AB +AB +AB +A +A +foo +foo

+

B +Bp 100 +Bp101 +Bp102 +B +B +B

+

a +a +a +a +a +a

+

yeahok +Some url

+

a 2 3

+

seen 1 in Fooseen 2 in Barseen dbar in Bar

+ + + +De XML à PDF avec xmltex et Passive +Cahiers Gutenberg +35-36 +79-114 +2000 + + + +Produire du MathML et autres ...ML à partir d'Ω : Ω se généralise +Cahiers Gutenberg +33-34 +173-182 +1999 + + + +The book +Addison Wesley +1984 + + + +Une expérience d'utilisation de LaTeX : le Rapport d'activité de l'INRIA +Cahiers Gutenberg +0 +apr +1988 +17-24 +

THE FUNNY TEST

+

1 +2 +3 +4

+

âœâœ‚✃✄☎✆✇✈✉☛☚☞☜✌âœâœâœâœŽâœ‘✒✓✔✕✖✗✙✚✜✛âœâœžâœŸâœ âœ¡âœ¢âœ£âœ¤âœ¥âœ¦âœ¨âœ©â˜…✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿â€ââ‚âƒâ‰âŠâ‹âˆâ‡â„â†â…â—ââââ‘â’▲▼◆â–â——â—–â˜â™âšâžŸâž¦âž¥âž§âž²

+

12,345 +123,456 +1,234,567 +12,345,678 +1 234 567 890 123 456 789 012 345 678 901 234 567 890

+

aÌ– ạ̀ ạ̀ à̱ à +eÌ— eÌ̱ eÌ̱ é +oÌ­ oÌ‚Ì£ oÌ‚Ì£ ô +uÌ° uÍ‚Ì£ uÍ‚Ì£ Å© +a̤ ä +Ä™ eÌ‹ +oÌ¥ o̱̊ o̱̊ oÌŠ +u̬ uÌ̬ aÌ̬ Ç” +a̯ ă̠ ă̠ ă +e̱ Ä“ +oÌ£ oÌÌ£ oÌÌ£ aÌ u̇ ‿au aÍ¡e

+

À È Ì Ò Ù Ǹ Ẁ Ỳ à è ì ò ù ǹ Ạỳ x̀

+

à É à Ó Ú à Ć Ĺ Ń Å” Åš Ź Ç´ Ḱ Ḿ á¹” Ẃ Ǽ Ǻ Ǿ ǽ Ç» Ç¿ á é í ó ú ý ć ĺ Å„ Å• Å› ź ǵ ḱ ḿ ṕ ẃ vÌ

+

Â Ê ÃŽ Ô Û Ĉ Äœ Ĥ Ä´ Åœ Å´ Ŷ Ạâ ê î ô û ĉ Ä Ä¥ ĵ Šŵ Å· ẑ

+

Ã Ñ Õ Ũ Ĩ Ṽ Ẽ Ỹ ĩ õ ã ñ õ ĩ õ ṽ ẽ ỹ w̃

+

Ä Ë à Ö Ü Ÿ Ḧ Ẅ Ẍ ä ë ï ö ü ÿ ḧ ẅ Ạẗ z̎

+

ŠŰ ő ű e̋

+

Å Ů å ů ẘ ẙ e̊

+

ÄŒ ÄŽ Äš Ľ Ň Ř Å  Ť Ž Ç Ç Ç“ Ǧ Ǩ Èž Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž ÇŽ Ç Ç” ǧ Ç© ÈŸ Ç° xÌŒ

+

Ă Ĕ Ğ Ĭ Ŏ Ŭ ă ĕ ğ ĭ Šŭ x̆

+

Ä€ Ä’ Ħ Ī ÅŒ Ŧ Ū Ȳ Ḡ Ç¢ Ç£ Ä Ä“ ħ Ä« Šŧ Å« ȳ ḡ

+

Ȧ Ḃ Ċ Ḋ Ė Ḟ Ġ Ḣ İ Ŀ Ṁ Ṅ Ȯ Ṗ Ṙ Ṡ Ṫ Ẇ Ẋ Ẏ Ż ȧ ḃ ċ ḋ ė ġ ḣ ŀ Ṡṅ ȯ ṗ ṙ ṡ ṫ u̇ v̇ ẇ ż Ạż q̇

+

Ç Ģ Ķ Ļ Ņ Ŗ Ş Ţ Ȩ ḠḨ ç ģ ķ ļ ņ ŗ ş ţ ȩ ḑ ḩ b̧

+

Ą Ę Į Ǫ Ų ą ę į ǫ ų b̨

+

Ḁ E̥ I̥ O̥ U̥ R̥ Ḡe̥ i̥ o̥ u̥ r̥ y̥

+

Ḇ Ḏ Ḵ Ḻ Ṉ Ṟ Ṯ Ẕ ḇ Ḡḵ ḻ ṉ ṟ ṯ ẕ ẖ e̠

+

Ḅ Ḍ Ḥ Ḳ Ḷ Ṃ Ṇ Ṛ Ṣ Ṭ Ṿ Ẉ Ẓ Ạ Ẹ Ị Ọ Ụ Ỵ ḅ Ḡḥ ḳ ḷ ṃ ṇ ṛ ṣ ṭ ṿ ẉ ẓ ạ ẹ ị Ỡụ ỵ c̣

+

È‚ Ȇ ÈŠ ÈŽ È– È’ ȃ ȇ È‹ È È— È“ xÌ‘

+

Ḛ Ḭ Ṵ ḛ ḭ ṵ o̰

+

Ḓ Ḙ Ḽ Ṋ Ṱ Ṷ ḓ ḙ ḽ ṋ ṱ ṷ a̭ +Ḁ Ḡe̥ +Ả Ẻ Ỉ Ỏ Ủ Ỷ ả ẻ ỉ Ỡủ ỷ x̉

+

t̪ t̪ d̺ d̺ +o̹ o̹ oÌœ oÌœ +gÌ‘ gÌ‘ ɔ̟ oÌŸ +eÌž eÌž É›Ì eÌ +u̘ u̘ ə̙ eÌ™ +e̽ e̽ kÌ« kÌ« +t̼ t̼

+

aÌ– aÌ– ạ̀ ạ̀ à̱ à +eÌ— eÌ— eÌ̱ eÌ̱ é +oÌ­ oÌ­ oÌ‚Ì£ oÌ‚Ì£ ô +uÌ° uÌ° uÍ‚Ì£ uÍ‚Ì£ Å© +a̤ a̤ ä +Ä™ Ä™ eÌ‹ +oÌ¥ uÌ¥ o̱̊ o̱̊ oÌŠ +u̬ u̬ uÌ̬ aÌ̬ Ç” +a̯ a̯ ă̠ ă̠ ă +e̱ e̱ Ä“ +oÌ£ eÌ£ oÌÌ£ oÌÌ£ aÌ u̇ +‿au aÍ¡egÍ¡b

+

TEST1 f Êž ɹ ʇ Ê +ÉŸ ɲ ħ ɬ É® +A dOg, B kæt ma214

+

Test2 E J A ʜ ʟ U ʙ ɢ ʀ

+

Test3 É– É­ ɳ ɽ É» Ê‚ ʈ Ê

+

Test4 ʛ ɓ ɗ ɠ ʄ ʘ

+

a, a, É, É‘, É’, +a, æ, ao, á´€, 4, +a, ao, +ÊŒ, Δ

+

b, ƀ, b̶, ь, ъ,ɓ, ʙ, β

+

c, c̶, Ä, ç, ƈ, É•, Ê—, +Ê—, Ê—, Ê—

+

d, đ, d̶, d, d, ɗ,ɖ, +d, ȡ, db, ʣ, ʥ, +ʤ, ȡʑ, ð

+

e, eÌ¢, É™, Éš, ɘ, á´‡, +É›, ɛ̢, Êš, Éœ, +É, Éž

+

f, F

+

ɡ, ɡ̶, ɡ̰, ɡ, g, ɢ, ʛ, +ɣ, γ, γ, γ, +ɤ, ɤ

+

h, ƕ, ħ, ɦ, h, h, ɧ, +ɥ, ʜ

+

i, ı, ɨ, ɪ, ɩ, ɿ, ɿ, +ʅ, ʅ

+

j, j, Ê, j, +ÉŸ, ÉŸ, +Ê„, Ê„, á´Š

+

k, Æ™, Êž, K, Êž

+

l, ɫ, ƚ, ɬ, ɭ, ɮ, +ɮ, lɾ, ʟ, +L, λ, ƛ,

+

m, ɱ, hm, ɯ, É°, á´

+

n, n, ƞ, ñ, ɲ, ŋ, ɳ, ȵ, +ɴ

+

o, ♀, ♀, ʘ, ʘ, ɵ, +ø, œ, ɶ, ɔ, ɔ̢, ɔe, +ω, ω, ɷ, Ω

+

p, ƥ, p, ᴘ, ƿ, +þ, þ, þ, þ, +þ, ɸ,

+

q, Ê , qp, Q

+

r, ɾ, ɼ, ɽ, ɹ, É», +ɺ, Ê€, Ñ, Ê,

+

s, š, ʂ, ʃ, ʃ, ƪ, +ʆ

+

t, t, t, ʈ, ƭ, ʇ, +t, ȶ, ʨ, tc, ʦ, +ʧ, θ

+

u, ʉ, ʊ, ᴜ, u,

+

v, Ê‹,

+

w, Ê

+

x, χ

+

y, ÊŽ, Ê, Ê®, ʯ

+

z, È¥, ž, Ê‘, Ê, Æ», 2, +Ê’, ƺ, Ê“, ƹ, 3

+

UUUUUUUUaU +nU nU nU +gU sU sU sU

+

ph = pÊ° +kw=kÊ· tj=tʲ dÉ£=dË  +dÊ•=dË +dn dl=dË¡

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testkeyval.xml b/thirdparty/tralics-2.15.2/Modele/testkeyval.xml new file mode 100644 index 0000000..83eb7d2 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testkeyval.xml @@ -0,0 +1,129 @@ + + + + +

2008/02/15 Package for testing keyval

+

epW=5.opE.CuCvLaD=Lb.Lcxyz

+

I will first check your input, please wait.

+

The input true was correct, we proceed.

+

I finished the input check. + +I will first check your input, please wait.

+

The input nottrue was incorrect and was ignored.

+

I finished the input check.

+

auaxvbu3v +auaxvbu3v +auaxvbu43v

+Package xkeyval Warning: Key `keya' has been disabled at line 339 of file testkeyval.tex. +

XXAaAabBb +aAa +cCVc +XXBcaa and bacb and cb +cCVc cCVc +XXCc1ec2f +cCVc cCVc +XXCc1ec2f +XXDaAaEaAabAa

+

+

+Testing errors and the like +

This is a test +Package mypack Error: error line1 +(mypack) line2 +Package mypack Warning: warning line1 +(mypack) line2 at line 579 of file testkeyval.tex. + +Package mypack Warning: warning nl line1 +(mypack) line2. + +Package mypack Info: info line1 +(mypack) line2 at line 581 of file testkeyval.tex. + +Class myclass Error: error line1 +(myclass) line2 +Class myclass Warning: warning line1 +(myclass) line2 at line 583 of file testkeyval.tex. + +Class myclass Warning: warning nl line1 +(myclass) line2. + +Class myclass Info: info line1 +(myclass) line2 at line 585 of file testkeyval.tex. +

+info bar at line 587 of file testkeyval.tex. +warning bar +PREFIXsecond line at line 588 of file testkeyval.tex. +error bar +PREFIXsecond line
+Elements + +latex +xml +translator + +Trees +

We test also trees

+

Value of node A

+

. +. +. + + + + + + + + +. + +. + + + + + +

+

+ + +

+

Now checking runaway +Second test +tLine of text.

+Tralics Warning: Command \par has changed +Tralics Warning: Command \foo has changed +Tralics Warning: Command \foo has changed +Tralics Warning: Command \foo has changed +

x +x +x +x +x +bx +bx +x + + + +Une expérience d'utilisation de LaTeX : le Rapport d'act ivité de l'INRIA +Cahiers Gutenberg +0 +apr +1988 +17-24 +x +val +xx +x + x + x +x

+

X

+

X

+

X

+

XNon-closed \begingroup started at line 683. +Non-closed brace started at line 683. +Non-closed environment `it' started at line 683. +

+ diff --git a/thirdparty/tralics-2.15.2/Modele/testm1a.xml b/thirdparty/tralics-2.15.2/Modele/testm1a.xml new file mode 100644 index 0000000..3804107 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testm1a.xml @@ -0,0 +1,10 @@ + + + + +

simple math test +x=y 2 Ω∑∆âˆ

+ 0 f(x)dx +

𝐀𝟿 +𝐀;𝟿;𝒟

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testm1b.xml b/thirdparty/tralics-2.15.2/Modele/testm1b.xml new file mode 100644 index 0000000..b2e01c7 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testm1b.xml @@ -0,0 +1,12 @@ + + + + +

simple math test +x = y ^2 Ω∑∆âˆ

+ +\int _0 ^\infty f(x)\, dx + +

𝐀𝟿 +𝐀;𝟿; 𝒟

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testm1c.xml b/thirdparty/tralics-2.15.2/Modele/testm1c.xml new file mode 100644 index 0000000..703f49f --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testm1c.xml @@ -0,0 +1,12 @@ + + + + +

simple math test +x=y 2 Ω∑∆âˆx = y ^2 Ω∑∆âˆ

+ 0 f(x)dx +\int _0 ^\infty f(x)\, dx + +

𝐀𝟿𝐀𝟿 +𝐀;𝟿;𝒟𝐀;𝟿; 𝒟

+
diff --git a/thirdparty/tralics-2.15.2/Modele/testmath.xml b/thirdparty/tralics-2.15.2/Modele/testmath.xml new file mode 100644 index 0000000..94e10d2 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testmath.xml @@ -0,0 +1,4873 @@ + + + + +Producing MathML with TralicsProduire du MathML avec TralicsMay 200729 November 20072José GrimmThe software and the documentation is available +at http://www-sop.inria.fr/apics/tralicsJose.Grimm[at]sophia.inria.fr

The purpose of this paper is to show that it is possible to +translate almost every mathematical formula from syntax to XML. +The document you are reading contains a great number of formulas extracted +from the book, the companion, the MathML recommendation, and +translated into XML by Tralics; it is available in Pdf or HTML version.

+

The HTML version was produced using a very simple style sheet; mathematics are +left unchanged, and you need a MathML-aware browser, like Firefox, or +adequate plugins, and a set of fonts for the symbols or operators. +The Pdf version was obtained by use of xmltex (a +package by D. Carlisle that makes an XML interpreter), and a great number +of modifications to the file mathml2.xmt (that interprets elements in +the MathML namespace). All files needed to produce this document are part of +the Tralics bundle (version 2.10 or more).

+

This document was compiled with the experimental version 2.10.8, in which examples +in section should work fine.

+

Le but de ce papier est de démontrer qu'il est possible de +traduire presque toutes les formules de mathématiques de la syntaxe + vers le langage XML. Le document que vous lisez contient un grand +nombre de formules extraites du book, du companion, de la +recommandation MathML, et traduites en XML par le logiciel Tralics. Il est +disponible en HTML et en Pdf.

+

La version HTML est obtenue en utilisant une feuille de style assez simple, +qui laisse les formules de mathématiques inchangées; pour la lire, il +vous faut un navigateur ou un plugin qui sache interpréter le MathML et les +fontes associées pour les symboles et les opérateurs. +La version Pdf a été obtenue grâce au package +xmltex de D. Carlisle (qui fait de un interprète XML), +et un grand nombre de modifications dans le fichier mathml2.xmt, +qui contient le code d'interprétation des mathématiques. Tous les fichiers +nécessaires pour obtenir ce document sont distribués avec le package +Tralics à partir de la version 2.10.

+
Tralics, XML, MathML, mathematics, LaTeX, HTML, PdfTralics, XML, MathML, mathématiques, LaTeX, HTML, Pdf6181Sophia Antipolis – MéditerranéeTHnumApics +Introduction +

The technical reports and describe +some features of the Tralics software, a to XML translator, +and associated tools. In particular, we explain how the XML file +can be converted +to HTML, or to Pdf (using the excellent work of D. Carlisle +and S. Rahtz (, , ). +One application is RalyX (Inria's Annual Activity Report), where all math +formulas are converted to images before inclusion in the HTML document.

+

Recently, the cedram (Centre de diffusion de revues académiques de +mathématiques, http://www.cedram.org/) +has decided to convert the metadata of some collections (including the +Annales de l'institut Fourier) from to HTML, . The +Tralics software has been adapted for this purpose, the idea being the +following: there are nowadays some browsers with a high quality math +renderer, where native MathML formulas are more readable than images; +thus the web site presents each document in two versions, neither of which +containing an image. By default you see something like +L 1 (T), and the alternate version contains +$L^1(\mathbb{T})$. This looks like the source +code, but non-trivial operations are performed, as explained below.

+

There is a torture file that comes with Tralics; the purpose is to make sure +that no error occurs while compiling expressions like \cfrac12, but it is +hard to check that the result is correctly translated. For this reason, we +decided to create a sample file containing, not only all examples of the + companion second edition , but also those of the +book , or the MathML recommendation , +and to convert it to HTML. +Translation is correct if the HTML page prints correctly. This file is +available on the Web, we hope that it will convince you to use the Tralics software, and put your math documents on the Web. We have inserted comments +explaining why some constructions do not work, if you have a solution or +suggestions, please send mail to the author. Additional examples are welcome.

+

We also wanted to make sure that the RalyX still works: more than one hundred +teams use Tralics once a year, asking sometimes silly questions, like: how to +add color to the text, or a page break; the answer is generally either `not yet +implemented, wait for next year', or `incompatible with the Raweb semantics'. +This document uses colors and page breaks, as explained below; no modification +to the translator was needed, but, unless the style sheets are modified, these +additions are ignored.

+

For these reasons we converted the whole +document to Pdf. This was not trivial, especially because of a lack of font +families (this will be discussed later). Note also the format of the +document: in the HTML version all metadata (author, title, abstract, etc.) are +placed at the start of the document by the XML to HTML processor. In the case +of the Pdf version, this was not so easy: something as trivial as +\newpage \null \vskip-2cm is impossible to express in XSL/FO +(said otherwise, all my attempts failed), and I had to add a new element +<vspace> for this purpose.

+

The source file testmath.tex is part of the Tralics distribution; +translating it requires Tralics version 2.10, and some packages, +like amsmath (do not try to include the file amsmath.sty, +this is not possible; you must use amsmath.plt instead). +In most cases we show the source before the translation. There are some +exceptions, for instance we leave as an exercise to find out how we solved +the exercises of the book. +Examples of the companion are available on +the CD that comes with the book.

+

The XML file was converted into HTML, math formulas are left unchanged. +We explain in some cases that what we see is not what we expected. Here +FL means Firefox on Linux (unless specified, it is Firefox 2.0, +on Fedora Core 3) and FM means Firefox on MacIntosh (unless +specified, it is Firefox 2.0 on a PowerBook G4, MacOS 10.4). +We also tested Amaya, bot AM (version 9.55 on Mac) and AL +(version 9.99 on Linux FC5).

+

Installing math fonts for use with a web browser is not always easy: +they are installed as explained on the Mozilla web page, but this page +seems unclear to me: on one Linux machine, Firefox is happy with the fonts, +but uses the wrong font when printing, on another one, Firefox says that fonts +Math1, Math2 and Math4 are missing, but the printed result is correct.

+ +Special features +

You are not supposed to insert page breaks in your document, but if you put +twenty tables in a row, you will get error messages of the form: to many +unprocessed floats, and then you are in trouble. In this case, the only remedy +is to insert some \clearpage commands; in this document, we used the +\xbox command in order to produce an empty <clearpage> element in the +XML document, and we adapted the style sheets.

+

There is a \clearpage before this section; you will not notice it because +there is a natural page break there. On the other hand, it is likely that you +will see the page breaks in Chapter three, but there is no easy solution: +there is no text in the current chapter to fill the gaps. +In order to improve the layout, we changed the ordering of +the figures, starting with tables and , that +occupy a full page, and inserting smaller tables after that. Moreover, +table was too big to fit on a page (the baseline in this +document is much larger than in the companion) and we split it into +two parts. We are happy since this gives 8 full pages with floats, and a +single bad page, the last text page of the chapter.

+

Concerning colors, you can put any attribute you like to any object +(there is no attempt to validate the document against some DTD). +In the case of math formulas, identifiers, numbers and operators accept +some common attributes including font information and colors, these are +currently ignored when converting XSL/FO into Pdf (but this can easily be +changed, it suffices to add some lines +of code to the raweb-cfg.sty file. However, the color attribute is +honored for the <mstyle> element (all symbols appearing in the companion for which no Unicode element has been found are replaced by a + +red +X using this method). +For the text case, the +<inline> element is translated into <span> element in the HTML and a +<fo:inline> element in the Pdf, all attributes are copied; in the previous +sentence we have used

+

\xbox{inline}{\XMLaddatt{color}{#F00000}\XMLaddatt{style}{color:#E00000}red}

+

$\mathbox{mstyle}[color][\#D00000]{X}$

+

\def\UnimplementedOperator#1{\mathbox{mstyle}[color][red]{X}}

+

This example shows that you can use a named color, or one defined in RGB +syntax, using six hexadecimal digits; use sharp or backslash sharp as +indicated here.

+
+Compiling the example file +

These are the options you can use when compiling the file +testmath.tex

+

-noentnames -trivialmath=7 -leftquote=2018 -rightquote=2019 -nozerowidthspace

+

The first option says that you prefer &#x21DA; to &Lleftarrow; +(this is useless if you use an XSLT processor to convert the XML document). +Option `trivialmath=7' says that simple math expressions are translated as +text; option `mathvariant' says that a command like \mathbb should add a +mathvariant attribute; these two options set initial values to some counters, +they are not needed, because the associated file testmath.ult +resets them to the values needed here. Following options are +problematic. If you say `nostraightquotes', this changes the translation of +the apostrophe character to character U+B4, this option produces a nice HTML +file, but the Pdf is not so nice. Here we modify left and right quotes to +U+2018 and U+2019. +If you say `zerowidthspace', Tralics inserts an +invisible character in verbatim mode, that is supposed to inhibit ligatures +when converting the XML file into Pdf file, the trouble is that this character +is shown as a normal space by my browser in certain cases. In Tralics version 2.10, the translation changed: the old behavior can be obtained by +saying -nozerowidthelt. Otherwise an element is created, this element +is transformed into a zerowidthspace character when the document is converted +to Pdf, is omitted when the document is converted to HTML. This means that the +option is useless.

+

The following files are needed for the compilation:

+ +

a configuration file, that +behaves like the default one; namely one that defines the root element to be +<std> and the dtd file to be classes.dtd;

+
+

the source file testmath.tex, and the associated +testmath.ult file;

+
+

the class file report.clt (and the auxiliary file +std.clt);

+
+

the standard math packages amsmath.plt, amscd.plt, +delarray.plt, amsxtra.plt, amsgen.plt, +amsbsy.plt, amsopn.plt;

+
+

the file fancyvrb.plt for the special verbatim mode; and

+
+

the file RR.plt for the meta data.

+
+

When converting the document to HTML, we use the `xsltproc' program. The style +sheet is testmathhtml.xsl; this is a short style sheet; but it +needs cls.xsl and RR.xsl. Conversion to XSL/FO uses +RRfo.xsl as style sheet, it needs clsfo.xsl, that +includes raweb3-param.xsl, rrrafo3.xsl, +clspages.xsl, RRfosimple.xsl, +clsfotable.xsl. Note: this list is likely to change; we have +to separate clearly the RA (activity report), the RR (research report) and CLS +(standard classes). All these files are in the directory xml or +styles of the Tralics distribution, but the XSLT processor wants +to see them in the current directory.

+

Conversion from XSL/FO to pdf is achieved by compiling the file +wtestmath.tex containing the following lines

+

1 \def\xmlfile{testmath.fo}

+

2 \def\LastDeclaredEncoding{T1}

+

3 \input{xmltex.tex}

+

4 \end{document}

+

It requires xmltex.tex and other files from the xmltex +distribution, so that you must install these files first. +There are some bugs or incompatibilities in +the fotex distribution, so that you must use the two files +fotex.xmt, fotex.sty as distributed in the xml +directory. Additional required files are fotex-add.sty, +raweb-uni.sty, and fotex.cfg. +Finally the file wtestmath.cfg should be a +symbolic link to raweb-cfg.sty.

+
+Overview of math mode +

The main change between Tralics version 2.9 and 2.10 concerns handling of +math formulas. Two steps are required for processing them: first a tree is +created, after that, it is converted. This mechanism is similar to the +behavior of , but some details are not yet implemented, and some +information is lost (for instance, \mathbin is a command that says that +the object that follows should be of type `binary'; this information is used +by the program, but the resulting XML tree does not contain this information +(we cannot simply add an attribute pair class=bin to the object).

+

When Tralics sees a math formula, it constructs recursively a tree, also +called a math list. +The action after a token has been read is the following: +If the token is expandable (a user defined command for instance), expansion +takes place, this can read some tokens, it can add new tokens to the stream +(to be read again). +If the token is a mode-independent command it will be executed (for instance, +you can change the meaning of some commands). Otherwise, the token is added +to the tree, but there are some exceptions. The easy case is when a whole +subtree is read, for instance when the token is a left brace, a \begin +command, etc. In some cases, the execution level is incremented (said +otherwise, the +behavior is the same as a group defined by braces in non-math mode). In a case +of \begin, a token list is read, and the behavior depends on whether +this is a user defined environment (normal expansion rules apply), or a +built-in one. Most built-in environments are matrix-like, and each cell is +evaluated in a group; this has the following consequence: if the math formula +contains an unwanted ampersand character, an error will be signaled when that +character tries to finish the cell-group (because the current group is of type +math), and an error is signaled at the end of the math expression (because the +ampersand character has added a second group after the first, a cell-group, +where the end-of-math character expected a math-group). A third error will be +signaled later: when the tree is converted into a MathML object, Tralics may +complain about non-math tokens in the expression. +A font change command like \mathbb +changes the internal state and adds two tokens to the tree, one that selects +the blackboard font (before the argument) and a token that selects the current +font (after the argument).

+

In the case of $L^1(\mathbb{T})$ +the tree has eight nodes. One is a +subtree, containing the argument of the command. They are six +characters, and two commands (select double-struck font, or select normal +font). When the tree is converted into a MathML expression, some nodes are +converted to basic XML elements (the letters), some are ignored (the font +change commands), and others are used to construct an XML tree. +We shall see later that parentheses, braces, and tokens like that can induce +<mrow> elements; translation of the hat character is non-obvious, because +MathML provides <msub> and <mover> as possible translations; a command +like \nolimits placed after a token is an indication for the translation +of the hat that follows. When the tree is converted the current style is looked +at, this quantity depends on the position in the tree (the style of the +numerator of a fraction or the style of an exponent after the hat is smaller +than the current style, while the style of the numerator of a \cfrac is +always text style) or the presence of style change commands. Some commands +depend on the style (for instance \mathchoice) and are conditionally +interpreted.

+

The characters in the formula above are of type letter (L, T), or type +non-letter (the digit, or the parentheses), or other (the hat). An interesting +question is: +what happens if the single L (or any other character) is replaced by a double +one? A first answer is that this just adds a new token to the tree (there is +a special case: ^^1 is a non-obvious way to represents the +character q). Spaces are ignored, so that doubling them has no effect. +Two hat characters in a row signal an error (assume for instance that a space +between them inhibits the double-hat feature mentioned above). Two consecutive +new line characters are replaced by \par, this is illegal. +Characters that are neither letters nor digits generally translate to a +<mo> element. No attempt is made to convert two plus characters into a +double plus character (some people use `:=' as an operator, meaning `is equal +by definition', and expect no white space between the two +characters). In a case like \sqrt\frac{1}{2}, +where we have two consecutive commands that take arguments, the argument of +the root operator is the fraction operator, not the full fraction (this +expression is accepted by , as an unexpected consequence of the +implemented of the fraction operator that provides that braces that delimit +the argument of the square root, it is rejected by Tralics).

+

The superscript and subscript operators (generally associated to +hat and underscore characters) are hybrid commands: most commands, for +instance \frac, are prefix commands (they come before their arguments), a +few commands, like \over, are infix operators (the first argument is +before the operator). In the case of hat, there is one argument after the +operator, but the operator acts on the kernel that is to its left +(in the example the kernel is L, but a kernel can have an index and an +exponent, so that the order of tokens can be: kernel, underscore, index, hat, +exponent). +Translation of character L is a <mi> element; Tralics tries to +converts LL or TT into a single element, according to the following rule. +Assume that \T is defined to be \mathbb{T} and \TT +is defined to be \mathbb{TT}. Then \TT produces a single +element with two characters, while \T\T produces two elements with a +single character. On the other hand, a strange rule of MathML says that the +font used for a <mi> element (that lacks font attributes) depends on the +number of characters in it; for this reason, in a formula like xy, the +translation is a sequence of two <mi> elements, without attributes, +containing a single character (implicit product). In a case like 17, a +single <mn> element is constructed, because this represents a number (in a +case like x 12 , an implicit comma could be added in the case where the +expression refers to row 1 column 2 of the matrix x; however, do not expect +such a behavior in a near future). The source code of the expression above is +$x_{12}$. Without the braces, the translation is x 1 2 +(if you do not see the difference, there is a bug somewhere).

+

If the internal counter \@nomathml is negative, the tree is converted to +a character string in a trivial manner; in a case like +\cfrac12, you will see \cfrac{1}{2}, because we +have a sub-tree with two nodes (the two arguments of the command). In reality, +the command takes an optional argument, and its value is printed only if it is +not empty. In a case like L 1 (T), you will see two font changes +as explained above. If you want to see the characters \mathbb there are +two solutions: the easy one works only since version 2.10: +Tralics inserts in the tree all commands that behave like +\relax; these commands are ignored when converting the tree into a MathML +expression, but the name is used otherwise; thus \let \mathbb +\relax does the job. Otherwise, it suffices to redefine \mathbb in +order to expand to the desired string (using \string for instance). +Note: since version 2.10, a font change command that takes an argument defines +a semi-simple group, by inserting \begingroup and \endgroup commands.

+
+Examples from the TEXbook +Typing math formulas, TB 16 +

The book starts slowly; first Knuth explains that math formulas are +enclosed in special math brackets, dollar signs. He also says that +spaces are ignored in math mode.

+

1 `$x$', `$2$', `$ x$', `$ 2 $',

+

2 `$(x + y)/(x - y)$', `$(x+y) / (x-y)$'

+

Easy formulas: `x', `2', `x', `2', +`(x+y)/(x-y)', `(x+y)/(x-y)'.

+

We show here some Greek letters, and some other symbols:

+

3 $\Gamma, \nu,\kappa$,

+

4 $\phi,\emptyset, \epsilon,\in,\approx,\mapsto$

+

5 $(\phi,\theta,\epsilon,\rho)$,

+

6 $(\varphi,\vartheta,\varepsilon,\varrho)$,

+

7 $$\alpha, \beta, \gamma, \delta.$$

+

Greek letters Γ,ν,κ, and other symbols: +ϕ,,ϵ,,,; +standard GreekAM does not show the epsilon letters, (ϕ,θ,ϵ,ρ), +and variants (φ,ϑ,ϵ,ϱ), +a display math formula:

+α,β,γ,δ. +

8 \begingroup

+

9 \catcode`\*=3

+

10 *x^2*, \( x_2\), \begin{math}\Sigma\end{math}

+

11 **A** \[ B\] \begin{displaymath} C \end{displaymath}

+

12 \endgroup

+

We show here that any character of category code 3 can be used as math +delimiter: +x 2 , as well as two alternative ways introduced by : +x 2 , Σ. We show that display math can be +entered by doubling the character of category 3 (actual rules are more +complicated, see the Book), or using a environment (additional +environments will be explained in later chapters), or using brackets. +Note that brackets are very useful, because they are so easy to type.

+A +B +C +

Exercise 16.1: γ+νΓ.

+

Exercise 16.2: \le,\ge,\ne, +\leq,\geq, and \neq: +,,, +,,.

+

Complex formulas with superscripts(up high) and subscripts +(down low).

+

13 $x^2$, $x_2$, $2^x$, $x^2y^2$, $x ^ 2y ^ 2$, $x_2y_2$, $_2F_3$,

+

14 $x^{2y}$, $2^{2^x}$, $2^{2^{2^x}}$, $y_{x_2}$, $y_{x^2}$.

+

Translation x 2 , x 2 , 2 x , x 2 y 2 , x 2 y 2 , x 2 y 2 , 2 F 3 , +x 2y , 2 2 x , 2 2 2 x , y x 2 , y x 2 .

+

Consider now the following two formulas:

+

15 $((x^2)^3)^4$,  ${({(x^2)}^3)}^4$.

+

Translation of the first formula

+

16 <formula type='inline'>

+

17   <math xmlns='http://www.w3.org/1998/Math/MathML'>

+

18     <mrow>

+

19       <mo>(</mo>

+

20       <mo>(</mo>

+

21       <msup><mi>x</mi> <mn>2</mn> </msup>

+

22       <msup><mo>)</mo> <mn>3</mn> </msup>

+

23       <msup><mo>)</mo> <mn>4</mn> </msup>

+

24     </mrow>

+

25   </math>

+

26 </formula>

+

Translation of the second formula

+

27 <formula type='inline'>

+

28   <math xmlns='http://www.w3.org/1998/Math/MathML'>

+

29     <msup>

+

30       <mrow><mo>(</mo>

+

31         <msup>

+

32           <mrow>

+

33             <mo>(</mo>

+

34             <msup><mi>x</mi> <mn>2</mn> </msup>

+

35             <mo>)</mo>

+

36           </mrow>

+

37           <mn>3</mn>

+

38         </msup>

+

39         <mo>)</mo>

+

40       </mrow>

+

41       <mn>4</mn>

+

42     </msup>

+

43   </math>

+

44 </formula>

+

The current Tralics uses some hacks, so that the translation is actually +different. You will get first ((x 2 ) 3 ) 4 , second +((x 2 ) 3 ) 4 , third +((x 2 ) 3 ) 4 , and fourth ((x 2 ) 3 ) 4 . Here the first two formulas +correspond to the XML fragment shown above (they were produced by prefixing +each parenthesis with \mathord, and after that we have the +actual translation. The MathML +recommendation says that some operators are stretchy, so that the width +and height can depend on the context. This is not the case in xmltex, so +that, in the Pdf version, all parentheses have the same size. The \mathop +prefix tells Tralics to not consider parentheses as stretchy, so no hack is +applied. We shall not explain the hack here; moreover we modified it in +version 2.10.8. We originally wrote +All parentheses have the same size in the pdf version, the same is true for +the HTML +version in the first formula. Now, the <mrow> elements delimit a scope, +so that inner parentheses are smaller than outer parentheses (but only for +HTML, second formula); note that the placement of the exponent depend on the +context, so that, in the second formula, all three superscripts at placed at +different positions. +In the case of the first formula, placement of the +exponent depends only on the the size of the parentheses (hence, in the Pdf +version, they should be aligned, in the HTML version, they are not). +Firefox on Mac shows the following: all superscript are aligned. Big +parentheses are used but for case 2. Amaya shows only small parentheses, +scripts are not aligned, but this is hard to see.

+

The MathML recommendation says that the second alternative is +better; but Knuth says: +“The first alternative is preferable, because it is much easier to type, and +it is just as easy to read.â€

+

45 `${}_2F_3$', `${_2}F_3$', `${_2F_3}$'

+

Exercise 16.3: Three ways to have an empty kernel: +` 2 F 3 ', ` 2 F 3 ', ` 2 F 3 '. The translation is the same in all +cases because of the following two rules: if a math list starts with a +subscript or superscript operator, an empty math list is added before, it +serves as +kernel (thus, braces in the first example are useless); +a math list is packaged by putting it in a <mrow> element, unless +the list has one element (in the second example, there are two tokens between +the braces, converted to a single <msub> element, the math list has a +single element, braces are useless). In these two cases, the main math list +has two <msub> elements, and a <mrow> is added. In the last case, the +main math list has a single element, a <mrow>, thus, no <mrow> is +added and braces are useless.

+

46 `$x+_2F_3$' and `$x+{}_2F_3$'.

+

Effect of braces after plus sign: +`x+ 2 F 3 ' and `x+ 2 F 3 '. The MathML recommendation says that the distance +between the plus sign and the letter F should be the same in both cases; in the +first case, index 2 is attached to the plus sign, in the second case to the +letter F (AM shows both formulas with index attached to F).

+

47 ${x_2}_3$, $\displaystyle {\sum}'$

+

Note that an <mrow> element is added for a +math list with a single element in the case where it is followed by a +subscript or a subscript. Reason one: in a case like x 2 3 , you will get +an error if braces are omitted; in the same fashion, an error is signaled +(when converting to Pdf) if <mrow> is missing. Reason two, in a case like + ' , the apostrophe is not placed above the sum if there +is a <mrow> (the sum operator has type Op, but not the group, unless there +is a \mathop before it).

+

Exercise 16.4: Double superscript, x y z , x y z .

+

48 $x^2_3$, $x_3^2$, $x^{31415}_{92}+\pi$, $x_{y^a_b}^{z_c^d}$.

+

49 $P_2^2$ and $P{}_2^2$.

+

Simultaneous superscripts and subscripts x 3 2 , x 3 2 , +x 92 31415 +π, x y b a z c d .

+

Vertical alignment: P 2 2 and P 2 2 . In the first case, scripts are +attached to the letter P, and alignment can depend on the slant of the letter. +(Amaya has extra space in the second formula).

+

50 `$\prime$', $y_1^\prime$, $y_2^{\prime\prime}$, $y_3^{\prime\prime\prime}$,

+

51 $f'[g(x)]g'(x)$, $y_1'+y_2''$, $y'_1+y''_2$, $y'''_3+g'^2$

+

Primes and shorthand: +`', y 1 , y 2 , y 3 , +f [g(x)]g (x), y 1 +y 2 , y 1 +y 2 , y 3 +g 2 . +In the code shown here, the character used as delimiter for XML attributes is +character U+39, the quotes around the math formulas are U+60 and U+B4 (this +character can be changed via an option of the program, in verbatim mode it is +always U+39, straight quote). +The +prime character used in the formula is U+2032. This is not the right character. +Thus, in Tralics 2.9.5, translation of prime changed, it is now +character U+39. The same formula is now: +`'', y 1 ' , y 2 '' , y 3 ''' , +f ' [g(x)]g ' (x), y 1 ' +y 2 '' , y 1 ' +y 2 '' , y 3 ''' +g '2 . It is unclear +whether this is the good solution. It seems that Firefox uses the same font +metrics as , i.e., a very large prime character that has a normal size +when used at script size, while Amaya uses a normal size prime, that is small +when used as a superscript. In the case of f-prime, the slant of the letter is +not taken into account by Amaya, and the prime sign is hard to see.

+

52 $x\varprime y^\varprime, x\Prime y^\Prime,

+

53 x\tprime y^\tprime,x\bprime y^\bprime,x\qprime y^\qprime$

+

The amsmath package provides the symbols shown above; as you can see (at least +with FM), these characters are not meant +to be used as an exponent: +xy ,xy ,xy ,xy ,xy . +Note that \qprime is unkown to Amaya, and the prime subscript in the +following exercice is hard to see.

+

Exercise 16.5: F ' (w,z)=F(w,z)/z and F ' (w,z)=F(w,z)/w.

+

54 \let\none\mmlnone

+

55 $R_i{}^{jk}{}_l$ versus $\mathbox{mmultiscripts}{Ri\none\none jk \none l\none}$

+

Exercise 16.6: +R i jk l versus Rijkl +(MathML example, section 3.4.7.2, only second index raised).

+

56 $\sqrt 2$, $\sqrt{x+2}$, $\underline4$, $\overline{x+y}$,

+

57 $\overline x+ \overline y$, $x^{\underline n}$, $x^{\overline{m+n}}$,

+

58 $\sqrt{x^3+\sqrt\alpha}$

+

Translation 2, x+2, 4 _, x+y , +x +y , x n _ , x m+n , +x 3 +α. +There are problems with underline and overline on FM. Vertical +position is not always good, and the length is sometimes incorrect. On the +fifth formula, rules are sometimes invisible in the printed version. +There is a text version in Tralics: +Mfoo _, Tfoo, +Mfoo , Tfoo, +Mfoo _ , Tfoo.

+

59 $\root 3 \of 2$, $\root n \of {x^n + y^n}$, $\root n+1 \of a$,

+

60 $\sqrt[3]{2}$, $\sqrt[n]{x^n + y^n}$, $\sqrt[n+1]a$, `$\sqrt[3]{~~}$'.

+

Translation +2 3, x n +y n n, a n+1, +2 3, x n +y n n, a n+1, ` 3'.

+

61 $\sqrt{\mathstrut a} + \sqrt{\mathstrut d} + \sqrt{\mathstrut y}$,

+

62 $\sqrt{a} + \sqrt{d} + \sqrt{y}$,

+

63 $\overline{a} + \overline{d} + \overline{y}$,

+

64 $\overline{\mathstrut a} + \overline{\mathstrut d} + \overline{\mathstrut y}$.

+

Translation (a+(d+(y, +a+d+y, +a +d +y , +(a +(d +(y .

+

Exercise 16.7: 10 10 , 2 n+1 , (n+1) 2 , 1-x 2 , +w+z , p 1 e 1 , a b c d e , +h n '' (αx) 3.

+

Exercise 16.8: Ifx=y,then x is equal to y. (this exercise says what you +should not do).

+

Exercise 16.9: Deleting an element from an n-tuple leaves an (n-1)-tuple.

+

Exercise 16.10: Letters with descenders are Qfgjpqy.

+

65 $x+y-z$, $x+y*z$, $x*y/z$

+

Basic binary operators: x+y-z, x+y*z, x*y/z.

+

66 $x\times y\cdot z$, $x\circ y\bullet z$, $x\cup y\cap z$,

+

67 $x\sqcup y\sqcap z$, $x\vee y\wedge z$, $x\pm y \mp z$.

+

68 Aliases   $x\land y\lor z$.

+

Many more binary operators +x×y·z, xyz, xyz, +xyz, xyz, x±yz. +Aliases xyz.

+

69 $x=+1$, $3.142-$, $(D*)$

+

70 $x=\mathmo[form][prefix]{+}1$

+

71 $3.142\mathmo[form][prefix]{-}$

+

72 $(D\mathmi[mathvariant][normal]{*})$

+

73 $(D\mathmo[lspace][0][rspace][0]{*})$

+

Binary as ordinary symbols: x=+1, 3.142-, (D*). +The HTML version is slightly different from the version. +You can declare the plus sign as prefix operator, this gives +x=+1, you can define the minus sign as prefix +operator, this gives 3.142-. Removing the space around +the star is more complicated, a solution consists of using an identifier in +upright variant like this (D*), or by setting +the lspace and rspace attributes to zero: +(D*).

+

74 $K_n^+,K_n^-$, $z^*_{ij}$, $g^\circ\mapsto g^\bullet$, $f^*(x)\cap f_*(y)$

+

Binary operators in superscripts +K n + ,K n - , z ij * , g g , f * (x)f * (y).

+

Exercise 16.11: z *2 and h * ' (z).

+

75 $x=y>z$, $x:=y$, $x\le y\ne z$, $x\sim y\simeq z$, $x\equiv y\not\equiv z$,

+

76 $x\subset y\subseteq z$

+

x=y>z, x:=y, xyz, xyz, +xy\notz, +xyz. In the Pdf version there is no space between the +colon and the equals sign, but the HTML version shows some, because the rules +are not the same for and MathML. The best solution would be to use a +single operator instead of two consecutive ones; the user can define a command +\coloneq that behaves like colon-eq in normal , or Tralics could be +modified in order to recognise sequences like this. Translation of \not is +problematic: in this document we consider it as an undefined operator, and you +see a red X. We should add rules like: \not= should give \ne.

+

77 $f(x,y;z)$, $f:A\to B$, $f\colon A\to B$

+

78 %\def\colon{\mathmo[lspace][0]{:}}

+

Punctuation f(x,y;z), f:AB, f:AB. Note that \colon is +a colon with lspace = `0pt', but the attribute is ignored in the Pdf +version. It seems that Amaya uses a zero lspace by default.

+

79 $12,345x$, $12{,}245x$, $\mathcn{12,345}x$, $\mathmn{12,345}x$

+

12,345x, 12,245x, 12,345x, 12,345x. The translation +of the first two expressions is the same, braces are useless here. A silly +bug of my F browser: the second digit of the first number disappears; this does +not happen if the number is not the first word of a paragraph (this is why the +sentence starts with a number). You should use +one of the last two variants if you want the sequence of digits plus the comma +to be considered as a number.

+

Exercise 16.12: 3·1416, but \mathmn{3^^b71416} gives +3·1416 (less space in the HTML version).

+

80 $\hat a$, $\check a$, $\tilde a$, $\acute a$, $\grave a$, $\dot a$,

+

81 $\ddot a$, $\breve a$, $\bar a$, $\vec a$

+

82 \def\ihat{{\hat \imath}} \def\jhat{{\hat\jmath}} $\ihat$, $\jhat$

+

a ^, a ˇ, a ˜, a ´, a `, a ˙, +a ¨, a ˘, a , a , + ı ^, ȷ ^. +Character \jmath is a normal j, because there is no dotless j in most +fonts. There is also a problem with the rendering of grave accents on FM.

+

83 $\hat{I+M}$, $\bar z+ \overline z$, $\widehat x, \widetilde x$,

+

84 $\widehat{xy}, \widetilde{xy}$

+

85 $\widehat{xy}, \widetilde{xy}$

+

86 $\widehat{xyz}, \widetilde{xyz}$

+

87 % $\ghat\in{(H^{\pi_1^{-1}})}' -> Ex16.13 below

+

Large accents +I+M ^, z +z , x ^,x ˜, +xy ^,xy ˜, +xy ^,xy ˜, +xyz ^,xyz ˜. As you can see, there is no difference +between wide and non-wide operators. My browser (AM as well as FM) shows a small hat, and a +variable length tilde. For the Pdf version, we have decided to use the +variable size variant.

+

Exercise 16.13: e -x 2 , Dp α M+l, g ^(H π 1 -1 ) ' , +(braces added), +g ^(H π 1 -1 ) ' (without braces). In Tralics 2.11, there shuld +be no difference between the version with and without braces.

+
+More about Math, TB 17 +

88 $$ {1\over 2}\qquad {\rm and}\qquad {n+1 \over 3} \qquad {\rm and}\qquad {n+1

+

89   \choose 3}\qquad {\rm and}\qquad \sum_{n=1}^3Z_n^2. \label{eq17.1}$$

+

90 \[ \frac{1}{2}\qquad \text{and}\qquad \frac{n+1}{3} \qquad \text{and}\qquad

+

91 \binom{n+1}{3}\qquad \text{and}\qquad \sum_{n=1}^3Z_n^2.\label{eq17.2}\]

+

Example of vertical alignment. Translation of the first three expressions is a +<mfrac> element, subexpressions are in text style (normal size). In the +case of the last expression scripts are in script style (small size) and we +have a <munderover> element for the sum (it is an operator with limits in +display style) and a <msubsup> element for the Z (that is not an operator).

+1 2 and n+1 3 and n+1 3 and n=1 3 Z n 2 . +

The same, using syntax

+1 2andn+1 3andn+1 3and n=1 3 Z n 2 . +

92 \[{x+y^2\over k+1},\qquad {x+y^2\over k}+1,\qquad

+

93 x+{y^2\over k}+1,\qquad x+{y^2\over k+1},\qquad x+y^{2\over k+1}\]

+

94 \[\frac{x+y^2}{k+1},\qquad \frac{x+y^2}{k}+1,\qquad

+

95 x+\frac{y^2}{k}+1,\qquad x+\frac{y^2}{k+1},\qquad x+y^{\frac{2}{k+1}}\]

+

Single over. The only difference in these expressions is the placement of the +braces.

+x+y 2 k+1,x+y 2 k+1,x+y 2 k+1,x+y 2 k+1,x+y 2 k+1 . +

style: this uses a command with two arguments, that behaves without +surprise.

+x+y 2 k+1,x+y 2 k+1,x+y 2 k+1,x+y 2 k+1,x+y 2 k+1 . +

96 \[{ {a \over b}\over 2} \qquad \text{and}\qquad { a\over {b\over 2}}

+

97 \qquad \text{and}\qquad { a/ b\over 2} \qquad \text{and}\qquad { a\over b/2}

+

98  \]

+

99 \[ \frac{\frac{a}{b}}{2} \qquad \text{and}\qquad \frac{a}{\frac{b}{2}}

+

100 \qquad \text{and}\qquad  \frac{a/b}{2} \qquad \text{and}\qquad \frac{a}{b/2} \]

+

Double over. It is an error if you say A over B over C without adding +braces. As you can see, if a fraction is in text style, its numerator and +denominator are in script style, so that it is sometimes better to use a slash.

+a b 2anda b 2anda/b 2anda b/2. +

style (nothing special here).

+a b 2anda b 2anda/b 2anda b/2. +

Exercise 17.1: Compare x+y 2 k+1 with x+y 2/(k+1) . If a fraction is +in script style, its numerator and denominator are in script script style, +i.e. smaller. In , there are four styles and three sizes (display style and +text style have the same size). In MathML, the size is defined by a level, +zero, one, or two, but larger levels are possible; thus more than three sizes +are possible. There is however a minimal font size.

+

Exercise 17.2: Compare a+1 b+1x with ((a+1)/(b+1))x.

+

Exercise 17.3: Wrong use of \over in x=(y 2 k+1).

+

Exercise 17.4: 71 2¢, using the \textcent command.

+

Exercise 17.5: Same as in the book, but not cramped.

+

101 \[n+\scriptstyle n + \scriptscriptstyle n\]

+

102 \[n+{\scriptstyle n + {\scriptscriptstyle n}}\]

+
+n+n+n +n+n+n +

Note: In the current version of Tralics, it is unclear what happens when you +put style commands randomly in a math formula; in any case, Tralics uses the +correct math style, but has difficulties in inserting <mstyle> +elements: what is the scope? Currently such an element is added to the current +math list, if it contains a style change command; in the example above, +we have two such commands, thus three different styles, +and a single list (first example) or three lists (second example). +Translation of the first example is wrong, translation of the second example is +correct because the style command is the first token of the +listAmaya seems to ignore the style attribute.

+

103 \[a_0+{1\over\displaystyle a_1 +

+

104   {\strut 1\over\displaystyle a_2+

+

105     {\strut 1\over\displaystyle a_3+

+

106        {\strut 1\over a_4}}}}\]

+

Translation

+a 0 +1 a 1 +(1 a 2 +(1 a 3 +(1 a 4 +

Without \displaystyle

+a 0 +1 a 1 +(1 a 2 +(1 a 3 +(1 a 4 +

+Without \strut. Since a \strut is an invisible object of the size of +a parenthesis, more or less the size of the digit one, its effect is hard to +see.The width of the strut should be zero; this is incorrectly +rendered by Amaya, that shows a non-centered numerator; there is also +additional space in the formulas before exercide 16.7

+a 0 +1 a 1 +1 a 2 +1 a 3 +1 a 4 +

+Without both

+a 0 +1 a 1 +1 a 2 +1 a 3 +1 a 4 +

Until version 2.9.4, commands of the form \hfill were illegal in math +mode. Since then, they are allowed as first or last element in arguments of +commands like \overline. They are ignored, unless the result is a +fraction; we demonstrate here that \hfill placed at the end of the list +produces a left alignment, in the case of \over, \genfrac, or +\frac. Note that the \cfrac command can be used for continued +fractions: its optional argument says whether the numerator is centered, left +aligned or right aligned, under the assumption that the denominator is much +larger than the numerator.As previously, the struts induce unwanted +space in Amaya.

+a 0 +1 a 1 +(1 a 2 +(1 a 3 +(1 a 4 12345 11 12345 +

107 \[ {x\atop y+2}, {n \choose k}, \text{latex},

+

108 \genfrac{}{}{0pt}{}{x}{y+2},\binom{n}{k} \]

+

The \atop construction is like \over, without fraction rule; you +should not use it in , you should use \genfrac instead. The command +\atopwithdelims (see below for an example) is followed by two delimiters, +say A and B, it puts A before the fraction and B after it. You can use +\genfrac with A and B as arguments (third argument is line thickness, +fourth argument is style). The \choose +command is nothing else than \atopwithdelims(). You should not use it.

+x y+2,n k,latex,x y+2,n k +

109 \[{ {n\choose k}\over 2} \text{ or } { n\choose{k\over2} }

+

110 \text{ or } { n\choose k/2} \text{ or } {n\choose{1\over2}k}\]

+

As mentioned above, a construction like A over B over C needs braces, +where over is a generic name for \over and variants, including +\choose. Nothing special is required for \frac or \binom, so +that variant is omitted.

+n k 2orn k 2orn k/2orn 1 2k +

111 %%$${1\over2}{n\choose k}$$; $$\displaystyle{n\choose k}\over2}$$ : TeXbook

+

112 $\displaystyle \frac{1}{2}\binom{n}{k}$,

+

113 $\displaystyle{n\choose k}\over \displaystyle 2$,

+

114 $\dfrac{\dbinom{n}{k}}2$.

+

115 {\def\P{\mathchoice{D}{T}{S}{SS}}

+

116 $\displaystyle{\P\choose \P}\P\over \displaystyle \P$,

+

117 $\dfrac{\dbinom{\P}{\P}\P}\P$.}

+

Exercise 17.6: 1 2n k and +n k 2; version +n k 2; version with \P: + +T TD D, +T TT T. +Note that the `d' in \dfrac or \dbinom +means that the expression is in display style, hence numerator and +denominator are in text style; as a consequence the \choose is same as the +\dbinom; on the other hand, the \over produces a fraction in text +style, with numerator and denominator in display style, while the \dfrac +produces a fraction in display style, with numerator and denominator in +text style. In the dvi file, the distance between D and the fraction rule is +the same as the width of the rule, and the distance between the T and the +rule is approximatively one third of the height of the T; my HTML FM browser uses +larger values, making the difference more obvious.

+

Exercise 17.7: p 2x 2 y p-2 -1 1-x1 1-x 2 . +Fine space added for legibility.

+

118 \[{\displaystyle{a\over b}\above3pt\displaystyle{c\over d}}

+

119 \text{~~and~~} \genfrac{}{}{3pt}{}{\dfrac{a}{b}}{\dfrac{c}{d}}\]

+

There are six operators that behave alike: \over, \atop and +\above, and the same with delimiters. The `above' commands read a +dimension, the thickness of the fraction rule. In the current version of +Tralics, this has better to be explicit (if you want the value of +\parskip, you must use \genfrac).

+a b c danda b c d. +

120 ${\displaystyle \sum x_n}, {\textstyle \sum x_n},

+

121 {\scriptstyle \sum x_n}, {\scriptscriptstyle \sum x_n}$

+

Different sums x n ,x n ,x n ,x n . The position of the +index is unaffected by the style.

+

122 \[ {\displaystyle \int_{-\infty}^{\infty} \sum_{n=1}^m},

+

123 {\textstyle \int_{-\infty}^{\infty} \sum_{n=1}^m},

+

124 {\displaystyle\int\limits_0^{\frac{\pi}{2}} \sum\nolimits_{n=1}^m} \]

+

This example demonstrates that the position of scripts depends on the style if +the kernel is a math operator, and the presence of key words like `limits', +`nolimits' or `displaylimits'. Scripts can be added to a MathML object using +m/sub/sup, and for an operator using m/under/over. In this last case, the +attribute movablelimits corresponds to the `displaylimits' keyword. If set, +`under' means `sub' if the style is not display. Tralics uses `under' or +`sub', depending on where the indices should be placed, and never sets the +attribute. On the other hand, when typesets a `under' or `sub', it +sometimes uses a wrong strategy. The last expression (display style sum +without limits) uses a \msubsup element; in this case, there is an +implicit \nolimits, we cannot make it explicit, because such a command +has to follow an operator, and there is no easy way to check that the first +child of the element is an operator (it is easy to see that it is a <mo> +element, a bit more complicated to see that it contains a Unicode character, +and quite impossible to say that its translation leaves in state where +\nolimits is allowed). Note also that we could convert the argument to an +operator, but this is not always a good idea. In this example the HTML version +is correct, the Pdf version is wrongAmaya places the π/2 too low.

+ - n=1 m , - n=1 m , 0 π 2 n=1 m +

125 \[\lim_ax+\lim\nolimits_l x+\lim\limits_ax+\lim\displaylimits_ax\]

+

126 \[\textstyle \lim_lx+\lim\nolimits_l x+\lim\limits_ax+\lim\displaylimits_lx\]

+

127 \[\sin_lx+\sin\nolimits_l x+\sin\limits_lx+\sin\displaylimits_ax\]

+

128 \[\textstyle \sin_lx+\sin\nolimits_l x+\sin\limits_lx+\sin\displaylimits_lx\]

+

More about limits. Knuth says that \nolimits\limits produces limits; +so that \sin\limits produces limits; a special feature of amsmath +is that the token that follows the \sin is ignored if it is a +\limits token. +According to amsmath, an index A should be below the operator, an index L is a +normal subscript; the example here shows that Tralics behaves more like .

+lim a x+lim l x+lim a x+lim a x +lim l x+lim l x+lim a x+lim l x +sin l x+sin l x+sin l x+sin a x +sin l x+sin l x+sin l x+sin l x +

129 \[\operatorname*{sin}_a \operatornamewithlimits{sin}_a \qopname\relax{n}{sin}_a

+

130 \operatorname{sin}_l  \qopname\relax{o}{sin}_l

+

131 \mathop{\rm sin}_a\mathop{\rm sin}\limits_a\]

+

132 \[\textstyle\operatorname*{sin}_l \operatornamewithlimits{sin}_l

+

133  \qopname\relax{n}{sin}_l\operatorname{sin}_l  \qopname\relax{o}{sin}_l

+

134 \mathop{\rm sin}_l\mathop{\rm sin}\limits_a\]

+

These are commands that can define operators like sin or lim:

+sin a sin a sin a sin l sin l sin a sin a +sin l sin l sin l sin l sin l sin l sin a +

135 \[\sum_{\scriptstyle0\le i\le m\atop\scriptstyle0<j<n}P(i,j)\qquad

+

136 \sum_{\stackrel{0\le i\le m}{0<j<n}}P(i,j)\]

+

In the first expression given here, and in exercise 17.9 that follows, scripts +use an explicit `script style' command, hence should be typeset in scriptstyle +size. This is not the case in the HTML version: we have an atop in an atop, +and the style of the inner one is wrong. The second formula uses a command, this is not the right command for stacking indices because the first +argument uses a smaller style than the second. It seems to me that the top +line of first formula, bottom line of the second formula have the right +size. Other lines are too big (in Firefox) or much too small (in Amaya).

+ 0im 0<j<n P(i,j), 0<j<n 0im P(i,j) +

Exercise 17.8: i=1 p j=1 q k=1 r a ij b jk c ki .

+

Exercise 17.9: + + 1in 1jq 1kr a ij b jk c ki or + 1in 1jq 1kr a ij b jk c ki .

+

137 \[\sqrt{1+\sqrt{1+\sqrt{1+\sqrt{1+\sqrt{1+\sqrt{1+\sqrt{1+x}}}}}}}\]

+
+1+1+1+1+1+1+1+x. +

138 \[ \left(\left[\left\lbrack a\left\{\left\lbrace\left\lfloor b

+

139 \left\lceil\left\langle\left/ c\left|\left\|\left\uparrow d

+

140 \left\downarrow\left\updownarrow\frac 12 \right\Updownarrow

+

141 \right\downarrow t

+

142 \right\Uparrow\right\Vert\right\vert x\right\backslash\right\rangle

+

143 \right\rceil y \right\rfloor\right\rbrace\right\} z\right\rbrack\right]\right)\]

+
+abcd1 2txyz +

We would expect all delimiters to be of the same size; but not all characters +can be indefinitely extensible. On Firefox, we see a large slash, reverse +slash and angle brackets; all other characters have maximum size. On Amaya, +slash and reverse slash have a normal size, as well as double vertical bars; +on AM some delimiters are replaced by a question sign, namely floor, +ceiling, angle brackets, reverse slash and arrows (on following formulas, +arrows are however visible). AF uses floor instead of ceiling and vice-versa. +On FM the rendering of up-down-array is wrong.

+

There are problems with slash, backslash, double vertical bar on Tralics 2.9.4. Concerning the double vertical bar, the following expression contains +two different characters: =. The first +character is Unicode U+2016 (entity &Vert; in the file +mmlalias.ent), obtained by \Vert in Tralics 2.9.4, accessible +as \@Vert in following versions, it is not shwon by Amaya; +the second character is Unicode U+2225 +(entity &DoubleVerticalBar;, &parallel; and &shortparallel; +in the file mmlalias.ent), obtained by \parallel in Tralics 2.9.4, and also by \Vert in following versions. We changed this because +the first character has fixed size as the following demonstrates +1 2 (the effect is only visible in HTML +with FM).

+

Translation of backslash changed: it is now Unicode U+2216, you can use +the backslash character (Unicode U+5C) by saying \char`\^^5c. +Example: old is X\Y, new is XY, note the different +spacing.

+

Example of \bigl and \bigr, followed by the same code without these +operations; currently there is no difference in the HTML version; in the Pdf +there is more space in the equations on the LHS between closing brace and +opening brace (same for bracket).

+x - s ( x )y - s ( y )(x-s(x))(y-s(y)) +x - s [ x ]y - s [ y ][x-s[x]][y-s[y]] +| x | - | y |||x|-|y|| +

Example of big

+

144 \[ \big(\big[\big\lbrack \big\{\big\lbrace\big\lfloor

+

145 \big\lceil\big\langle\big/ \big|\big\|\big\uparrow

+

146 \big\downarrow\big\updownarrow\frac 12 \big\Updownarrow

+

147 \big\downarrow \big\Uparrow\big\Vert\big\vert \big\backslash\big\rangle

+

148 \big\rceil\big\rfloor\big\rbrace\big\}\big\rbrack\big]\big)\]

+
+/ | 1 2 | +

I see the following: every up to the slash, and starting with the backslash +is big; remaining items are small in the Pdf version, big in Firefox, +sometimes small, sometimes large in Amaya.

+

149 \[ \big(\bigl[\Big\lbrack \Bigl\{\bigg\lbrace\biggl\lfloor

+

150 \Bigg\lceil\Biggl\langle /|\|\uparrow \downarrow\updownarrow\frac 12

+

151 \Updownarrow\downarrow\Uparrow\Vert\vert\backslash

+

152 \Biggr\rangle\Bigg\rceil\biggr\rfloor\bigg\rbrace\Bigr\}\Big\rbrack\bigr]\big)\]

+

A formula with all variants

+/ | 1 2 | +

Up to version 2.9.4, there was a bug in handling these big things. +Currently, Tralics inserts \left and \right delimiters wherever +possible. In the Pdf version, this formula is identical to the previous one. +In firefox, operators between slash and backslash (that have no big) are small +before the fraction, large after that. This is strange. In Amaya, everything +between the slash and the backslash is small, except the \vert.

+

Exercise 17.10: 2 x 2 + 2 y 2 φ ( x + i y ) 2 =0.

+

153 Phi is $\phi,^^^^03c6$, ^^^^03c6  and varphi is $\varphi,^^^^03d5$, ^^^^03d5,

+

There is a problem in the rendering of the letter phi; the straight phi +character is Unicode U+03D5. As the example given here shows, the rendering +of phi and varphi in math mode, at least on my machine: +Phi is ϕ,φ, φ and varphi is φ,Ï•, Ï•, +epsilon is ϵ, varepsilon is ϵ. We changed the +translation, so that the Firefox and Pdf versions show, in math mode, the +desired result. Note that AM shows the same characeter for phoi ad varphi in +math mode, and has trouble with epsilon(shown as a square).

+

154 $\bigl (x\in A(n)\bigm|x\in B(n)\bigr)$,

+

155 $\bigcup_n X_n\bigm\|\bigcap_n Y_n$,

+

156 $\displaystyle{ {a+1\over b}\bigg/{c+1\over d}}$

+

Other big x A ( n ) | x B ( n ) and + n X n n Y n and +a+1 b/c+1 d.

+

Exercise 17.12: x + f ( x )/x - f ( x ).

+

157 \[1+\left(\frac{1}{1-x^2}\right)^3,\qquad \pi(n)=\sum_{k=2}^n

+

158 \left\lfloor\frac{\phi(k)}{k-1}\right\rfloor, \qquad

+

159 \left|\left|x\right|-|\left|y\right|\right|, \qquad

+

160 \left(\sum_{k=1}^n A_k\right),\qquad  \biggl(\sum_{k=1}^n A_k\biggr)\]

+

Exercise 17.13: +Comparison between \left and \bigl; translation is the same in +Tralics.

+1+1 1-x 2 3 ,π(n)= k=2 n ϕ(k) k-1,x-y, k=1 n A k , k=1 n A k . +

Exercise 17.14: was wrong in Tralics 2.9.4.

+π(n)= m=2 n k=1 m-1 ( m / k ) / m / k -1 +|x|=x,ifx0-x,ifx<0 +

sets \nulldelimiterspace, unused by Tralics.

+1 2=1 2=1 2=1 2 +

The \vcenter command is not implemented. +Any box can be put into a formula by simply saying +\hbox or \vbox or \vtop or \box or \copy; this is not +implemented in Tralics, you can insert text in math mode via \text or +\hbox.

+

Exercise 17.15: This shows the use of \mathchoice.

+

161 \def\puzzle{\mathchoice{D}{T}{S}{SS}}

+

162 \[\puzzle{\puzzle \over\puzzle^{\puzzle^\puzzle}} \qquad

+

163 \frac{\puzzle}{\puzzle^{\puzzle^\puzzle}} \]

+
+DT T S SS T T S SS +

Exercise 17.16: The \square command is built-in: .

+

The \mathpalette command is introduced in Tralics 2.9.5, not tested +yet.

+

164 \def\legendre{\overwithdelims()}\def\Legendre{\genfrac(){}{}}

+

165 \def\euler{\atopwithdelims<>}\def\Euler{\genfrac<>{0pt}{}}

+

166 \def\grimm{\abovewithdelims][4pt}\def\Grimm{\genfrac][{4pt}{}}

+

167 \[{a\legendre b}, \Legendre{a}{b}, {n \euler k}, \Euler{n}{k},

+

168 {\dfrac ab \grimm \dfrac cd}\Grimm{x}{y} \]

+

Exercise 17.17: Knuth says: the size of the surrounding delimiters depends only on +the size, not on the size of the fractions, this is false for Tralics:

+a b,a b,n k,n k,a b c dx y +

If f is the value of \delimiterfactor and δ the value of +\delimitershortfall, and we have a formula that extents y 1 units +above the axis, and y 2 units below, if y=2max(y 1 ,y 2 ), then the +delimiter size is at least y·f/1000, and at least y-δ. +This does not apply to Tralics.

+

The remainder of the chapter discusses some low-level commands that are not +fully implemented in Tralics. The commands \textfont, \scriptfont +and \scriptscriptfont take a small number as argument, and provide a +reference to a font. The following code

+

169 \font\tenrm=somefont at 12pt

+

170 \font\Helvetica=someotherfont scaled 1013

+

171 \textfont0=\tenrm

+

172 \scriptscriptfont2=\scriptfont3

+

173 \the\fontdimen3\scriptscriptfont15

+

174 $\textfont0=\tenrm 9\hbox{$9\textfont0=\Helvetica$}$%

+

175 ${\textfont0=\Helvetica 9}$ % exercise 17.18

+

gives: +0.0pt999. The dimension should be +zero, and the math formula contains three identical digits. Exercise 17.18 +says that the fonts used by in the last case is not Helvetica.

+

You cannot use more than 16 different math fonts in a formula. Assume that you +need symbol A from font a; you can say that \textfont6 is your font a, +and your symbol is character 137 in that font. What if you want +symbol B from font b? you can use font number 7, but this is obviously not the +solution. We explain here the amsmath strategy by telling what happens if you +use \tt in a math formula. First of all, in a formula, this evaluates to +\mathtt, and the real command is \@mathtt. This is a self-modifying +command; after first use it is equivalent to \fam9 (this means that +normal characters in text size use the \textfont9). The first use +allocates the number 9, and defines the font, moreover the font information is +remembered (the font \textfont9 will be defined for all subsequent math +formulas). Note that the value of \textfont9 can be cmtt12, but this is +recomputed if the current font size changes. For most other commands, the +number is allocated when the font is declared, this means that a slot is +allocated even when the font is never used.

+

Four slots are preallocated, with the names operators, letters, symbols and +largesymbols. If you load packages amsmath, amscd, amssymb, and bm, four +other slots are used, and there are only 8 slots remaining. In the case of +this document, we test all 14 MathML fonts. How is this possible? +In fact some characters are typeset outside math mode (sans-serif characters +for instance) and in some cases poor-man-bold is used. Moreover, we had to +remove some font families (these are commented out in the file +raweb-uni.sty).

+

Exercise 17.19: Math code are not implemented in Tralics, \oplus is character +U+2295 and \bullet is character U+2022.

+

176 \mathcode`<="2203 \mathcode`*="313C

+

177 \mathcode`a="8000 {\catcode`a=13 \gdef a{A}}

+

178 $a<b*c$

+

179 %\mathchardef\@M=10000

+

In , the previous code is equivalent to A*b<c, in Tralics, it gives: + +A<b*c. Since version 2.9.10, a capital letter A is produced. +The last line is commented out: the assignment is done at bootstrap. +You should use \@M as the constant 10000, not as control-P in family 7 +(binary operation).

+

Following code is unlikely to work

+

180 \def\sum\{\mathchar"1350}

+

181 \mathchardef\sum"1350

+

182 \def\n@space{\nulldelimiterspace\z@ \m@th}

+

183 \newdimen\p@ \p@=1pt

+

184 \def\bigl#{\mathopen{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}

+

185 \delcode `x="123456

+

186 \def\langle{\delimiter"426830A }

+

187 \bigl\delimiter"426830A

+

188 \def\sqrt{\radical"270370 }

+

189 \def\idehat{\mathaccent"362 }

+
+Fine points of Mathematics Typing, TB 18 +Punctuation +

Say: If x<0, we have shown that

+y=f(x). +

Do not say: for x=a,b, or c, but: for x=a, b, c, or use a tie: +or c.

+

Exercise 18.1: R(n,t)=O(t n/2 ), as t0 + . Adding braces improves the Html version: R(n,t)=O(t n/2 ).

+
+Non-italics letters in formulas +

has 32 predefined operators, some of them behave like sums according to +the placement of limits.

+arccos x +arcsin x +arctan x +arg x +cos x +cosh x +cot x +coth x +csc x +deg x +det x +dim x +exp x +gcd x +hom x +inf x +ker x +lg x +lim x +lim inf x +lim sup x +ln x +log x +max x +min x +Pr x +sec x +sin x +sinh x +sup x +tan x +tanh x +inj lim x +proj lim x +

The last two operators are defined by amsmath. Variants shown later. More +formulas (there should be small space around these operators, that is +invisibile on my browser).

+sin2θ=2sinθcosθO(nlognloglogn)Pr(X>x)=exp(-x/μ)max 1nm log 2 P n lim x0 sinx x=1 +

Exercise 18.2:

+p 1 (n)=lim m ν=0 1 - cos 2m (ν! n π/n) +

Example of formulas using \rm: + Var (X), x max -x min , + LL (k) LR (k), exp(x+ constant ), +and x 3 + lower order terms .

+

Some formulas using \hbox for roman font: +Var(X), +LL(k)LR(k), exp(x+constant), +and x 3 +lowerorderterms.

+

The same formulas using \text for roman font: +Var(X), +LL(k)LR(k), exp(x+constant), +and x 3 +lowerorderterms.

+

190 \def\Varliminf{\mathop{\underline{\mathmo{lim}}}}

+

191 \def\Varlimsup{\mathop{\overline{\mathmo{lim}}}}

+

192 \[\lim_{n\to\infty}x_n\text{ exists}\iff

+

193 \Varlimsup_{n\to\infty}x_n=\Varliminf_{n\to\infty}x_n.\]

+

Exercise 18.3:

+lim n x n existslim sup n x n =lim inf n x n . +lim n x n existslim n x n =lim _ n x n . +

The code above is wrong, because `lim' is a known operator, with movable +limits, hence, in non-display mode, both the underline and the real subscript +will move. The real definitions adds +movablelimits = `false' to the operator.

+

194 $\gcd(m,n)=\gcd(n,m\bmod n)$, or $x\equiv y+1\pmod{m^2}$

+

195 $x\equiv0(\pmod y^n)$.

+

Modulo: gcd(m,n)=gcd(n,mmodn), or xy+1(modm 2 )

+

Exercise 18.4: B.L. User got the unexpected formula x0((mody) n ).

+

Exercise 18.5: In this example, there are braces around n/p, but not +k/p; this can affect the size of the slash operator (HTML version only).

+n kn/p k/pnmodp kmodp(modp) +

Example of bold face a+b=Φ m ; normal Phi is U+03A6, bold Phi is +U+1D6BD, italic Phi is U+1D6F7, bold italic Phi is U+1D731, sans serif bold +Phi is U+1D76B, sans serif bold italic Phi is U+1D7A5. In the current version +of Tralics, font changes apply only to ASCII letters. Commands like \cal +are robust, so that +$\cal Ab\Phi$ produces AbΦ; +command \mit is not implemented. Note that in some cases, digits and +lower case letters do not exist in the font, and may be replaced by random +glyphs.

+

Exercise 18.6: If you want +x T Mx=0x=0 in +Tralics 2.9.4, you have to explicitly say that you want a bold face zero, +and an upright T, see below. In version 2.9.5, nothing special needed. +Note how we use colon-equal here.

+

196 $\bf\bar x^{\mathmo{T}}Mx={\rm0}\iff x=\mathmn[mathvariant][bold]{0}$

+

197 Compare $This\ is\ math\ italics$ with {\it This is text italics}.

+

198 Compare $different$ and $\it different$. We have also

+

199 $\it last\mathmo{:=}first$, $\it x\_coord(point\_2)$

+

Compare Thisismathitalics with This is text italics. +Compare different and different. We have also +last:=first, x_coord(point_2).

+

Exercise 18.8: We use \mathit instead of \it here.

+available+ i=1 n max(full(i),reserved(i))=capacity +

Exercise 18.9: +The following code was obtaining by taking the answer from the book, with the following modifications: the \sfcode of the semi colon not +changed; math formulas put outside scope of \bf, because my browser shows +letters (not digits) in bold face otherwise. Note that the XML to HTML +processor converted the whole environment (seven paragraphs) into a single +paragraph +with <br> as separator (inter-paragraph width too big), and a huge +left margin (for fun). We show here the start of the code:

+

200 \begin{xmlelement+}{pseudocode}\XMLaddatt{leftskip}{5cm}

+

201 \obeylines

+

202 \def\coleq{\mathmo{:=}}

+

203 \textbf{for} $j\coleq 2$ \textbf{step} $1$ \textbf{until} $n$ \textbf{do}

+

204 ...

+

205 \end{xmlelement+}

+

for j:=2 step 1 until n do

+

   begin accum:=A[j]; k:=j-1; A[0]:=accum;

+

   while A[k]>accum do

+

      begin A[k+1]:=A[k]; k:=k-1;

+

      end;

+

   A[k+1]:=accum;

+

   end.

+

+
+Spacing between formulas +

Compare

+F n =F n-1 +F n-2 ,n2. +

with (lot of white space in the formula)

+F n =F n-1 +F n-2 ,n2. +

and (no unnecessary white space in the formula)

+F n =F n-1 +F n-2 ,n2. +

Normally, the spacing should be the same in the last two formulas. +In fact, Knuth says that \quad is the same as \hskip 1em\relax. +The translation of a \quad in math mode is <mspace width="1.em">, +but the \hskip command reads a dimension, and converts one em into ten +pointsMaybe, one day, Tralics will have an em that depends on the context.

+

Exercise 18.10: Three versions:

+

Let H be a Hilbert space, C a closed bounded convex subset +of H, T a non-expansive self map of C. Suppose that as +n, a n,k 0 for each k, and +γ n = k=0 (a n,k+1 -a n,k ) + 0. +Then for each x in C, A n x= k=0 a n,k T k x converges +weakly to a fixed point of T.

+

Let H be a Hilbert space,  C a closed bounded convex subset +of H,  T a non-expansive self map of C. Suppose that as +n,  a n,k 0 for each k, and +γ n = k=0 (a n,k+1 -a n,k ) + 0. +Then for each x in C,  A n x= k=0 a n,k T k x converges +weakly to a fixed point of T.

+

Let C be a closed, bounded, convex subset of a Hilbert space H, +and let T be a non-expansive self map of C. Suppose that as +n, we have a n,k 0 for each k, and +γ n = k=0 (a n,k+1 -a n,k ) + 0. +Then for each x in C, the infinite sum +A n x= k=0 a n,k T k x converges weakly to a fixed point of T.

+

Comments: the translation of the three characters: space, backslash, space is +formed of two spaces. Such a construct is used four times in the first +version. This produces a nice dvi file, but HTML interprets the double space +the same as a single space. In the second version, we have used a double tilde +character. This inhibits line breaks. (My browser does not seem to honor this). +No special characters appear in the last example.

+
+Spacing within formulas +

206 $a\,b\>c\;d\!e\quad f\qquad g\ h$~j

+

207 %\the\thinmuskip\the\medmuskip\the\thickmuskip

+

The math spacing commands: abcdefghj. +In , the value of the glue inserted depends on three registers: +\thinmuskip (3mu), \medmuskip +(4mu plus 2mu minus 4mu) and \thickmuskip (5mu plus 5mu). You can try to +execute the line above that is commented out: all dimensions come out as 0mu +in Tralics, but the math formula contains 0.166667em, 0.222222em, 0.277778em, +etc, this is the same as 3mu, 4mu and 5mu, because 1em=18mu. In Tralics, +\mskip 18mu is equivalent to \hskip1em, and, as said above, this is +the same as \hskip10pt. The same is true for \mkern18mu; the +translation is an empty <mspace> element, with attribute +value = `10.0pt'. The amount of space given by backslash-space changed +from 6pt to 4pt (this is the same amount of space used by the \text +command).

+

208 $\int_0^\infty f(x)\,dx$, $y\,dx-x\,dy$, $dx\,dy=r\,dr\,d\theta$, $x\,dy/dx$

+

Translation 0 f(x)dx, ydx-xdy, dxdy=rdrdθ, +xdy/dx.

+

Exercise 18.11:

+ 1 x dt t 0 t-ib t 2 +b 2 e iat dt=e ab E 1 (ab),a,b>0 +

209 $55\,\mathrm{mi/hr}$, $g=9.8\,\mathrm{m/sec}^2$,

+

210 $1\mathrm{ml}=1.000028\,\mathrm{cc}$

+

Units: 55 mi / hr , g=9.8m/ sec 2 , +1 ml =1.000028 cc . Note that digits are outside the scope +of \mathrm.

+

Exercise 18.12: Inline math, displaystyle: +=1.054×10 -27 erg sec .

+

211 $(2n)!/\bigl(n!\,(n+1)!\bigr)$, $\sqrt2\,x$,

+

212 $\sqrt{\,\log x}$, $O\bigl(1/\sqrt n\,\bigr)$,

+

213 $[\,0,1)$, $\log n\,(\log\log n)^2$, $x^2\!/2$, $n/\!\log n$,

+

214 $\Gamma_{\!2}+\Delta^{\!2}$, $R_i{}^j{}_{\!kl}$, $\int_0^x\!\int_0^y dF(u,v)$

+

215  \[\frac{52!}{13!\,13!\,26!}\qquad \int\!\!\!\int_D dx\,dy\]

+

Test: +(2n)!/n ! ( n + 1 ) !, 2x, +logx, O1 / n , +[0,1), logn(loglogn) 2 , x 2 /2, n/logn, +Γ 2 +Δ 2 , R i j kl , 0 x 0 y dF(u,v)

+52! 13!13!26! D dxdy +

Same formulas, without thin spaces

+

Test: +(2n)!/n ! ( n + 1 ) !, 2x, +logx, O1 / n, +[0,1), logn(loglogn) 2 , x 2 /2, n/logn, +Γ 2 +Δ 2 , R i j kl , 0 x 0 y dF(u,v)

+52! 13!13!26! D dxdy +

Amaya shows a strange behavior here. Without the space the first integral is +larger than the second. In thee case of negative space, the absolute value is +used.

+

Exercise 18.14: intervals with left/right: +-,T×-,T; +with mathopen, mathclose +]-,T[×]-,T[; +with nothing ]-,T[×]-,T[. And with left/right: +-,3 4×-,3 4; +with mathopen, mathclose +]-,3 4[×]-,3 4[; +with nothing ]-,3 4[×]-,3 4[.

+

Exercise 18.15: The spacing in x++1 differs between and MathML.

+
+Ellipses +

216 $x_1+\cdots+x_n$, $x_1=\cdots=x_n=0$, $A_1\times\cdots\times A_n$,

+

217 $f(x_1,\ldots,x_n)$, $x_1x_2\ldots x_n$, $(1-x)(1-x^2)\ldots(1-x^n)$,

+

218 $n(n-1)\ldots(1)$.

+

Translation of these formulas x 1 ++x n , x 1 ==x n =0, A 1 ××A n , +f(x 1 ,...,x n ), x 1 x 2 ...x n , (1-x)(1-x 2 )...(1-x n ), +n(n-1)...(1).

+

Exercise 18.16: Answer x 1 +x 1 x 2 ++x 1 x 2 ...x n , +(x 1 ,...,x n )·(y 1 ,...,y n )=x 1 y 1 ++x n y n . +Prove that (1-x) -1 =1+x+x 2 +. Clearly a i <b i , for i=1, 2, +..., n. The coefficients c 0 , c 1 , ..., c n are positive. +With braces surrounding the LHS: (1-x) -1 =1+x+x 2 +.

+

Exercise 18.17: Clearly a i <b i , for i=1,2,...,n. Note that the `2' here is +a math digit, while it is text digit in the sentence above.

+

Exercise 18.18: Knuth used \dots.

+
+Line breaking +

The book explains how can break a math formula. This does not +apply to Tralics. Commands \nobreak and \allowbreak +do nothing in math mode.

+
+Braces +

You should use braces only for grouping. You can use a brace character via +\{ in text or math mode. This character is a delimiter (it can be +preceded by \left or \big).

+

219 $\{a,b,c\}$, $\{1,2,\ldots,n\}$, $\{\mathrm{red,white,blue}\}$

+

220 $\{\,x\mid x>5\,\}$, $\{\,x:x>5\,\}$,

+

221 $\bigl\{\,\bigl(x,f(x)\bigr)\bigm|x\in D\,\big\}$

+

222 $\bigl\{\,\bigl(x,f(x)\bigr)\bigm\mid x \in D\,\big\}$

+

223 $\bigl\{\,\bigl(x,f(x)\bigr)\mid x\in D\,\big\}$

+

Translation +{a,b,c}, {1,2,...,n}, { red , white , blue }, +{xx>5}, {x:x>5}, + x , f ( x ) | x D + x , f ( x ) |xD. +Note that \mid gives better spacing than a single bar + x , f ( x ) x D , + x , f ( x ) x D .

+

Exercise 18.21: x 3 h (x) {-1,0,+1}

+

Exercise 18.22: {pp and p+2 are prime}.

+

We show here the use of the cases enviroment, this is a two-column cmatrix, +with a left brace delimiter on the left.

+|x|=x,ifx0;-x,otherwise. +f(x)=1/3if0x1;2/3if3x4;1/3elsewhere; +

Exercise 18.23: The \cases command is not implemented, but there is +a environment. You cannot use \noalign. After a double backslash you can +put a dimension in brackets, but this is currently ignored.

+

224 \[\overbrace{x+\cdots+x}^{k\; \textrm{times}} \qquad \underbrace{x+y+z}_{>\,0}\]

+

We show here braces can stretch horizontally, when used as over-accent or +under-accent.

+x++x k times x+y+z >0 +
+Matrices +

The plain command \matrix should not be used. The `array' +environment can be used in math mode, and you must specify for each column the +alignment method. The `matrix' environment can be used, cells are centered. He +we use `pmatrix', because it adds automatically parentheses. In +Tralics 2.14.2 there is a possibility to put an attribute pair on +the current table.

+

225 \[A=\begin{pmatrix}x-\lambda&1&0\\0&x-\lambda&1\\0&0&x-\lambda\end{pmatrix}\]

+

226 \[\begin{pmatrix}a&b&c\\d&e&f\tableattribute{A}{B}\end{pmatrix}\mathattribute{C}{D}

+

227 \begin{pmatrix}u&x\\v&y\\w&z\end{pmatrix}\]

+
+A=x-λ100x-λ100x-λ +abcdefuxvywz +

Exercise 18.24: This looks bad in the HTML version, but it OK is Pdf. Delimiters +are \lgroup and \rgroup.

+abcdefuxvywz +

Exercise 18.25:

+A=a 11 a 12 ...a 1n a 21 a 22 ...a 2n a m1 a m2 ...a mn y 1 y k +

Border matrixCommand \bordermatrix not yet implemented

+

Small matrices 11 00 and a l b m c n. Note that horizontal alignment is +only approximative.

+
+Vertical Spacing +

228 \def\Limsup{\mathop{\smash\limsup\vphantom\liminf}}

+

229 $\Limsup\limits_3=\limsup\limits_3$

+

+Compare: lim suplim inf 3 =lim sup 3 ! The second index should be lower +than the first.

+

Commands \raise and \lower not yet implemented. +Commands \llap and \rlap not yet implemented.Fixme

+

230 \def\undertext#1{$\underline{\hbox{#1}}$}

+

231 \undertext{This} \undertext{does} \undertext{not} \undertext{always}

+

232 \undertext{work} \undertext{right}.

+

233 \def\undertext#1{$\underline{\smash{\hbox{#1}}}$}

+

234 \undertext{This} \undertext{does} \undertext{not} \undertext{always}

+

235 \undertext{work} \undertext{right}.

+

Exercise 18.26: + A sentence where each word is an +underlined math formula (text only): +This _ does _ not _ always _ +work _ right _. The same, where the \smash is used to +hide the depth of the text (all lines vertically aligned): + +This _ does _ not _ always _ +work _ right _.

+

236 $\rm Fe_2^{+2}Cr_2^{\vphantom{+2}}O_4^{\vphantom{+2}}$

+

Use of phantoms: Fe 2 +2 Cr 2 +2 O 4 +2

+
+Special features for math hackers +

Commands \nonscript, \everymath and \everydisplay are OK.

+

237 {\everydisplay{a}\everymath{b} \def\X{x\nonscript\qquad y}

+

238 \[u = \text{ v $w$ }\frac{\X}{\textstyle\X} \]}

+
+au=vbwxy xy +
+Summary +

Exercise 18.27: n th from the book, n th is , and +nth is textsuperscript.

+

Exercise 18.28: S -1 TS=dg(ω 1 ,...,ω n )Λ, uses \mathnormal, no bf lambda?

+

Exercise 18.29: Pr(m=nm+n=3).

+

Exercise 18.30: sin18 =1 4(5-1).

+

Exercise 18.31: k=1.38×10 -16 erg / K.

+

Exercise 18.32: Φ NL 1 * /N=L 1 * NL n * /N=L n * .

+

Exercise 18.33: I(λ)= D g(x,y)e iλh(x,y) dxdy.

+

Exercise 18.34: 0 1 0 1 f(x 1 ,...,x n )dx 1 ...dx n . +Note: Firefox shows small integral signs, and larger ones in the previous +exercise.

+

Exercise 18.35: Using cases environment

+x 2m Q(X m 2 -P 2 W m 2 )-2S 2 (modd)P 2 2 (X m 2 -P 2 W m 2 )-2S 2 (meven)(modN). +

Exercise 18.36: with a \frac

+(1+x 1 z+x 1 2 z+)...(1+x n z+x n 2 z 2 +)=1 (1-x 1 z)...(1-x n z) +

Exercise 18.37:

+ j0 k0 a jk z k = n0 z n k 0 ,k 1 ,...0 k 0 +k 1 +=n a 0k 0 a 1k 1 ... . +

Exercise 18.38: Using \frac and \binom

+(n 1 +n 2 ++n m )! n 1 !n 2 !...n m !=n 1 +n 2 n 2 n 1 +n 2 +n 3 n 3 ...n 1 +n 2 ++n m n m . +

Exercise 18.39: Using \genfrac

+Π R a 1 ,a 2 ,...,a M b 1 ,b 2 ,...,b M = n=0 R (1-q a 1 +n )(1-q a 2 +n )...(1-q a M +n ) (1-q b 1 +n )(1-q b 2 +n )...(1-q b N +n ). +

Exercise 18.40:

+ p prime f(p)= t>1 f(t)dπ(t). +

239 \def\X{\char`'}

+

240 \[{

+

241 \{\underbrace{\overbrace{\mathstrut a,\ldots,a}^{k\;a\X\mathrm{s}},

+

242   \overbrace{\mathstrut

+

243     b,\ldots,b}^{l\;b\X\mathrm{s}}}_{k+l\;\mathrm{elements}}\}

+

244 }\quad\text{vs}\qquad {

+

245 {\{\,}\underbrace{\overbrace{\mathstrut a,\ldots,a}^{k\;a'\mathrm{s}},

+

246   \overbrace{\mathstrut

+

247     b,\ldots,b}^{l\;b'\mathrm{s}}}_{k+l\;\mathrm{elements}}{\}\,}.}\]

+

Exercise 18.41: In this formula, we want the denote the plural of the token a by +as apostrophe followed by the letter s. The first attempt is not good. The +second is a bit better, because it is a-prime followed by s. The first +expression is formed of open brace, underbraced formula, closing brace; and this +produces large braces in the HTML version; small braces are obtaing by +replacing the first token by a list, containing the brace and little bit space.

+{(a,...,a ka's ,(b,...,b lb's k+l elements }vs{(a,...,a ka ' s ,(b,...,b lb ' s k+l elements }. +

Exercise 18.42:

+abcdefgh0ijkk. +

A non trivial question: what is the distance X between two lines in a matrix +like these? or said otherwise, what is the vertical glue Y added between two +lines? Let x be the value of \baselineskip, y the value of +\lineskiplimit and z the value of \lineskip. Then, the quantity +y is computed so that X=x, unless this gives Y<y, case where z is used +instead. Typically, for a normal paragraph, x=12, y=0, z=1, and for a +`align' environment, we have x=15, y=3, z=4. In the case of an array, +all three values are zero. This means: normal baseline in a paragraph is 12pt, +but there is at least one pt between two lines, and in the case of multiline +equations, the baseline is larger, as well as the clearance. In the case of an +array, no extra space is added. However, a strut is added to each line, this +is an invisible rule; as a consequence, the total height plus depth of each +line is the matrix is at least 12pt, hence X is at least 12pt.

+

This has as consequence that, in the big matrix above, parentheses do touch. +We changed, in the file raweb-cfg.sty, the code of the \@array command: +z=5, and y is 3 or 5, depending on whether the `displaystyle' attribute +array of the array is true (if the attribute is true, then all entries are +typeset in \display mode; this is the case for all environments like +`gather' or `align' that are translated by Tralics as an array).

+

Exercise 18.43: Note: entries are left aligned because of explicit \hfil.

+detc 0 c 1 c 2 ...c n c 1 c 2 c 3 ...c n+1 c 2 c 3 c 4 ...c n+2 c n c n+1 c n+2 ...c 2n +

Exercise 18.44:

+ ' xA f(x)= def xA x0 f(x). +

Exercise 18.45: This is not so nice

+2kâ‰2 2 2 · · · 2 1 2k +

Exercise 18.46: Vertical arrow centered via the use of phantom on the left; +command \hidewidth not used (the purpose of the command is to make +\halign believe that the cell has a very small width; this will produce +an overfull box, but who cares: there is enough white space at both ends).

+00 O k ι E ρ L 0ϕϕψψ0 O C π * O D δ R 1 f * O V (-D) 0θ i γ -1 θ i γ -1 R 1 f * O V (-iM)γ -1 0 +
+Displayed Equations, TB19 +One-line displays +

Example of a display, containing only text

+DisplayedText +

Another one, with text and math

+X n =X k ifandonlyifY n =Y k andZ n =Z k . +

Compare the following two examples: the translation is the same, but you cannot +put arbitrary text in a math formula!

+

248 $$Y_n=X_n\bmod p \quad\hbox{and}\quad Z_n=X_n\bmod q \qquad\hbox{for all }n\ge 0.$$

+

249 $$Y_n=X_n\bmod p \quad\hbox{and}\quad Z_n=X_n\bmod q\qquad\hbox{for all $n\ge0$}.$$

+
+Y n =X n modpandZ n =X n modqforalln0. +Y n =X n modpandZ n =X n modqforalln0. +

Exercise 19.1: The exercise contains four formulas; for the first three ones, we +give a variant. For the first formula, the delimiters hace different +sizes.

+

250 $$\sum_{n=0}^\infty a_nz^n\qquad \hbox{converges if}\qquad |z| <

+

251 \Bigl(\limsup_{n\to\infty}\root n\!\of{|a_n|}\,\Bigr)^{-1}.$$

+

252 \[\sum_{n=0}^\infty a_nz^n\qquad \text{converges if} \qquad |z| <

+

253 (\limsup_{n\to\infty}\sqrt[n\!]{|a_n|}{\,)}^{-1}. \]

+

254 \[\sum_{n=0}^\infty a_nz^n\qquad \text{converges if} \qquad |z| <

+

255 (\limsup_{n\to\infty}\sqrt[n\!]{|a_n|}\,)^{-1}. \]

+
+ n=0 a n z n convergesif|z|<lim sup n |a n | n -1 . + n=0 a n z n convergesif|z|<(lim sup n |a n | n) -1 . + n=0 a n z n convergesif|z|<(lim sup n |a n | n) -1 . +

Next two formulas.

+

256 $${f(x+\Delta x)-f(x)\over\Delta x}\to f'(x)\qquad \hbox{as $\Delta\to0$.}$$

+

257 \[\frac{f(x+\Delta x)-f(x)}{\Delta x}\to f'(x)\qquad \text{as }\Delta\to0.\]

+

258 $$\|u_i\|=1,\qquad u_i\cdot u_j=0\quad\hbox{if $i\ne j$.}$$

+

259 \[\|u_i\|=1,\qquad u_i\cdot u_j=0\quad\text{if } i\ne j.\]

+
+f(x+Δx)-f(x) Δxf ' (x)asΔ0. +f(x+Δx)-f(x) Δxf ' (x)asΔ0. +u i =1,u i ·u j =0ifij. +u i =1,u i ·u j =0ifij. +

Last formula; you cannot use the \matrix command defined by plain , +but you have to use the matrix environment.

+

260 \[\it\text{The confluent image of}\quad

+

261 \begin{Bmatrix}\text{an arc}\hfill\\\text{a circle}\hfill\\\text{a fan}\hfill

+

262 \end{Bmatrix}

+

263 \quad\text{is}\quad

+

264 \begin{Bmatrix}\text{an arc}\hfill\\\text{an arc or a circle}\hfill\\

+

265 \text{a fan or an arc}\hfill\end{Bmatrix}.\]

+
+Theconfluentimageofanarcacircleafanisanarcanarcoracircleafanoranarc. +

Since version 2.9.5, you can use font changes in \text commands and +friends (the previous formula is in italics). This is a more elaborate example

+

266 $\hbox{upright} \it \text{Italic\bf Boldface} {\tt \text{x = y$^2$}}$

+

Translation: uprightItalicBoldfacex=y 2 .

+

Exercise 19.2: Compare B. L. User's solution, Knuth's solutions and \tfrac:

+y=1 2xvsy=1 2xvs1 2x +

Exercise 19.3: We demonstrate in this example that using +$$\hbox{$formula$}$$ is non-trivial.

+

267 \everymath={A}

+

268 \everyhbox={B}

+

269 \def\X{\ifhmode H\else \ifvmode V \else \ifmmode M \else U\fi\fi\fi}

+

270 \def\Y{\X\ensuremath{\beta}}

+

271 $$ \Y\hbox{\X$\Y $\X}\Y \text{\X}$$

+
MβBHAMβHMβH +

Guess what happens if \X were replaced by \Y? the problem might be +solved in a future version. Note that \text does not insert the +every-hbox token list.

+

Exercise 19.4: Look at these four identical formulas.

+1-1 2+1 3-1 4+=ln2 +1-1 2+1 3-1 4+=ln2 +1-1 2+1 3-1 4+=ln2 +1-1 2+1 3-1 4+=ln2 +

In , equations are centered, and an equation number is added to the left +or the right. In the HTML version, an equation-with-number is a 3-column +table, columns 1 and 3 are of width 4em (this is defined in the CSS file), +one of them contains the equation number. If the equation number is big, the +width of the column might be larger than 4em, columns 1 and 3 could have +different widths, so that column 2 is not centered. Otherwise it is centered, +and the equation is centered in column 2 (is there a way to do this better?)

+

Normally, there should be a way to put the equation at some position (say 3cm +from the left margin). This is done in via a package option (can we +easily modify so that each equation can be centered or not?). In this +examples, first two formulas should be centered, other ones should flushed +left. Equations two and three have a number.

+

Note on Equation Numbering For a very long time, I have used the +\eqno command without any difficulty; of course, you have to be very +careful if you introduce an equation between equations (11) and (12), you +have to change every reference for any equation starting with 12. A big +advantage of is its automatic numbering scheme; more precisely if +you flag an equation with \label{eq+12}, you can get its number +via \ref{eq+12} (the only difficulty then is to find mnemonic +tag names). In a first pass, computes the value of the label, and +stores it in a file, in a second pass, it reads the file, and uses this +number. No number is computed by Tralics, in some cases, this can be +annoying. A side effect of the translation of the \label command is the +addition of an id (for instance `id12' to the equationThe label name +provided by the user cannot be used since it is an invalid XML id in this case), and translation of +the \ref is a <ref> element with a reference to the id.

+

Equation numbers are computed by the XML-to-whathever processor. +In fact, in the case of conversion from XML to HTML, the style sheet computes +the equation number twice: once when the equation is converted, and once when +the <ref> is converted. In the case of XML to XSL/FO, a number is computed +only for <ref>, the equation number is added to the equation by , +when the XSL/FO is converted to Pdf (this is not really important, because +nobody looks at the FO file).

+

Assume that you have hundreds of equations, and you want to refer the previous +one; very often it is tagged `(*)', in some cases `(**)'. Some people use +`(***)'. Exercise 19.7 that follows says that, in math mode, these come out as +(*), in some cases (**) and (***). In particular, a non-trivial question +is: should equation numbers by typeset as math or as text? In Tralics, we +implemented \eqno and \tag; that's a bit tricky, let's explain +some difficulties.

+ +

The MathML recommendation says: automatic equation numbering and +automatically resolving references to equations is outside the scope of +MathML, but can be done by use of style sheets or other means. “The +<mlabeledtr> construction provides support for both of these functions in +a way that is intended to facilitate XSLT processingâ€. The idea is to +construct an array, the first column contains equation numbers, with an +attribute that says if the tag should be on the left or the right. +This allows more than one tag per formula (there can be more than one row). +The problem is that my browser ignores the whole line. This is bad news.

+
+

The current implementation is: if the formula has a label, it has an +equation number. It cannot have more than one label/id/equation number. +(here `formula' designates the element that contains the translated math +formula). The style sheet computes the equation number via +<xsl:number level='any' count='formula[@id]' />.

+
+

What happens if a formula has a tag and a label? Currently the tag is +ignored. What we should do is modify the template above (count all formulas +with id and without tags), this gives a value if the equation has no tag, +and use the value of the tag otherwise. Note that, if you say +\tag{x}, this gives (x) as equation number, and \eqref +gives this value back. On the other hand, \eqno(x) is equivalent to +\tag*{(x)}.

+
+

If a tag is part of a math formula, it can consist in any math +construct. In our implementation, it may be an attribute so that only +characters are allowed. You cannot use α or β as tag. +In , tags are typeset in text mode, and math shift characters are +sometimes used. These are removed by Tralics.

+
+

A tag can appear anywhere in a formula, and more than one tag can be +used. Thus Tralics reads all tags and merges them (it complains if more +than one label appears in a formula).

+
+

The final tag, after merge, removal of special characters, etc., is +passed to a command; you can redefine it. In general it will either typeset +the tag, or convert it to an attribute.

+
+

Summary: There are three ways to obtain an equation number. +First, if an equation has a label, an equation number will be assigned to it +automatically, when converting from XML to HTML, or whatever. The second method +consists in using the amsmath command \tag, described below. Finally, you +can use the command \eqno. This command reads everything up to the +end of the formula, expanding tokens when needed; if this yields foo, +then \y@tag{foo} is evaluated again; this the same as if you said +\tag*{foo}. Its effect by default is to convert the tag as an +attribute to the formula. +Moreover, the attribute eqnpos is added to the +formula, with a value of left and right, depending on whether +\leqno or \eqno has been used. The equals signs should be aligned +for the five next formulas.

+x 2 -y 2 =(x+y)(x-y). +x 2 -y 2 =(x+y)(x-y). +

Equation number of () is on the left, of () on the +right, and () depends on the class option.

+x 2 -y 2 =(x+y)(x-y). +x 2 -y 2 =(x+y)(x-y). +x 2 -y 2 =(x+y)(x-y). +

Exercise 19.5:

+ k0 1 1-q k z= n0 z n / 1kn (1-q k ). +

Exercise 19.6: In , you can put an en-dash in an equation number by using +\hbox. This is not allowed in Tralics: the equation 1=1 below gives an +error. On the other hand, any character can be put in an equation number; the +case of an apostrophe is a bit special: it is not converted to an exponent, +but replaced by \apostrophe.

+

The example below illustrates one complexity. The end of the tag (via +\eqno) is the end of the formula. In order to get the end of the formula, +all tokens have to be expanded. The question is what to do with \char: +remember that this command reads and typesets a character. In this case it +cannot typeset a character; assume that we delay its interpretation. In this +case, the command that follows the backquote will be expanded (this is wrong: +we do not want to put an acute accent somewhere). Hence, the \char +command reads a character, and pushes back a character token, with the same +value, but category code 12. We explained above that \mathchar is not +implemented. This means that there is one and only one active math character: +the apostrophe, it produces a prime exponent even when it has category code +12. This is not desired: a tag should consist in characters only. This +explains why something special is done. You can define the \apostrophe +command as you like (the default value is character U+B4, but you can use an +apostrophe, case where an exponent will be created when the token list is read +again; formula 2=2 gives a double superscript error, guess why). +Note how we insert an en-dash (of course \textendash is a +non-math command, we had to modify some files in order to allow this character +in the Pdf).

+

272 \[1=1\eqno\hbox{(3--1)} \]

+

273 \[0=0\eqno(*,{**},{***},16'\char`\'\char`\^,3^^^^20131)\]

+

274 \[\def\apostrophe{'} 2=2\eqno(16'\char`\')\]

+

275 \[\def\apostrophe{'} 3=3\eqno(16')\]

+
+0=0 +

Exercise 19.7: It is possible to insert the equation number in the formula. +What you can see here is that the spacing for two and three stars is the same: +Knuth says that converts binary star to type Ord, in the case of three +stars, the middle one is of type Ord.

+0=0(*,**,***,16´´^,3–1) +3=3(16 ' ) +

Exercise 19.8: Knuth says: if \hsize is less than 10000pt, then the natural +width of the equation will be too large. Tralics ignores the shrink part of +the glue. In the case of the HTML document, the +text will flush in the right margin (and the equation number will be far +away). We have replaced 10000 by 600, this should be big enough to see +something.

+

276 \[\quad x=y\hskip10000pt minus 1fill\eqno(5)\]

+
+x=y +
+Multi-line displays +

Exercise 19.9: The \eqalign feature of plain is not implemented; you can +use the align environment like here:

+T(n)T(2 lgn )c(3 lgn )-c(2 lgn )<3c·3 lgn =3cn lg3 . +

+Using aligned, you can get

+α=f(z)β=f(z 2 )γ=f(z 3 )x=α 2 -βy=2γ +

Exercise 19.10:

+P(x)=a 0 +a 1 x+a 2 x 2 ++a n x n ,P(-x)=a 0 -a 1 x+a 2 x 2 ++(-1) n a n x n . +

Currently, the following code does not work.

+

277 \begin{eqalignno}

+

278 (x+y)(x-y)&=x^2-xy+yx-y^2\\

+

279 &=x^2-y^2;&(4)\\

+

280 (x+y)^2&=x^2+2xy+y^2 ;

+

281 \end{eqalignno}

+

282 \begin{leqalignno}

+

283 (x+y)(x-y)&=x^2-xy+yx-y^2\\

+

284 &=x^2-y^2;&(4)\\

+

285 (x+y)^2&=x^2+2xy+y^2 .

+

286 \end{leqalignno}

+

The best we can do is using phantoms:

+

287 \def\xcenter#1#2#3{\phantom{#3}{#1#2#3}\phantom{#1}}

+

288 \[\xcenter{(x+y)(x-y)}{=}{x^2-xy+yx-y^2} \]

+

289 \[\xcenter{{}}{=}{x^2-y^2;}\label{192-0}\]

+

290 \[\xcenter{{(x+y)^2}}{=}{x^2+2xy+y^2 .}\label{192-5}\]

+
+x 2 -xy+yx-y 2 (x+y)(x-y)=x 2 -xy+yx-y 2 (x+y)(x-y) +x 2 -y 2 ;=x 2 -y 2 ; +x 2 +2xy+y 2 .(x+y) 2 =x 2 +2xy+y 2 .(x+y) 2 +

Exercise 19.12: First two equations use \leqno, +Equations () and () have a label.

+gcd(v,u);gcd(u,v)=gcd(v,u);gcd(u,v) +gcd(-u,v).gcd(u,v)=gcd(-u,v).gcd(u,v) +gcd(v,u);gcd(u,v)=gcd(v,u);gcd(u,v) +gcd(-u,v).gcd(u,v)=gcd(-u,v).gcd(u,v) +

Exercise 19.13: Note: Knuth has a small space before the first dx, this seems +unnecessary. Some operators are big by default in MathML, so that no \big +is required. However, there is a rule in Tralics that says that small +parentheses are used in f(x)dx, even when the integral has limits. +In this cases, this mechanism produces small parentheses. The remedy is to put +f(x) in a group; the size of the parentheses depend only on what is in +the group. In a case like (x 2 +y 2 ), large parentheses are used. If you want +small ones, you must use the \smash command, and you get +(x 2 +y 2 ). In the pdf version, the vertical bar is too small.

+

291 \[\xcenter{\left(\int_{-\infty}^{\infty}e^{-x^2}dx\right)^2}{=}

+

292 {\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}e^{-(\smash{x^2+y^2})}dx\,dy}\]

+

293 \[\xcenter{}{=}{\int_0^{2\pi}\int_0^\infty e^{-r^2}r\,dr\,d\theta}\]

+

294 \[\xcenter{}{=}{\int_0^{2\pi}{\left(-\frac{e^{-r^2}}{2}|

+

295         _{r=0}^{r=\infty}\right)}\,d\theta}\]

+

296 \[\xcenter{}{=}{\pi.}\label{e19.13}\]

+
+ - - e -(x 2 +y 2 ) dxdy - e -x 2 dx 2 = - - e -(x 2 +y 2 ) dxdy - e -x 2 dx 2 + 0 2π 0 e -r 2 rdrdθ= 0 2π 0 e -r 2 rdrdθ + 0 2π -e -r 2 2| r=0 r= dθ= 0 2π -e -r 2 2| r=0 r= dθ +π.=π. +

Exercise 19.14: Knuth explains that eqalign and eqalignno environments +are based on \halign, so that \noalign can be used. In environments +like gather, you can try \multicolumn. As you can see here, the word +`and' occurs at the left of the table, not at the left margin; this is the same +as what happens with \eqalign.

+x=y+zandx 2 =y 2 z 2 +

Exercise 19.16: This uses \gather. There are no equation numbers, because +\hfil, \hfill or \hfilneg are not allowed.

+xxifxythenyxifxyandyzthenxz. +
+Long formulas +

The long formula is

+σ(2 34 -1,2 35 ,1)=-3+(2 34 -1)/2 35 +2 35 /(2 34 -1)+7/2 35 (2 34 -1)-σ(2 35 ,2 34 -1,1). +

It can be split as

+σ(2 34 -1,2 35 ,1)=-3+(2 34 -1)/2 35 +2 35 /(2 34 -1)+7/2 35 (2 34 -1)-σ(2 35 ,2 34 -1,1). +

Exercise 19.17:

+x n u 1 ++x n+t-1 u t =x n u 1 +(ax n +c)u 2 ++(a t-1 x n +c(a t-2 ++1))u t =(u 1 +au 2 ++a t-1 u t )x n +h(u 1 ,...,u t ). +

Attempt to use multline for the long formula.

+σ(2 34 -1,2 35 ,1)=-3+(2 34 -1)/2 35 +2 35 /(2 34 -1)+7/2 35 (2 34 -1)-σ(2 35 ,2 34 -1,1). +

Exercise 19.18:

+ 1jn 1 (x j -x 1 )...(x j -x j-1 )(x-x j )(x j -x j+1 )...(x j -x n )=1 (x-x 1 )...(x-x n ). +

Exercise 19.19: This is a silly expression. It is formed of A and B over C. +We show here the code of A, B and C, using the shorthands of Knuth. We redefine +locally the \\ command. The \Paren command puts +parentheses around the argument., the \Slash command produces a slash.

+

297 {

+

298 \def\\#1;{\noexpand\Paren{#1;q^2}_\infty}

+

299 \xdef\formA{q^{\frac 12 n(n+1)}\\ea;\\eq\noexpand\Slash a;}

+

300 \xdef\formB{\\caq\noexpand\Slash e;\\cq^2\!\noexpand\Slash ae;}

+

301 \xdef\formC{(e;q)_\infty(cq/e;q)_\infty}

+

302 }

+

The question is: What is the size of the parentheses? +In the case of f(x)dx some browsers show parentheses whose size are the +same as that of the current group; if nothing special is done, it includes the +integral sign and the bounds, this is wrong. For this reason, Tralics inserts some braces for opening and closing delimiters. If a group is created +for the parenthesis, it contains no big objects (e.g., something with +exponents). If possible, opening and closing parentheses are part of the same +group. The algorithm is not obvious: consider what should be done if x or +f(x) is replaced by its square. The following exercise is interesting. Note: +in the Pdf version, all formulas look the same, this is because parentheses +have fixed size. See also discussion after exercise 16.2: there are no +multiple scripts here.

+

We give here four +variants. In case one, there is no group, and the size of the parentheses is +given by the exponent of the q. Hence they are too big. Tralics tries to +compensate, but this does not work well, because of the index attached to +parenthesis; there are two parts (ea; and q 2 ) . +In the second case, we have added an empty group. In this case, +we have a group with (ea; followed by q 2 followed by a group with ) +followed by . This gives small parentheses. Variant three is +logically better: we put the parentheses in a group, so that its size depends +only on the content of the group; in this case Tralics leaves the formula +unchanged. If you feel that the parentheses are too big, you can reduce them: +variant four uses \smash.

+

A non trivial point is that the size of the slash character is also +variable. In the case where a group is used (variant 3 and 4), it size depends +on the q 2 that follows. Otherwise, when Tralics tries to insert a group, +in order to reduce the size of the parentheses, it uses a complicated +algorithm: when a group is created for the parentheses, it does not include +big objects. In particular, since each semi-colon is followed by q 2 , this +group cannot contain both parentheses. Expressions can be split after binary +operators or relations, in the case of a/b=c, only the equals sign is +considered. Understanding exactly where the expression is split is not +easy. Obviously, in the case when there are two q 2 in the expression, none +of them is in a group. Since the slash character is between these two +expressions, it is outside of the group, its size is affected by the exponent +of the first q. This gives a very big slash (in the case of the Pdf version, +only small characters are used).

+

One fundamental change in Tralics 2.10.8 concerns the case where a +superscript or subscript is attatched to a parenthesis. In this case, the +script is detached, the soliiting algorithme is called, and the script is +attached to what preceeds. An like (x)^2, will be converted into +(x){}^2, that can be converted into +(x){}^2, and after removal of the dummy group into +(x)^2.

+

303 \def\Paren#1{(#1)}

+

304 \def\Paren#1{(#1){}}

+

305 \def\Paren#1{{(#1)}}

+

306 \def\Paren#1{{(\smash{#1})}}

+

307 \def\Slash{/}

+

308 \[ \frac{\formA\formB}{\formC} \]

+

309 \[ \frac{\textstyle\formA\qquad \atop\hfill\textstyle\formB}{\formC} \]

+

The whole formula version 1

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

Version two

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

Version 3

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

Version 4

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

+The split formula

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

One trick in order to get a smaller slash: define \Slash to be a group +consisting of a slash (and something else, here a \kern of width minus 1pt). + +The whole formula version two

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

Version 4

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +

+The split formula, version 4

+q 1 2n(n+1) (ea;q 2 ) (eq/a;q 2 ) (caq/e;q 2 ) (cq 2 /ae;q 2 ) (e;q) (cq/e;q) +
+Higher Mathematics, TLC2 +

In this chapter we present examples from the companion, second +edition, chapter 8; the book is distributed with a CDrom containing all +examples. These examples are formed of two parts; black and blue, the blue +part contains material to be inserted before the +\begin{document}; whenever needed, we shall explain what these +commands are assumed to do, what they do, and how the feature might be +implemented. Unless stated otherwise, the black part is taken verbatim.

+Introduction to amslatex +

The following packages are defined for use with Tralics:

+ +

amsmath is the main package, it loads amstext, amsbsy, amsopn; Options +are sumlimits, nosumlimits, namelimits, nonamelimits, centertags, tbtags, +cmex10, and fleqn.

+
+

amsgen contains some useful commands (currently unused).

+
+

amstext defines the \text command, which is built-in in Tralics.

+
+

amsbsy loads amsgen. It provides \boldsymbol and \bm, which do +nothing in Tralics.

+
+

amsopn, no options. The package defines commands like \lim, that +are built-in in Tralics.

+
+

amscd, implementes commutative diagrams.

+
+

amsthm, not yet implemented (theorems are built-in in Tralics).

+
+

amsxtra, not yet implemented.

+
+

upref, not yet implemented.

+
+

amsfonts, not yet implemented; this package and the following recognize +options psamsfonts.

+
+

amssymb. The package defines 204 symbols, all of them implemented in the +Tralics kernel, except the following one, that are declared undefined by +the amsmath package: \vartriangle, \doublebarwedge, +\varpropto, \smallsmile, \smallfrown, \lvertneqq +\gvertneqq, \npreceq, \nsucceq, \varsubsetneq(q) +\varsupsetneq(q), \nsubseteqq, +\nsupseteqq, \(n)shortmid, \(n)shortparallel.

+
+

eufrak. The package defines family \Eufrak (this command is +\mathfrak in Tralics), this is assumed to use the font family `euf'. +The eufrak package is redundant if the amsfonts package is used.

+
+

eucal. +The package defines family \Euscript (this command is \mathcal in +Tralics), this is assumed to use the font family `eus'. +Accepts options `mathcal' and `mathscr' (this make \mathscr +equivalent to \mathcal.

+
+

All undefined math symbols are defined to be \ams@unimp, a command that +expands to an undefined command, the one defined here to produce a red X.

+

310 \def\UnimplementedOperator#1{\mathbox{mstyle}[color][red]{X}}

+
+Display and alignment structures for equations +

Source code for some formulas used below:

+

311 \begin{equation} (a+b)^2 = a^2+2ab+b^2\end{equation}

+

312 \[  \sin^2\eta+\cos^2\eta = 1  \]

+

313 \begin{equation} x^2 + y^2  =  z^2 \end{equation}

+

314 \begin{align} x^2 + y^2 &=  z^2 \\ x^3 + y^3 &<  z^3 \end{align}

+

315 \begin{eqnarray} x^2 + y^2 &=& z^2 \\ x^3 + y^3 &<& z^3 \end{eqnarray}

+

316 \begin{equation*}  n^2 + m^2 = k^2 \end{equation*}

+

317 \begin{equation} n^p +m^p \neq k^p  \qquad p > 2 \end{equation}

+

318 \begin{multline}  \tag{2}

+

319   \sum_{t \in \mathbf{T}} \int_a^t

+

320     \biggl\lbrace \int_a^t f(t - x)^2 \,

+

321             g(y)^2 \,dx \biggr\rbrace \,dy \\

+

322   = \sum_{t \notin \mathbf{T}} \int_t^a

+

323       \biggl\lbrace g(y)^2 \int_t^a

+

324         f(x)^2 \,dx \biggr\rbrace \,dy

+

325 \end{multline}

+

Example 8-2-1. This uses the `leqno' option of the amsmath package, +that is assumed to put equation numbers on the left. In Tralics, this will +set the attribute equation-number = `left' of the document element.

+

In Tralics, if a formula has no \label, no number +is associated to it. Here we have a formula using the equation +environment, or a displaymath formula enclosed in a \[, \] pair.

+(a+b) 2 =a 2 +2ab+b 2 +sin 2 η+cos 2 η=1 +

Example 8-2-2. This uses options `reqno' option of the amsmath package +(equations to the right), it puts +equation-number = `left' on the document element. It uses also +`fleqn', that sets flushed-equation = `true'; in , you must +define \mathindent, here to 1pc, as the distance between the left margin +and the formula; ignored by Tralics. Same formulas as above, with a label +added, in order to show the difference.

+(a+b) 2 =a 2 +2ab+b 2 +sin 2 η+cos 2 η=1 +

Example 8-2-3. The code was modified in order to add labels; you see three 3 +numbers; one per environment, equation, align, and eqnarray. Also text added +between the groups of equations. First environment is equation:

+x 2 +y 2 =z 2 +

Second environment is align:

+x 2 +y 2 =z 2 x 3 +y 3 <z 3 +

+Third environment is eqnarray:

+x 2 +y 2 =z 2 x 3 +y 3 <z 3 +

Note: amsmath adds a new complexity to how spaces are handled: spaces after +\\ are no more ignored. This mechanism is not implemented in +Tralics.

+

Example 8-2-4. We modified the examples by adding a label; you can see that +this produces an equation number for equation*, () +as well as equation, ().

+n 2 +m 2 =k 2 +n p +m p k p p>2 +

Example 8-2-5. Translation of \multline +is a table, elements are centered, except first, last, and lines using +\shoveleft or \shoveright. +No & +should be given; last line should not be terminated with \\.

+FirstlineofamultlineCenteredMiddlelineArightMiddleAnothercenteredMiddleYetanothercenteredMiddleAleftMiddleLastlineofthemultline +

Example 8-2-6. This is the default behavior for tags.

+ tT a t a t f (t-x) 2 g (y) 2 d xdy= tT t a g (y) 2 t a f (x) 2 d xdy(2) +

Same formulas, with \multlinegap set to zero. This has no effect in +Tralics

+ tT a t a t f (t-x) 2 g (y) 2 d xdy= tT t a g (y) 2 t a f (x) 2 d xdy(2) +

From now on, we redefine the \tag command via \tagasattribute; +the second equation with a tag gives:

+sin 2 η+cos 2 η=1 +

The magic is that this uses \formulaattribute, a command added in +Tralics 2.9.5 that adds an attribute pair to the formula; our style sheet +handles a formula with a tag in the same way as a formula with an id (after +converting the id into a tag). There are four commands of the form \XXattribute +that add an attribute to an element under construction: the math formula, the +math expression, the current row, the current cell. In these cases +\mathattribute cannot be used (it adds an attribute to the last element +created). It is not possible to use \XMLaddatt in math mode, and it is +not possible to use this command after a math formula in order to add an +attribute (If the token that follows a display math formula is not a +\par, then \noindent is inserted, thus, if this token is +\XMLaddatt, the current element is an empty paragraph). Example

+

326 \begin{align}

+

327 \formulaattribute{tag}{8-2-3}

+

328 \thismathattribute{background}{white}\tableattribute{color}{black}

+

329 \rowattribute{mathvariant}{bold} x^2 + y^2+100 &=  z^2 \\

+

330 \cellattribute{columnalign}{left}  x^3 + y^3+1 &<  z^3

+

331 \end{align}

+

Translation (bold attribute ignored in the Pdf version):

+x 2 +y 2 +100=z 2 x 3 +y 3 +1<z 3 +

332 \begin{equation} \begin{split} % 8-2-7

+

333  (a + b)^4

+

334    &= (a + b)^2 (a + b)^2      \\

+

335    &= (a^2 + 2ab + b^2)   (a^2 + 2ab + b^2)        \\

+

336    &= a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4

+

337  \end{split}\end{equation}

+

338 \begin{equation} \begin{split} % 8-2-8

+

339   (a + b)^3 &= (a + b) (a + b)^2        \\

+

340             &= (a + b)(a^2 + 2ab + b^2) \\

+

341             &= a^3 + 3a^2b + 3ab^2 + b^3

+

342  \end{split}\end{equation}

+

Example 8.2.7 Single equation on several lines with alignment

+(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +

Example 8.2.8. The companion explains that the amsmath +package can be loaded +with options `centertags' or `tbtags'. In the first case, tags centered with +the formula (left or right), in the second case, tags are on the first line +(on the left) or last line (on the right). By default, Tralics does +nothing, and in the case of `tbtags', it sets split-tags = `tb' on the +root element.

+(a+b) 3 =(a+b)(a+b) 2 =(a+b)(a 2 +2ab+b 2 )=a 3 +3a 2 b+3ab 2 +b 3 +

343 \newcommand\relphantom[1]{\mathrel{\phantom{#1}}}

+

344 \newcommand\ve{\varepsilon}  \newcommand\tve{t_{\varepsilon}}

+

345 \newcommand\vf{\varphi}      \newcommand\yvf{y_{\varphi}}

+

346 \newcommand\bfE{\mathbf{E}}

+

347  

+

348 \begin{equation} \begin{split}

+

349   f_{h, \ve}(x, y)

+

350     &= \ve \bfE_{x, y} \int_0^{\tve} L_{x, \yvf(\ve u)} \vf(x) \,du  \\

+

351     &= h \int L_{x, z} \vf(x) \rho_x(dz)                             \\

+

352     &\relphantom{=} {} + h \biggl[

+

353        \frac{1}{\tve}

+

354        \biggl( \bfE_{y} \int_0^{\tve}  L_{x, y^x(s)} \vf(x) \,ds

+

355                - \tve \int L_{x, z} \vf(x) \rho_x(dz)      \biggr) + \\

+

356     &\relphantom{=} \phantom{{} + h \biggl[ }

+

357        \frac{1}{\tve}

+

358        \biggl( \bfE_{y} \int_0^{\tve}  L_{x, y^x(s)} \vf(x) \,ds

+

359                - \bfE_{x, y} \int_0^{\tve} L_{x, \yvf(\ve s)}

+

360                                             \vf(x) \,ds    \biggr) \biggr]

+

361 \end{split} \end{equation}

+

Example 8-2-9

+f h,ϵ (x,y)=ϵE x,y 0 t ϵ L x,y φ (ϵu) φ(x)du=hL x,z φ(x)ρ x (dz)=+h[1 t ϵ E y 0 t ϵ L x,y x (s) φ (x) d s - t ϵ L x,z φ (x) ρ x (dz)+=+h[1 t ϵ E y 0 t ϵ L x,y x (s) φ (x) d s - E x,y 0 t ϵ L x,y φ (ϵs) φ (x) d s] +

362 \begin{gather}

+

363   (a + b)^2 = a^2 + 2ab + b^2          \\

+

364   (a + b) \cdot (a - b) = a^2 - b^2

+

365 \end{gather}

+

Example 8-2-10, equation groups without alignment.

+(a+b) 2 =a 2 +2ab+b 2 (a+b)·(a-b)=a 2 -b 2 +

366 \begin{gather}

+

367   D(a,r) \equiv \{ z \in \mathbf{C}   \colon |z - a| < r \}    \notag \\

+

368   \operatorname{seg} (a, r) \equiv    \{ z \in \mathbf{C} \colon

+

369       \Im z < \Im a, \ |z - a| < r \}    \\

+

370     C (E, \theta, r) \equiv    \bigcup_{e \in E} c (e, \theta, r)

+

371 \end{gather}

+

Example 8-2-11

+D(a,r){zC:|z-a|<r}seg(a,r){zC:z<a,|z-a|<r}C(E,θ,r) eE c(e,θ,r) +

372 \begin{align}

+

373   (a + b)^3  &= (a + b) (a + b)^2        \\

+

374              &= (a + b)(a^2 + 2ab + b^2) \\

+

375              &= a^3 + 3a^2b + 3ab^2 + b^3

+

376 \end{align}

+

377 \begin{align} x^2  + y^2 & = 1 \\ x  & = \sqrt{1-y^2}\end{align}

+

Example 8-2-12

+(a+b) 3 =(a+b)(a+b) 2 =(a+b)(a 2 +2ab+b 2 )=a 3 +3a 2 b+3ab 2 +b 3 +

+and

+x 2 +y 2 =1x=1-y 2 +

378 \begin{align}

+

379  \text{Compare } x^2 + y^2 &= 1 &  x^3 + y^3 &= 1 \\

+

380   x &= \sqrt   {1-y^2} & x &= \sqrt[3]{1-y^3}

+

381 \end{align}

+

382 \begin{align}

+

383 x&= y & X  &= Y  &a  &= b+c \\

+

384 x' &= y'& X' &= Y' &a' &= b\\

+

385  x + x' &= y + y'  &  X + X' &= Y + Y' & a'b &= c'b

+

386 \end{align}

+

Example 8-2-13. +This example has two column-pairs.

+Comparex 2 +y 2 =1x 3 +y 3 =1x=1-y 2 x=1-y 3 3 +

+This example has three column-pairs.

+x=yX=Ya=b+cx ' =y ' X ' =Y ' a ' =bx+x ' =y+y ' X+X ' =Y+Y ' a ' b=c ' b +

387 \begin{flalign}  \text{Compare }

+

388   x^2 + y^2 &= 1               &  x^3 + y^3 &= 1               \\

+

389   x         &= \sqrt   {1-y^2} &  x         &= \sqrt[3]{1-y^3}

+

390 \end{flalign}

+

391 \begin{flalign}

+

392     x    &= y      & X  &= Y  &      a  &= b+c               \\

+

393     x'   &= y'     & X' &= Y' &      a' &= b                 \\

+

394   x + x' &= y + y'            &  X + X' &= Y + Y' & a'b &= c'b

+

395 \end{flalign}

+

Example 8-2-14 +This example has two column-pairs.

+Comparex 2 +y 2 =1x 3 +y 3 =1x=1-y 2 x=1-y 3 3 +

+This example has three column-pairs.

+x=yX=Ya=b+cx ' =y ' X ' =Y ' a ' =bx+x ' =y+y ' X+X ' =Y+Y ' a ' b=c ' b +

396 \renewcommand\minalignsep{0pt}

+

397 \begin{align}    \text{Compare }

+

398   x^2 + y^2 &= 1               &  x^3 + y^3 &= 1              \\

+

399   x         &= \sqrt   {1-y^2} &  x         &= \sqrt[3]{1-y^3}

+

400 \end{align}

+

401 \renewcommand\minalignsep{15pt}

+

402 \begin{flalign}

+

403     x    &= y      & X  &= Y  &      a  &= b+c              \\

+

404     x'   &= y'     & X' &= Y' &      a' &= b                \\

+

405   x + x' &= y + y'            &  X + X' &= Y + Y' & a'b &= c'b

+

406 \end{flalign}

+

Example 8-2-15 +This example has two column-pairs.

+Comparex 2 +y 2 =1x 3 +y 3 =1x=1-y 2 x=1-y 3 3 +

+This example has three column-pairs.

+x=yX=Ya=b+cx ' =y ' X ' =Y ' a ' =bx+x ' =y+y ' X+X ' =Y+Y ' a ' b=c ' b +

407 \renewcommand\minalignsep{2em}

+

408 \begin{align}

+

409   x      &= y      && \text{by hypothesis} \\

+

410       x' &= y'     && \text{by definition} \\

+

411   x + x' &= y + y' && \text{by Axiom 1}

+

412 \end{align}

+

Example 8-2-16

+x=ybyhypothesisx ' =y ' bydefinitionx+x ' =y+y ' byAxiom1 +

413 \begin{equation}

+

414 \begin{aligned}

+

415   x^2 + y^2  &= 1 \\ x &= \sqrt{1-y^2} \\ \text{and also }y &= \sqrt{1-x^2}

+

416 \end{aligned}               \qquad

+

417 \begin{gathered}

+

418  (a + b)^2 = a^2 + 2ab + b^2    \\ (a + b) \cdot (a - b) = a^2 - b^2

+

419 \end{gathered}      \end{equation}

+

Example 8-2-17

+x 2 +y 2 =1x=1-y 2 andalsoy=1-x 2 (a+b) 2 =a 2 +2ab+b 2 (a+b)·(a-b)=a 2 -b 2 +

420 \begin{equation}

+

421 \begin{aligned}[b]

+

422   x^2 + y^2  &= 1\\ x &= \sqrt{1-y^2}    \\ \text{and also }y &= \sqrt{1-x^2}

+

423 \end{aligned}               \qquad

+

424 \begin{gathered}[t]

+

425  (a + b)^2 = a^2 + 2ab + b^2    \\ (a + b) \cdot (a - b) = a^2 - b^2

+

426 \end{gathered}\end{equation}

+

Example 8-2-18 We should do something with the optional argument

+x 2 +y 2 =1x=1-y 2 andalsoy=1-x 2 (a+b) 2 =a 2 +2ab+b 2 (a+b)·(a-b)=a 2 -b 2 +

427 \newenvironment{rcase}{\left.\begin{aligned}} {\end{aligned}\right\rbrace}

+

428 \begin{equation*}

+

429   \begin{rcase}

+

430     B' &= -\partial\times E  \\  E' &=  \partial\times B - 4\pi j \,

+

431   \end{rcase}

+

432   \quad \text {Maxwell's equations}

+

433 \end{equation*}

+

434  

+

Example 8-2-19Translation/rendering of apostrophe not always correct

+B ' =-×EE ' =×B-4πjMaxwell'sequations +

435 \renewcommand\minalignsep{5pt}

+

436 \begin{equation} \begin{aligned}

+

437   V_j &= v_j &  X_i &= x_i - q_i x_j &      &= u_j + \sum_{i\ne j} q_i \\

+

438   V_i &= v_i - q_i v_j &  X_j &= x_j &  U_i &= u_i

+

439 \end{aligned} \end{equation}

+

Example 8-2-20

+V j =v j X i =x i -q i x j =u j + ij q i V i =v i -q i v j X j =x j U i =u i +

440 \begin{align}

+

441   A_1 &= N_0 (\lambda ; \Omega') -  \phi ( \lambda ; \Omega')   \\

+

442   A_2 &= \phi (\lambda ; \Omega') \phi (\lambda ; \Omega)     \\

+

443 \intertext{and finally}

+

444   A_3 &= \mathcal{N} (\lambda ; \omega)

+

445 \end{align}

+

Example 8-2-21

+A 1 =N 0 (λ;Ω ' )-ϕ(λ;Ω ' )A 2 =ϕ(λ;Ω ' )ϕ(λ;Ω)andfinallyA 3 =N(λ;ω) +

Example 8-2-22, 8-2-23, 8-2-24 explain that spacing around equations can be +wrong; we omit them.

+

446 \begin{align}

+

447   x^2+y^2 &= z^2 \label{eq:A}            \\

+

448   x^3+y^3 &= z^3 \notag                  \\

+

449   x^4+y^4 &= r^4 \tag{$*$}               \\

+

450   x^5+y^5 &= r^5 \tag*{$*$}              \\

+

451   x^6+y^6 &= r^6 \tag{\ref{eq:A}$'$}     \\

+

452       A_1 &= N_0 (\lambda ; \Omega')

+

453              - \phi ( \lambda ; \Omega') \\

+

454       A_2 &= \phi (\lambda ; \Omega')

+

455              \, \phi (\lambda ; \Omega)

+

456              \tag*{ALSO (\theequation)}  \\

+

457       A_3 &= \mathcal{N} (\lambda ; \omega)

+

458 \end{align}

+

Example 8-2-25. In the Companion, first equation is numbered (1), +second equation has no number, third is (*), then come *, +(1'), (2), ALSO (2) and (3). Since Tralics does not +compute equation numbers, you will not see (1), (2), (3). +Since (1') is obtained by a reference to the first equation, the whole +set of equations is numbered, namely (). It is currently impossible +to use a reference, we locally change \ref, so that it produces a +number, here 17. This is also the current value of the equation counter. +Hence, the full tag, concatenation of all four tags is +*,*,17x,ALSO (17); we have replaced the apostrophe by x, because +of a bug in current Tralics. This full tag is put on the math formula.

+

Note: the style sheet that converts XML to HTML attributes a number +to each equation that has a label, and \ref uses this number. If the +equation has a tag, no number should be attributed, and \ref should use +the tag. This might change.

+

Note: uses \text to format the tag, and as a +consequence, spaces are not ignored. In Tralics, nothing special is done, and +they are ignored. Should be fixed some day.

+x 2 +y 2 =z 2 x 3 +y 3 =z 3 x 4 +y 4 =r 4 x 5 +y 5 =r 5 x 6 +y 6 =r 6 A 1 =N 0 (λ;Ω ' )-ϕ(λ;Ω ' )A 2 =ϕ(λ;Ω ' )ϕ(λ;Ω)A 3 =N(λ;ω) +

Same example, with default behavior of \tag. Note that the equation +number is still the same. The equation has an another label, it is now +equation (17), but \ref is still defined to be 17.

+x 2 +y 2 =z 2 x 3 +y 3 =z 3 x 4 +y 4 =r 4 (*)x 5 +y 5 =r 5 *x 6 +y 6 =r 6 (17 ' )A 1 =N 0 (λ;Ω ' )-ϕ(λ;Ω ' )A 2 =ϕ(λ;Ω ' )ϕ(λ;Ω) ALSO (17)A 3 =N(λ;ω) +

459 \begin{equation}  \begin{split} \label{e-8-2-26}

+

460   \lvert I_2 \rvert  &=    \left\lvert \int_{0}^T \psi(t)

+

461       \left\{  u(a, t) - \int_{\gamma(t)}^a \frac{d\theta}{k}

+

462         (\theta, t) \int_{a}^\theta c (\xi) u_t (\xi, t) \,d\xi

+

463       \right\} dt \right\rvert                                     \\

+

464                      &\le  C_6  \Biggl\lvert

+

465       \left\lvert f \int_\Omega \left\lvert

+

466           \widetilde{S}^{-1,0}_{a,-} W_2(\Omega, \Gamma_l)

+

467         \right\rvert \ \right\rvert

+

468       \left\lvert \lvert u \rvert

+

469         \overset{\circ}{\to} W_2^{\widetilde{A}} (\Omega; \Gamma_r,T)

+

470       \right\rvert              \Biggr\rvert

+

471 \end{split} \end{equation}

+

Example 8-2-26. The book explains that the tag is not correctly positioned. +We modified the example by adding a label, and this gives an equation number +in the HTML file. This number is vertically centered, whatever the size of +the formula.

+|I 2 |= 0 T ψ(t)u(a,t)- γ(t) a dθ k(θ,t) a θ c(ξ)u t (ξ,t)dξdtC 6 f Ω S ˜ a,- -1,0 W 2 (Ω,Γ l ) |u| W 2 A ˜ (Ω;Γ r ,T) +

Example 8-2-27. Equation () should be the same as +(); but in order to test our algorithm we have replaced some +\lvert and \rvert by \lVert and \rVert, that are the same +as \Vert, but declared as mathopen and mathclose symbols

+|I 2 |= 0 T ψ(t)u(a,t)- γ(t) a dθ k(θ,t) a θ c(ξ)u t (ξ,t)dξdtC 6 f Ω S ˜ a,- -1,0 W 2 (Ω,Γ l ) |u| W 2 A ˜ (Ω;Γ r ,T) +

472 \begin{gather}   \raisetag{-40pt}

+

473  \text{The sign function: \ } \mathcal{S}(x) =

+

474  \begin{cases}-1   &  x < 0 \\ 0   &  x = 0 \\ 1   &  x > 0\end{cases}

+

475 \end{gather}

+

Example 8-2-28, showing the command \raisetag. +It is defined as doing nothing in Tralics (the tag, i.e., the equation +number, is inserted by the style sheet that converts from XML to HTML.) +We have redefined here the command as follows

+

476 \def\raisetag#1{%

+

477 \dimen0=#1\relax

+

478 \ifdim\dimen0<0pt

+

479   \dimen0=-\dimen0

+

480    \formulaattribute{tag-down}{\the\dimen0}%

+

481 \else

+

482 \formulaattribute{tag-up}{\the\dimen0}\fi}

+

Thus \raisetag with a value of -10pt will add +tag-down = `10pt' to the formula element. In this case, the style sheet +adds style = `padding-top:10pt' to the cell containing the equation +number. In the case of a positive value, padding-bottom is used instead. +In this example, we use 40pt.

+Thesignfunction:S(x)=-1x<00x=01x>0 +

483 begin{subequations}  \label{eq:1}

+

484 \begin{align}  f  &= g            \label{eq:1A} \\

+

485                f' &= g'           \label{eq:1B} \\

+

486     \mathcal{L}f  &= \mathcal{L}g \label{eq:1C}

+

487 \end{align}

+

488 \end{subequations}

+

489 \begin{subequations}  \label{eq:2}

+

490 \renewcommand\theequation{\theparentequation\roman{equation}}

+

491 \begin{align}  f  &= g            \label{eq:2A} \\

+

492                f' &= g'           \label{eq:2B} \\

+

493     \mathcal{L}f  &= \mathcal{L}g + K  \label{eq:2C}

+

494 \end{align}

+

495 \end{subequations}

+

496 Note the relationship between~\eqref{eq:1}

+

497 and~\eqref{eq:2}: only~\ref{eq:1C} and~\ref{eq:2C} differ.

+

Example 8-2-29: the amsmath package provides a subequations environment +to support “equation subnumbering†with tags of the form (2a), (2b), (2c), +and so on. All the tagged equations within it use this sub-numbering scheme +based on two normal counters parentequation and equation. +First group, with only labels eq:1 and eq1:C

+f=gf ' =g ' Lf=Lg +

+ +The Tralics implementation is trivial: the environment does nothing. +Thus, the \label command in the subequations corresponds to the +current section. Second group, with only labels eq:2 and eq2:C.

+f=gf ' =g ' Lf=Lg+K +

+ +We have removed two \labels from the align, +because it produces a single equation number and accepts a single label. +Thus, the text after the equations reads: +Note the relationship between () +and (): only  and  differ.

+
+Matrix-like environments +

498 \begin{equation}    P_{r - j} =

+

499  \begin{cases}

+

500     0   &  \text{if $r - j$ is odd,} \\

+

501     r! \, (-1)^{(r - j)/2}

+

502         &  \text{if $r - j$ is even.}

+

503  \end{cases}                \end{equation}

+

Example 8-3-1

+P r-j =0ifr-jisodd,r!(-1) (r-j)/2 ifr-jiseven. +

504 \begin{gather*}

+

505   \begin{matrix}  0 &  1 \\ 1 &  0 \end{matrix}  \quad

+

506   \begin{pmatrix} 0 & -i \\ i &  0 \end{pmatrix} \\

+

507   \begin{bmatrix} 0 & -1 \\ 1 &  0 \end{bmatrix} \quad

+

508   \begin{Bmatrix} 1 &  0 \\ 0 & -1 \end{Bmatrix} \\

+

509   \begin{vmatrix} a &  b \\ c &  d \end{vmatrix} \quad

+

510   \begin{Vmatrix} i &  0 \\ 0 & -i \end{Vmatrix}

+

511 \end{gather*}

+

Example 8-3-2, using a single equationThe delimiter for Vmatrix is +badly rendered by Amaya

+01100-ii00-110100-1abcdi00-i +

512 \newcommand\hdotsfor[2][x]{\multicolumn{5}{c}{.\ .\ .\ .\ .\ .\ .\ .\ .}}

+

513 \setcounter{MaxMatrixCols}{20}

+

514 \[

+

515  \begin{Vmatrix}

+

516   \,a&b&c&d&e&f&g&h&i&j &\cdots\,{} \\

+

517      &a&b&c&d&e&f&g&h&i &\cdots\,{} \\

+

518      & &a&b&c&d&e&f&g&h &\cdots\,{} \\

+

519      & & &a&b&c&d&e&f&g &\cdots\,{} \\

+

520      & & & &\ddots&\ddots&\hdotsfor[2]{5}%\,{}

+

521  \end{Vmatrix} \]

+

Example 8-3-3. +The example uses \hdotsfor, a command equivalent to +\multicolumn{5}{c}{leaders}. Leaders cannot be +implemented in MathML, so that the command is redefined in this case.

+abcdefghijabcdefghiabcdefghabcdefg......... +

In the example above, there was a \,{} at the end of each +line. We had to remove it on the last line, because Tralics complains if a +cell contains \multicolumns and additional commands. The following +example is refused by Tralics; but is happy with it, but x is typeset +outside math mode. Thus the question: what is the exact effect of the last +\,{} in the case?

+

522 $\begin{array}{ccc}

+

523 111&222&333\\

+

524 \hdotsfor{2}x&t\\

+

525 \end{array}$

+

Example 8-3-4. This example uses the environment smallmatrix, which is +defined by Tralics to be the same as matrix, i.e., a matrix without +delimiters, 100-1 +the same with \left and \right parentheses +100-1. +There is some text after the matrix. It happens that matrices in text style +are badly rendered by Firefox. There is a huge amount of white space on the +left of each column.

+

526 \begin{gather}

+

527   \sum_{\substack{0 \le i \le m \\ 0 < j < n}} P(i, j) \\

+

528   \sum_{\begin{subarray}{l}  i \in \Lambda   \\

+

529                              0 \le i \le m   \\

+

530                              0 < j < n

+

531         \end{subarray}}  P(i, j)

+

532 \end{gather}

+

Example 8-3-5. The style of the subarray should be smaller

+ 0im0<j<n P(i,j) iΛ0im0<j<n P(i,j) +

533 \DeclareMathOperator\add{add}

+

534 \DeclareMathOperator\cf {cf}

+

535 \DeclareMathOperator\cov{cov}

+

536 \DeclareMathOperator\non{non}

+

537 \DeclareMathOperator\End{End}

+

538 \[ \begin{CD}

+

539      \cov (L) @>>> \non (K) @>>> \cf (K)  \\

+

540        @VVV          @AAA          @AAA   \\

+

541      \add (L) @>>> \add (K) @>>> \cov (K) \\

+

542    \end{CD} \]

+

Example 8-3-6. You must be careful with the CD environment, because the +at-sign is an active character, that reads some text, depending on the +character that follows; more examples are given below.

+cov(L) non(K) cf(K)add(L) add(K) cov(K) +

543 \[ \begin{CD}

+

544      S^{W_\Lambda}\otimes T @>j>>      T       \\

+

545       @VVV                        @VV{\End P}V \\

+

546     (S \otimes T)/I         @=   (Z\otimes T)/J

+

547    \end{CD} \]

+

Example 8-3-7

+S W Λ T jTEndPEndP(ST)/I=(ZT)/J +

Example 8-3-8. This uses \longrightarrow, that produces character +U+27F9, unknown to FM.

+S W Λ T jTEndPEndP(ST)/I=(ZT)/J +

548 \[ \mathcal{Q} =

+

549 \begin{delarray}[t] ( {cc} ) X & Y \end{delarray}

+

550 \begin{delarray}[t] [ {cc} ] A & B \\ C & D   \end{delarray}

+

551 \begin{delarray}[b] \lgroup{cc}\rgroup L \\ M \end{delarray}

+

552 \]

+

Example 8-3-9. This example uses the delarray package that changes +the meaning of the array environment. In the current version of Tralics, +there is no \array command, hence no possibility to redefine it. +The delarray.plt file defines a delarray environment that is +used here.

+Q=XYABCDLM +
+Compound structures and decorations +

553 \[   0 \xleftarrow [\zeta]{}  F \times \Delta (n - 1)

+

554      \xrightarrow {\partial_0 \alpha(b)} E^{\partial_0 b}\]

+

Example 8-4-1

+0 ζF×Δ(n-1) 0 α(b)E 0 b +

555 \begin{equation*}

+

556 \cfrac {1}{\sqrt{2} +

+

557  \cfrac {1}{\sqrt{3} +

+

558   \cfrac {1}{\sqrt{4} +

+

559    \cfrac[r] {1}{\sqrt{5} +

+

560     \cfrac[l] {1}{\sqrt{6} + \dotsb }

+

561    }}}}

+

562 \end{equation*}

+

Example 8-4-2

+1 2+1 3+1 4+1 5+1 6+ +

563 \begin{equation} \boxed { W_t - F \subseteq V(P_i) \subseteq W_t }\end{equation}

+

Example 8-4-3

+W t -FV(P i )W t +

564 \[  \sum_{i=1}^n \qquad \int_0^\infty \qquad \lim_{n \to 0} \]

+

565 Text: $\sum_{i=1}^n$, $\int_0^\infty$, $\lim_{n \to 0}$.

+

Example 8-4-4

+ i=1 n 0 lim n0 +

Text: i=1 n , 0 , lim n0 .

+

566 \[

+

567    \sum\nolimits_{i=1}^n \qquad \int\limits_0^\infty

+

568    \qquad  \lim\displaylimits_{n \to 0}

+

569 \]

+

570 Text: $\sum\nolimits_{i=1}^n$, $\int\limits_0^\infty$,

+

571 $\lim\displaylimits_{n \to 0}$.

+

Example 8-4-5 (limits placement is wrong in the Pdf version, text style).

+ i=1 n 0 lim n0 +

Text: i=1 n , 0 , +lim n0 .

+

572 \begin{gather*}

+

573  \xiint     \limits _V \mu(v,w)   \,du \,dv  \quad

+

574  \xiiint    \limits _V \mu(u,v,w)   \,du \,dv \,dw  \quad

+

575  \xiiiint   \limits _V \mu(t,u,v,w)   \,dt \,du \,dv \,dw  \\

+

576  \idotsint \limits _V \mu(z_1, \dots, z_k)   \,\mathbf{dz}\\

+

577  \iint     \limits _V \mu(v,w)   \,du \,dv \qquad

+

578  \iiint    \limits _V \mu(u,v,w)   \,du \,dv \,dw  \qquad

+

579  \iiiint   \limits _V \mu(t,u,v,w)    \,dt \,du \,dv \,dw  \\ \textstyle

+

580  \iint     \limits _V \mu(v,w)   \,du \,dv \qquad

+

581  \iiint    \limits _V \mu(u,v,w)   \,du \,dv \,dw  \qquad

+

582  \iiiint   \limits _V \mu(t,u,v,w)   \,dt \,du \,dv \,dw

+

583 \end{gather*}

+

Example 8-4-6. Modified, using \xiint, \xiiint, \xiiiint +command that produce Unicode character U+222c, U+222D and U+2A0C, +or simple integrals.

+ V μ(v,w)dudv V μ(u,v,w)dudvdw V μ(t,u,v,w)dtdudvdw... V μ(z 1 ,,z k )dz V μ(v,w)dudv V μ(u,v,w)dudvdw V μ(t,u,v,w)dtdudvdw V μ(v,w)dudv V μ(u,v,w)dudvdw V μ(t,u,v,w)dtdudvdw +

584 \begin{align*}

+

585   u & \equiv v + 1 \mod{n^2}  \\

+

586   u & \equiv v + 1 \bmod{n^2} \\

+

587   u &   =    v + 1 \pmod{n^2} \\

+

588   u &   =    v + 1 \pod{n^2}

+

589 \end{align*}

+

590 The in-text layout: $ u = v + 1 \pmod{n^2} $

+

591 \begin{gather*}

+

592    (m \bmod n) = k^2 \, ; \quad

+

593   x \equiv y \pmod b \, ;     \\

+

594   x \equiv y \mod c \, ;  \quad

+

595   x \equiv y \pod d\, .

+

596 \end{gather*}

+

Example 8-4-7

+uv+1modn 2 uv+1modn 2 u=v+1(modn 2 )u=v+1(n 2 ) +

+The in-text layout: u=v+1(modn 2 )

+(mmodn)=k 2 ;xy(modb);xymodc;xy(d). +

597 \begin{equation} \frac{1}{k} \log_2 c(f)

+

598           \quad \tfrac{1}{k} \log_2 c(f) \end{equation}

+

599 Text: $ \sqrt{ \frac{1}{k} \log_2 c(f) } \quad

+

600         \sqrt{ \dfrac{1}{k} \log_2 c(f) }\, $.

+

Example 8-4-8

+1 klog 2 c(f)1 klog 2 c(f) +

Text: 1 klog 2 c(f)1 klog 2 c(f).

+

601 \begin{equation} \binom{k}{2} 2^{k - 1}

+

602           + \tbinom{k - 1}{2} 2^{k - 2} \end{equation}

+

603 Text: $ \binom{k}{2} 2^{k - 1} + \dbinom{k - 1}{2} 2^{k - 2} $.

+

604 $ \dot{S} \quad \ddot{P} \quad \dddot{Q} \quad \ddddot{R} $

+

Example 8-4-9

+k 22 k-1 +k-1 22 k-2 +

Text: k 22 k-1 +k-1 22 k-2 .

+

Example 8-4-10: Four dots above: character unknown by FM. +S ˙P ¨Q R

+

605 \[ \accentset{\ast}{X}                 \quad

+

606    \hat{\accentset{\star}{\hat h}}     \quad

+

607    \underaccent{\diamond}{\mathcal{M}} \quad

+

608    \undertilde{C}\quad\undertilde{M}\quad\undertilde{ABC} \]

+

Example 8-4-11. Commands \accentset and \underaccent +are defined in the amsmath.plt file, they produce a <munder> or +<mover> element, with attribute accent or mathaccent set to true. +Note that accents might be too big.

+X *h ^ ^M C ˜M ˜ABC ˜ +

609 $(xyz)\spdddot$ \quad $(xyz)\spddot$ \quad $(xyz)\spdot$

+

610 $(xyz)\spbreve$ \quad $(xyz)\spcheck$

+

611 $(xyz)\sphat$   \quad $(xyz)\sptilde$

+

Example 8-4-12. (breve and hat are invisible on Firefox, too high on Amaya). +(xyz) ...    (xyz) ..    (xyz) .    (xyz) ˘    (xyz)    (xyz) ^    (xyz)

+

612 \[ \overset{*}{X} > \underset{*}{X}

+

613      \iff \sideset{}{'}\sum_{a,b \in \mathbf{R^*}}

+

614                        \overset{a}{\underset{b}{X}} = X \]

+

Example 8-4-13. Commands \overset and \underset +are defined in the amsmath.plt file, they produce a <munder> or +<mover> element.

+X *>X *' a,bR * X b a=X +

615 \[ \sideset{_{i = 1}^n}{_{j = 2}^m}\prod_{k > 1}  \mathcal{T}_{i, j}^k \]

+

Example 8-4-14.

+j=2mi=1n k>1 T i,j k +
+Variable symbol commands +

616 A series $H_1, H_2, \dots, H_n$, a sum

+

617 $H_1 + H_2 + \dots + H_n$, an orthogonal product

+

618 $H_1 \times H_2 \times \dots \times H_n$.

+

619 A series $H_1, H_2, \dotsc\,$, a sum

+

620 $H_1 + H_2 + \dotsb\,$, an orthogonal product

+

621 $H_1 \times H_2 \times \dotsm\,$, and an infinite

+

622 integral:   \[ \int_{H_1} \int_{H_2} \dotsi \;  {-\Gamma}\, d\Theta \]

+

Example 8-5-1. +A series H 1 ,H 2 ,,H n , a sum +H 1 +H 2 ++H n , an orthogonal product +H 1 ×H 2 ××H n .

+

Example 8-5-2. +A series H 1 ,H 2 ,, a sum +H 1 +H 2 +, an orthogonal product +H 1 ×H 2 ×, and an infinite +integral:

+ H 1 H 2 -ΓdΘ +

623 \begin{align*}

+

624 \widehat  {\psi_\delta(t) E_t h} &= \widetilde   {\psi_\delta(t) E_t h}    \\

+

625 \overline  {\psi_\delta(t) E_t h}&= \underline   {\psi_\delta(t) E_t h}    \\

+

626 \overbrace      {\psi_\delta(t) E_t h}&= \underbrace  {\psi_\delta(t) E_t h}

+

627 & & \text{Do not change style}            \\

+

628 \overrightarrow {\psi_\delta(t) E_t h}&= \overleftarrow {\psi_\delta(t) E_t h}

+

629 & &   \text{Do not change style}     \\[-3pt]

+

630 & & & \text{without \textsf{amsmath}}     \\

+

631 \underrightarrow  {\psi_\delta(t) E_t h}

+

632 &= \underleftarrow  {\psi_\delta(t) E_t h}

+

633 & & \text{Do need \textsf{amsmath}}       \\

+

634 \overleftrightarrow {\psi_\delta(t) E_t h}

+

635 &=\underleftrightarrow{\psi_\delta(t) E_t h}

+

636 & & \text{Do need \textsf{amsmath}}

+

637 \end{align*}

+

Example 8-5-3

+ψ δ (t)E t h ^=ψ δ (t)E t h ˜ψ δ (t)E t h =ψ δ (t)E t h _ψ δ (t)E t h =ψ δ (t)E t h Donotchangestyleψ δ (t)E t h =ψ δ (t)E t h Donotchangestylewithoutamsmathψ δ (t)E t h =ψ δ (t)E t h Doneedamsmathψ δ (t)E t h =ψ δ (t)E t h Doneedamsmath +

638 \[   \sqrtsign{1 + \sqrtsign{1 + \sqrtsign{1 +

+

639       \sqrtsign{1 + \sqrtsign{1 + \sqrtsign{1 + x}}}}}} \]

+

Example 8-5-4

+1+1+1+1+1+1+x +Vertically extensible symbols +(() +( ) +{(} +\{ \} +( +\lVert \rVert +( +\langle \rangle +{(} +\lbrace \rbrace +|(| +\lvert \rvert +( +\lgroup \rgroup +[(] +[ ] +|( +| +( +\lmoustache \rmoustache +[(] +\lbrack \rbrack +|( +\vert +( +\Downarrow +( +\lceil \rceil +|( +\arrowvert +( +\Uparrow +( +\lfloor \rfloor +|( +\bracevert +( +\Updownarrow +( +\llbracket \rrbracket +( +\Arrowvert +( +\downarrow +/( +/ +( +\| +( +\uparrow +( +\backslash +( +\Vert +( +\updownarrow +( +. +( +\sqrtsign +
+
+Words in mathematics +Predefined operators and functions +arccos +\arccos +varcsin +\arcsin +arctan +\arctan +arg +\arg +cos +\cos +cosh +\cosh +cot +\cot +coth +\coth + +csc +\csc +deg +\deg +det +\det +dim +\dim + +exp +\exp +gcd +\gcd +hom +\hom +inf +\inf + +inj lim +\injlim +ker +\ker +lg +\lg +lim +\lim + +lim inf +\liminf +lim sup +\limsup +ln +\ln +log +\log + +max +\max +min +\min +Pr +\Pr +proj lim +\projlim + +sec +\sec +sin +\sin +sinh +\sinh +sup +\sup + +tan +\tan +tanh +\tanh +lim +\varinjlim +lim _ +\varliminf + +lim +\varlimsup +lim +\varprojlim +
+

640 \begin{gather}

+

641   \text{Also, if } \Delta_{\text{max up}}

+

642            = \Delta_{\text{min down}} \notag \\

+

643   \text{(for all ups and downs) then} \notag \\

+

644   \Delta_{\text{sum of ups}}

+

645            = \Delta_{\text{sum of downs}}

+

646 \end{gather}

+

Example 8-6-1

+Also,ifΔ maxup =Δ mindown (forallupsanddowns)thenΔ sumofups =Δ sumofdowns +

647 \newcommand\abs[1]{\lvert#1\rvert}

+

648 \setlength\mathindent{0pt}

+

649 \begin{gather*}

+

650   \lim_{x \rightarrow 0} \frac{ \sin^2(x) }{ x^2 } = 1 \\

+

651   \varliminf_{n \rightarrow \infty}

+

652     \abs{a_{n+1}} / \abs{a_n} = 0                      \\

+

653  %{ JG

+

654  \varinjlim (m_i^\lambda \cdot M)^*

+

655   %} JG

+

656 \le \varprojlim_{A/p \rightarrow \lambda(A)}A_p \le 0

+

657 \end{gather*}

+

Example 8-6-2. Braces uncommented out for the last equation.

+lim x0 sin 2 (x) x 2 =1lim _ n |a n+1 |/|a n |=0lim (m i λ ·M) * lim A/pλ(A) A p 0lim (m i λ ·M) * lim A/pλ(A) A p 0 +

658 \let\abs\relax

+

659 \DeclareMathOperator \meas    {meas}

+

660 \DeclareMathOperator*\esssup  {ess \, sup}

+

661 \DeclareMathOperator*\supminus{sup - minus*}

+

662 \newcommand\abs [1]{\lvert#1\rvert}

+

663 \newcommand\norm[1]{\lVert#1\rVert}

+

664 \begin{gather*}

+

665   \norm{f}_\infty = \esssup_{x \in R^n} \abs{f(x)}  \\

+

666   \norm{f}_\infty = \smash{\esssup_{x \in R^n}} \abs{f(x)}  \\

+

667   \meas_1 \{ u \in R_+^1 \colon f^*(u)>\alpha \} =

+

668    \esssup_{x \in R^i} \; \meas_i

+

669      \{ u \in R^n \colon \abs{f(u)} \geq \alpha \}  \\

+

670   \quad (\forall \alpha \in \supminus_{f^*} R_{*+})

+

671 \end{gather*}

+

Example 8-6-3. We removed the line break between equations 2 and 3. Note that +an asterisk is printed as a normal character. Note the use of the \smash +command:

+f =ess sup xR n |f(x)|f =ess sup xR n |f(x)|meas 1 {uR + 1 :f * (u)>α}=ess sup xR i meas i {uR n :|f(u)|α}(αsup-minus* f * R *+ ) +

672 \[\varlimsup_{n\to\infty}\calQ (u_n, u_n - u^{\#}) \ge \csc (\calQ' (u^{\#})) \]

+

Example 8-6-4

+lim n Q(u n ,u n -u # )cosec(Q ' (u # )) +
+Fine tuning the mathematical layout +

673 \let\LB\relax\let\RB\relax\let\DS\relax

+

674 \def\Test{

+

675    b                       %% D

+

676     ^0                     %% S

+

677    +                       %% D

+

678    \frac{\LB(k + p)        %% T

+

679           _{j'}\RB         %% S'

+

680          \DS% \displaystyle

+

681          \pm               %% T  [D]

+

682          \frac{(f + q)     %% S  [T]

+

683                 ^{(pk)     %% SS [S]

+

684                    ^y      %% SS

+

685                    _{j'}}} %% SS'

+

686               {(h + y)}}   %% S' [T']

+

687         {(l + q)           %% T'

+

688           ^{(pk)}}         %% S'

+

689 }

+

690 \[\Test\qquad \let\LB={ \let \RB=} \Test \]

+

Example 8-7-1. Original version, plus version with braces added.

+b 0 +(k+p) j ' ±(f+q) (pk) j ' y (h+y) (l+q) (pk) b 0 +(k+p) j ' ±(f+q) (pk) j ' y (h+y) (l+q) (pk) +

Example 8-7-2. Same, with \DS replaced by \displaystyle

+b 0 +(k+p) j ' ±(f+q) (pk) j ' y (h+y) (l+q) (pk) b 0 +(k+p) j ' ±(f+q) (pk) j ' y (h+y) (l+q) (pk) +

691 \[ \biggl( \mathbf{E}_{y} \int_0^{t_\varepsilon}

+

692    L_{x, y^x(s)} \varphi(x)\, ds \biggr) \]

+

Example 8-7-3. This demonstrates that commands like \Large do affect the +size delimiters as \biggl. In Tralics, translation of math formulas is +unaffected by font size commands. Thus, second part of example omitted.

+E y 0 t ϵ L x,y x (s) φ (x) d s +

693 \[

+

694    \sqrt[\beta]{k} \qquad

+

695    \sqrt[\leftroot{2}\uproot{4} \beta]{k} \qquad

+

696    \sqrt[\leftroot{1}\uproot{3} \beta]{k}

+

697 \]

+

Example 8-7-4 Commands \leftroot and \uproot implemented as no-op.

+k βk βk β +

698 $\sqrt{x} + \sqrt{y}            + \sqrt{z}$,

+

699 $\sqrt{x} + \sqrt{\mathstrut y} + \sqrt{z}$,

+

700 $\sqrt{x} + \sqrt{\smash{y}}    + \sqrt{z}$,

+

701 $\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$

+

Example 8-7-5, explaining smash. +x+y+z, +x+(y+z, +x+y+z, +x+y+z

+

More uses of smash (top, bottom, all):

+x+1 2+z,x+1 2+z,x+1 2+z,x+1 2+z. +

702 \[

+

703   f_p (x) =

+

704   \begin{cases}

+

705     \frac{1}{\smash[b]{p}}                & x = p  \\

+

706     \frac{\strut

+

707           \smash[t]{\frac{(1 - x)^{\frac{1}{2}} }

+

708                          { x - \sin (x - p)     } } }

+

709          {\sqrt{1 - p} \, \cos (x - p)}   & x \neq p

+

710   \end{cases}

+

711 \]

+

Example 8-7-6. The \strut above needed by amsmath, see TLC2.

+f p (x)=1 px=p((1-x) 1 2 x-sin(x-p) 1-pcos(x-p)xp +

712 \[

+

713    \sqrt{ \frac{a+b}{x_j} }           \quad

+

714    \sqrt{ \frac{a+b}{\smash{x_j}} }   \quad

+

715    \sqrt{ \frac{a+b}{{}\smash{x_j}} } \quad

+

716    \sqrt{ \frac{a+b}{\smash{x_j+b}} }

+

717 \]

+

Example 8-7-7. The empty group above needed by amsmath, see TLC2.

+a+b x j a+b x j a+b x j a+b x j +b +
+Fonts in formulas +

718 $ \forall n \in \mathbb{N} : \mathfrak{M}_n \leq \mathfrak{A} $

+

719 \DeclareMathAlphabet\mathbb{U}{fplmbb}{m}{n}

+

720 $ \lbrace n,m \in \mathbb{N} \mid  \mathfrak{N}_{n,m} \rbrace $

+

721 \DeclareMathAlphabet\mathscr{T1}{hlcw}{m}{it}

+

722 $A_B \neq \mathscr{A}_\mathscr{B} \neq \mathcal{A}_\mathcal{B}$

+

Example 8-8-1 +nN:M n A

+

Example 8-8-2 + +{n,mNN n,m }

+

Example 8-8-3 +The \DeclareMathAlphabet command takes five arguments and defines the +first one to be \relax. + +A B A B A B

+

723 \newcommand\bfB{\mathbf{B}}   \newcommand\bfx{\mathbf{x}}

+

724 \bmdefine\bpi{\pi}            \bmdefine\binfty{\infty}

+

725 \section{The bold equivalence

+

726   $\sum_{j < B} \prod_\lambda : \bm{\sum_{x_j} \prod_\lambda}$}

+

727 \begin{gather}

+

728   B_\infty + \pi B_1 \sim  \bfB_{\binfty} \bm{+}\bpi \bfB_{\bm{1}}

+

729     \bm {\sim B_\infty + \pi B_1}                                   \\

+

730   B_\binfty + \bpi B_{\bm{1}} \bm{\in} \bm{\biggl\lbrace}

+

731     (\bfB, \bfx) : \frac {\partial \bfB}{\partial \bfx}

+

732     \bm{\lnapprox} \bm{1} \bm{\biggr\rbrace}

+

733 \end{gather}

+

Example 8-8-4. Currently \bndefine is \def and \bm is \mathbf.

+
+The bold equivalence + j<B λ : x j λ +B +πB 1 B +πB 1 B +πB 1 B +πB 1 (B,x) : B x 1 +

Example 8-8-5: same code different packages

+

734 $\bm{\Biggl\lbrace\biggl\lbrace\Bigl\lbrace\bigl\lbrace \lbrace

+

735      \mathcal{Q}

+

736      \rangle \bigr\rangle\Bigr\rangle\biggr\rangle\Biggr\rangle}$

+

Example 8-8-6 +{ Q

+

Example 8-8-7: same code different packages.

+

737 $ \bm{\sqrt[2]{x \times \alpha}} $  but

+

738 $\let\unboldmath\relax

+

739  \bm{\sqrt[2]{x \mathbin{\mbox{\unboldmath$\times$}} \alpha}} $

+

740   or the similar

+

741 \def\sqrtsign{\sqrt{}}

+

742 $ \bm{\sqrtsign}{\bm{x} \times \bm{\alpha}} $

+

743 %% $\bf \sqrt \it {\bf x \IT \times \bf \alpha \IT } $ see below A

+

744 %% $\bf {\sqrt} \it {\bf {x} \IT \times \bf {\alpha} \IT } $ see below B

+

Example 8-8-8. Second formula modified: you cannot use \unboldmath. Third +formula: the command \sqrtsign is identical to \sqrt; you may wonder +what the argument is. Currently \bm is the same as \mathbf, it takes +one argument and typesets it in bold face font. Hence, Tralics executes the +line shown above, marked `see below A'. Here \bf and \it are the +tokens inserted by the \bm command corresponding to the new and old font +(in reality, these tokens have complicated names). +Thus, the argument of \sqrt is the \it +command. Note that the \sqrt command uses a local group (is this good +idea?), so that the \it command changes font locally; said otherwise, +current font remains bold, and \IT is \bf. It is a wonder that this +works. We noticed that font change commands like \mathbf typeset +their arguments in a group, and modified the Tralics code; thus the +equivalent of line marked `see below B' is executed. Suddenly \sqrt +looses its argument. For this reason, we changed the command \sqrtsign +to \sqrt{}. The example is +x×α 2 but +x×α 2 +or the similar +x×α

+

745 \bmdefine\bhat{\hat}

+

746 % This does not work

+

747 %$\hat a \neq \bm{\hat a} \neq \bm{\hat a} = \bhat a \neq \bm{\widehat a}$

+

748 $\hat a \neq \bm{\hat a} \neq \bm\hat a = \bhat a \neq \bm\widehat a$

+

Example 8-8-9 modified + +a ^a ^a ^=a ^a ^

+

749 \section{Sample page of mathematical typesetting}

+

750  

+

751 First some large operators

+

752 both in text: \( \iiint\limits_{\mathcal{Q}}

+

753 f(x,y,z)\,dx\,dy\,dz \) and

+

754 \(\prod_{\gamma\in\Gamma_{\widetilde{C}}}

+

755 \partial(\widetilde{X}_\gamma)\); and also on display:

+

756  

+

757 \begin{equation}

+

758 \begin{split}

+

759 %%     This line is deliberately long so as to show

+

760 %%     differences in widths; it is a little over the measure

+

761 %%     in article/cmr.

+

762 \iiiint\limits_{\mathbf{Q}} f(w,x,y,z)\,dw\,dx\,dy\,dz  &\leq

+

763 \oint_{\bm{\partial Q}} f' \left( \max \left\lbrace

+

764 \frac{\lVert w \rVert}{\lvert w^2 + x^2 \rvert} ;

+

765 \frac{\lVert z \rVert}{\lvert y^2 + z^2 \rvert} ;

+

766 \frac{\lVert w \oplus z \rVert}{\lVert x \oplus y \rVert}

+

767 \right\rbrace\right)

+

768 \\

+

769 &\precapprox \biguplus_{\mathbb{Q} \Subset \bar{\mathbf{Q}}}

+

770 \left[ f^{\ast} \left(

+

771     \frac{\left\lmoustache\mathbb{Q}(t)\right\rmoustache}

+

772          {\sqrt {1 - t^2}}

+

773     \right)\right]_{t=\alpha}^{t=\vartheta}

+

774 \\

+

775 \end{split}

+

776 \end{equation}

+

777  

+

778 For $x$ in the open interval \( \left] -1, 1 \right[ \)

+

779 the infinite sum in Equation~\eqref{eq:binom1} is convergent;

+

780 however, this does not hold

+

781 throughout the closed interval \( \left[ -1, 1 \right] \).

+

782 \begin{align}

+

783   (1 - x)^{-k} &=

+

784     1 + \sum_{j=1}^{\infty} (-1)^j \ibinom{k}{j} x^j

+

785     \quad \text{ for } k \in \mathbb{N}; k \neq 0.

+

786     \label{eq:binom1}

+

787 \end{align}

+

Example 8-8-10. Changed a little bit: it is currently not possible to put a +\quad in a \text in math mode. Thus, the \text contains only +the word `for'.

+
+Sample page of mathematical typesetting +

First some large operators +both in text: Q f(x,y,z)dxdydz and + γΓ C ˜ (X ˜ γ ); and also on display:

+ Q f(w,x,y,z)dwdxdydz Q f ' maxw |w 2 +x 2 |;z |y 2 +z 2 |;wz xy QQ f * Q(t) 1-t 2 t=α t=ϑ +

For x in the open interval -1,1 +the infinite sum in Equation () is convergent; +however, this does not hold +throughout the closed interval -1,1.

+(1-x) -k =1+ j=1 (-1) j k jx j forkN;k0. +

Other examples here omitted.

+
+Symbols in formulas +

788 \[ a          \#          \top _x^\alpha x^\alpha_b \]

+

789 \[ a \mathrel{\#} \mathop{\top}_x^\alpha x^\alpha_b \]

+

790 \thinmuskip=10mu \medmuskip=17mu \thickmuskip=30mu

+

791 \[ a  -  b  =  -\max \{ x , y \}\]

+

Example 8-9-1. In this example, \# and \top are changed into a +Rel and a Op operator, so that <msub> or <mover> is used in the +translation, but in the current version of Tralics, +no information is attached to the symbol.

+a# x α x b α +a# x α x b α +

Example 8-9-2. This example demonstrates that spacing in math formulas depend +on three registers that the user can change, but the value is ignored by +Tralics.

+a-b=-max{x,y} +

Example 8-9-3. This demonstrates that different spacing is used for +\bigl/\bigr or \left/\right. Tralics tries very hard to +convert big open/close pairs to left-right ones.

+

792 \thinmuskip=10mu \medmuskip=17mu \thickmuskip=30mu

+

793 \[ a \Bigl( \sum x \Bigr) \neq  a \left( \sum x \right) \]

+
+a xax +

794 \DeclareMathSymbol\bneg   {\mathbin}{symbols}{"3A}

+

795 \DeclareMathSymbol\rsquare{\mathrel}{AMSa}{"03}

+

796 \[ a \neg b           \qquad  x \square           y + z \]

+

797 \[ a \mathbin{\neg} b \qquad  x \mathrel{\square} y + z \]

+

798 \[ a \bneg          b \qquad  x \rsquare          y + z \]

+

Example 8-9-4. This example demonstrates that 1) spacing is wrong if an +ordinary symbol is used instead of a binary symbol, 2) adding \mathrel or +\mathbin in Tralics does not change this behavior, 3) using the +declare-something command is not enough in Tralics: no error is signaled, but +no symbol appears.

+a¬bxy+z +a¬bxy+z +abxy+z +

799 \[  a = b  \text{ but }  a \tilde{=} b

+

800    \text{ which is not } a \mathrel{\tilde{=}} b  \]

+

Example 8-9-5. This example indicates how embellished operators can have type +Rel or whatever. As usual, nothing special is added to the XML file. This +means that the equal-with-hat should be a relation in the HTML file, an +ordinary symbol in the Pdf version.

+a=bbuta= ˜bwhichisnota= ˜b +

801 $ u \not< v$ or $a \not\in \mathbf{A} $,

+

802 {\makeatletter\let\not\@@not $ u \not< v$ or $a \not\in \mathbf{A} $}

+

803 $ \not\leq \ \not\succeq \ \not\sim $ $ \nleq \ \nsucceq \ \nsim $

+

Example 8-9-6. By default \not< is translated at \neg<; this is +wrong, so that we redefined it. The only trouble is that +\not\in does not work. We show here both behaviors:

+

u\not<v or a\notA, +u¬<v or aA

+

Example 8-9-7. This is not really good. +\not\not\not and +\nsucceq

+

804 $\Longarrownot\longleftrightarrow \qquad  \arrownot\hookleftarrow$

+

Example 8-9-8, demonstrating how to negate an arrow +\Longarrownot\arrownot, +this is not implemented in Tralics.

+Symbols of class \mathbin, miscellaneous +* +* ++ ++ +- +- +⨿ +\amalg +* +\ast + +\baro + +\barwedge +\bbslash +\bbslash + +\bigtriangledown + +\bigtriangleup + +\Cap + +\cap + +\Cup + +\cup + +\curlyvee + +\curlywedge + +\dag + +\dagger + +\ddag + +\ddagger + +\diamond + +\divideontimes +÷ +\div + +\dotplus + +\doublecap + +\doublecup +\fatbslash +\fatbslash + +\fatsemi +\fatslash +\fatslash + +\gtrdot + +\intercal + +\interleave + +\land +\lbag +\lbag + +\leftslice + +\leftthreetimes + +\lessdot + +\lor + +\ltimes + +\merge +\minuso +\minuso +\moo +\moo + +\mp +\nplus +\nplus +± +\pm +\rbag +\rbag + +\rightslice + +\rightthreetimes + +\rtimes + +\setminus + +\smallsetminus + +\sqcap + +\sqcup + +\sslash + +\star +⫿ +\talloblong +× +\times + +\triangleleft + +\triangleright + +\uplus + +\varbigtriangledown + +\varbigtriangleup + +\varcurlyvee + +\varcurlywedge +× +\vartimes + +\veebar + +\vee + +\wedge + +\wr +\Ydown +\Ydown +\Yleft +\Yleft +\Yright +\Yright +\Yup +\Yup +
+Symbols of class \mathrel, (arrows) + +\circlearrowleft + +\circlearrowright + +\curvearrowleft + +\curvearrowright + +\dasharrow + +\dashleftarrow + +\dashrightarrow + +\Downarrow + +\downarrow + +\downdownarrows + +\downharpoonright + +\gets + +\hookleftarrow + +\hookleftarrow + +\hookrightarrow + +\Leftarrow + +\leftarrow + +\leftarrowtail + +\leftarrowtriangle + +\leftrightarrowtriangle + +\leftharpoondown + +\leftharpoonup + +\leftleftarrows + +\Leftrightarrow + +\leftrightarrows + +\leftrightarrow + +\leftrightharpoons + +\leftrightsquigarrow + +\Lleftarrow + +\Longleftarrow + +\longleftarrow + +\Longleftarrow + +\longleftrightarrow + +\Longmapsfrom + +\longmapsfrom + +\Longmapsto + +\longmapsto + +\Longrightarrow + +\longrightarrow + +\looparrowleft + +\looparrowright + +\Lsh + +\Mapsfrom + +\mapsfrom + +\Mapsto + +\mapsto + +\multimap + +\nearrow + +\nwarrow + +\restriction + +\rightarrowtail + +\rightarrowtriangle + +\Rightarrow + +\rightarrow + +\rightharpoondown + +\rightharpoonup + +\rightleftarrows + +\rightleftharpoons + +\rightrightarrows + +\rightsquigarrow + +\Rrightarrow + +\Rsh + +\searrow + +\shortdownarrow + +\shortleftarrow + +\shortrightarrow + +\shortuparrow + +\swarrow + +\to + +\twoheadleftarrow + +\twoheadrightarrow + +\Uparrow + +\uparrow + +\upharpoonleft + +\upharpoonright + +\Updownarrow + +\updownarrow + +\upuparrows +
+Symbols of class \mathrel, (arrows, continued) +\curlyveedownarrow +\curlyveedownarrow +\curlyveeuparrow +\curlyveeuparrow +\curlywedgedownarrow +\curlywedgedownarrow +\curlywedgeuparrow +\curlywedgeuparrow +\nnearrow +\nnearrow +\nnwarrow +\nnwarrow +\ssearrow +\ssearrow +\sswarrow +\sswarrow +
+Symbols of class \mathord, Greek +Δ +\Delta +Γ +\Gamma +Λ +\Lambda +Ω +\Omega +Φ +\Phi +Π +\Pi +Ψ +\Psi +Σ +\Sigma +Θ +\Theta +ϒ +\Upsilon +Ξ +\Xi +α +\alpha +β +\beta +χ +\chi +δ +\delta +ϝ +\digamma +ϵ +\epsilon +η +\eta +γ +\gamma +ι +\iota +κ +\kappa +λ +\lambda +μ +\mu +ν +\nu +ω +\omega +ϕ +\phi +π +\pi +ψ +\psi +ρ +\rho +σ +\sigma +τ +\tau +θ +\theta +υ +\upsilon +ϵ +\varepsilon +ϰ +\varkappa +φ +\varphi +ϖ +\varpi +ϱ +\varrho +ς +\varsigma +ϑ +\vartheta +ξ +\xi +ζ +\zeta +
+Symbols of class \mathord, letter-shaped +$ +\$ + +\Im + +\Re + +\aleph +k +\Bbbk + +\beth + +\circledS + +\complement + +\daleth + +\ell +ð +\eth + +\Finv + +\Game + +\gimel + +\hbar + +\hslash +ı +\imath +ȷ +\jmath +$ +\mathdollar + +\mathparagraph +§ +\mathsection +£ +\mathsterling + +\mho +¶ +\P + + +\partial +£ +\pounds +§ +\S + +\wp +
+Symbols of class \mathord, miscellaneous +! +! +. +. +/ +/ +? +? +@ +@ +| +| +# +\# +% +\% +& +\& +_ +\_ + +\| + +\angle + +\Arrowvert +| +\arrowvert + +\backprime + +\backslash +| +\bracevert + +\bigstar + +\blacklozenge + +\blacksquare + +\blacktriangledown + +\blacktriangle + +\bot + +\clubsuit +© +\copyright + +\diagdown + +\diagup + +\diamondsuit + +\emptyset + +\exists + +\flat + +\forall + +\heartsuit + +\infty + +\lightning +¬ +\lnot + +\lozenge + +\measuredangle + +\nabla + +\natural +¬ +\neg + +\nexists +' +\prime + +\sharp + +\spadesuit + +\sphericalangle + +\square + +\surd + +\top + +\triangledown + +\triangle +© +\varcopyright + +\varnothing + +\Vert +| +\vert +
+Mathematical accents +x ´ +\acute{x} +x +\bar{x} +x ˘ +\breve{x} +x ˇ +\check{x} +x +\ddddot{x} +x +\dddot{x} +x ¨ +\ddot{x} +x ˙ +\dot{x} +x ` +\grave{x} +x ^ +\hat{x} +x ˚ +\mathring{x} +x ˜ +\tilde{x} +x +\vec{x} +xyz ^ +\widehat{xyz} +xyz ˜ +\widetilde{xyz} +
+Symbols of class \mathbin, (boxes) + +\boxast +\boxbar +\boxbar + +\boxbox + +\boxbslash + +\boxcircle + +\boxdot + +\boxempty + +\boxminus + +\boxplus + +\boxslash + +\boxtimes + +\oblong +
+Symbols of class \mathbin, (circles) + +\bullet +· +\cdot + +\centerdot + +\bigcirc + +\circledast + +\circledcirc + +\circleddash + +\circ + +\oast + +\obar + +\ocircle + +\obar + +\odot + +\ogreaterthan + +\olessthan + +\ominus + +\oplus + +\oslash + +\otimes +\ovee +\ovee +\owedge +\owedge + +\varobslash + +\varocircle + +\varodot + +\varogreaterthan + +\varolessthan + +\varominus + +\varoplus + +\varoslash + +\varotimes +\varovee +\varovee +\varowedge +\varowedge +
+Symbols of class \mathrel, (equality and order) +< +< += += +> +> + +\approxeq + +\approx + +\asymp + +\backsimeq + +\backsim + +\Bumpeq + +\bumpeq + +\circeq + +\cong + +\curlyeqprec + +\curlyeqsucc + +\Doteq + +\doteqdot + +\doteq + +\eqcirc + +\eqsim + +\eqslantgtr + +\eqslantless + +\equiv + +\fallingdotseq + +\geqq + +\geqslant + +\geq + +\ge + +\gggtr + +\ggg + +\gg + +\gtrapprox + +\gtreqless + +\gtreqqless + +\gtrless + +\gtrsim +\leftrightarroweq +\leftrightarroweq + +\leqq + +\leqslant + +\leq + +\lessapprox + +\lesseqgtr + +\lesseqqgtr + +\lessgtr + +\lesssim + +\le + +\llless + +\lll + +\ll + +\precapprox + +\preccurlyeq + +\preceq + +\prec + +\risingdotseq + +\simeq + +\sim + +\succapprox + +\succcurlyeq + +\succeq + +\succsim + +\succ + +\thickapprox + +\thicksim + +\triangleq +
+Symbols of class \mathrel, (equality and order—negated) + +\gnapprox + +\gneqq + +\gneq + +\gnsim +\gvertneqq +\gvertneqq + +\lnapprox + +\lneqq + +\lneq + +\lnsim +\lvertneqq +\lvertneqq + +\ncong + +\neq + +\ne + +\ngeqq + +\ngeqslant + +\ngeq + +\ngtr + +\nleqq + +\nleqslant + +\nleq + +\nless +\npreceq +\npreceq + +\nprec + +\nsim +\nsucceq +\nsucceq + +\nsucc + +\precnapprox + +\precneqq + +\precnsim + +\precsim + +\succnapprox + +\succneqq + +\succnsim +
+Symbols of class \mathrel, (sets and inclusions) + +\blacktriangleleft + +\blacktriangleright + +\inplus + +\in + +\niplus + +\ni + +\ntriangleleftsqslant + +\ntrianglerightsqslant + +\owns + +\sqsubseteq + +\sqsubset + +\sqsupseteq + +\sqsupset + +\Subset + +\Supset + +\subseteqq + +\subseteq +\subsetpluseq +\subsetpluseq +\subsetplus +\subsetplus + +\subset + +\supseteqq + +\supseteq +\supsetpluseq +\supsetpluseq +\supsetplus +\supsetplus + +\supset + +\trianglelefteq + +\trianglerighteq +\trianglerighteqslant +\trianglerighteqslant +\trianglelefteqslant +\trianglelefteqslant + +\vartriangleleft + +\vartriangleright +\vartriangle +\vartriangle +
+Symbols of class \mathpunct, \mathord, \mathinner (punctuation) +, +,    + +\cdots    + +\hdots    +... +\ldots    +... +\mathellipsis +; +; +: +\colon + +\ddots + +\vdots +
+Symbols of class \mathrel, (sets and inclusions—negated) + +\notin +\nsubseteqq +\nsubseteqq + +\nsubseteq +\nsupseteqq +\nsupseteqq + +\nsupseteq + +\ntrianglelefteq + +\ntriangleleft + +\ntrianglerighteq + +\ntriangleright + +\subsetneqq + +\subsetneq + +\supsetneqq + +\supsetneq +\varsubsetneqq +\varsubsetneqq +\varsubsetneq +\varsubsetneq +\varsupsetneqq +\varsupsetneqq +\varsupsetneq +\varsupsetneq +
+Symbols of class \mathrel, (arrows—negated) + +\nLeftarrow       + +\nLeftrightarrow       + +\nRightarrow + +\nleftarrow + +\nleftrightarrow + +\nrightarrow +
+Symbols of class \mathrel, (negation and arrow +extensions). These are currently unimplemented. +\Arrownot +\Arrownot +\Longarrownot +\Longarrownot +\Mapsfromchar +\Mapsfromchar +\Mapstochar +\Mapstochar +\arrownot +\arrownot +\longarrownot +\longarrownot +\mapsfromchar +\mapsfromchar +\mapstochar +\mapstochar +\lhook +\lhook +\not +\not +\rhook +\rhook +
+Symbols of class \mathrel (miscellaneous). Symbols short-foo, +small-foo, var-foo not implemented. +: +: +϶ +\backepsilon + +\because + +\between + +\bowtie + +\dashv + +\frown + +\Join + +\mid + +\models + +\nmid + +\nparallel +\nshortmid +\nshortmid +\nshortparallel +\nshortparallel + +\nVDash + +\nvDash + +\nVdash + +\nvdash + +\parallel + +\perp + +\pitchfork + +\propto +\shortmid +\shortmid +\shortparallel +\shortparallel +\smallfrown +\smallfrown +\smallsmile +\smallsmile + +\smile + +\therefore +\varpropto +\varpropto + +\Vdash + +\vDash + +\vdash + +\Vvdash +
+Symbol pairs of class \mathop + +\int + +\oint + +\bigbox + +\bigcap + +\bigcup + +\bigcurlyvee + +\bigcurlywedge + +\biginterleave +\bignplus\bignplus +\bignplus + +\bigodot + +\bigoplus + +\bigotimes + +\bigparallel + +\bigsqcap + +\bigsqcup + +\bigtriangledown + +\bigtriangleup + +\biguplus + +\bigvee + +\bigwedge + +\coprod + +\prod + +\smallint + +\sum +
+Symbol pairs of class \mathopen and \mathclose extensible. +\bgroup and \lgroup wrong on HTML, not better in Pdf. Moustaches +not good in Pdf. +[(] +[] +{(} +\{\} +( +\lVert\rVert + +[(] +\lbrack\rbrack +{(} +\lbrace\rbrace +|(| +\lvert\rvert + +( +\lceil\rceil +(() +() +( +\lgroup\rgroup + +( +\lfloor\rfloor +( +\langle\rangle +( +\lmoustache\rmoustache + +( +\llbracket\rrbracket + +
+Symbol pairs of class \mathopen and \mathclose +non-extensible> Lets of symbols missing in Unicode +\llceil\rrceil +\llceil\rrceil +& +\binampersand\bindnasrepma +\Lbag\Rbag +\Lbag\Rbag +\llfloor\rrfloor +\llfloor\rrfloor + +\llparenthesis\rrparenthesis +
+Latin letters and arabic numerals +ABCDEFGHIJKLMNOPQRSTUVWXYZ +abcdefghijklmnopqrstuvwxyz +0123456789 +
+
+Other Examples +

805 \def\EXP{\frac{x^1_2}3Foo}

+

806 \[\dfrac {\EXP1}{\phantom{\EXP}1}=\dfrac {\EXP1}{\hphantom{\EXP}1}=\dfrac21=

+

807 \dfrac{\EXP1}{\EXP1}=

+

808 \dfrac{\EXP1}{\vphantom{\EXP}1}\]

+

Example of a \phantom, a \hphantom and a \vphantom. In the case +of a \hphantom, the 1 should be vertically aligned as in the case of 2/1, +otherwise should be aligned as in the case E/E (where E is the big expression); +in the case of a \vphantom, it should be centered otherwise flushed +right (aligned with the numerator).

+x 2 1 3Foo1 x 2 1 3Foo1=x 2 1 3Foo1 x 2 1 3Foo1=2 1=x 2 1 3Foo1 x 2 1 3Foo1=x 2 1 3Foo1 x 2 1 3Foo1 +

Test of multiscripts: +F10, +F1234abcd, +F123456abcdef,

+

809 \[\sideset{}{_d^c}\sum _xy \qquad \sideset{^a_b}{}\sum _xy \qquad

+

810 \sideset{'^a}{^c}\sum_xy\qquad \sideset{_b}{_d}\sum_xy \qquad

+

811 \sideset{^{aA}_{bB}}{^{cC}_{dD}}\sum_xy

+

812 \]

+

More examples of sideset

+dc x yba x yc'a x ydb x ydDcCbBaA x y +

Differences between \uplus and \biguplus. Consider the following +input lines.

+

813 \[{\uplus a}, {\uplus _ab}, {\mathop \uplus_ab}, {\mathop \uplus\limits_ab} \]

+

814 \[{x\uplus a}, {x\uplus _ab}, {x\mathop \uplus_ab}, {x\mathop \uplus\limits_ab} \]

+

Initial code

+a, a b, a b, a b +xa,x a b,x a b,x a b +

Unicode character U+2A04 used instead of \uplus.

+⨄a,⨄ a b,⨄ a b,⨄ a b +x⨄a,x⨄ a b,x⨄ a b,x⨄ a b +

In Tralics 2.9.4, +translation of \uplus was a character &uplus;, translation of +\biguplus was &biguplus;, characters +U+22E8 (multiset union) and U+2A04 (n-ary union operator with plus). +Thus lines and correspond to \uplus, +while lines and +correspond to \biguplus. On FL, I see a big operator on line +, a smaller one on line +(the version without index being smaller than the +other ones), and small operators on lines and . +On FM, I see a very big +operator on line , a small one on line , +question marks on lines and , and Amaya gives the +same for and . +Thus, translation of \biguplus seems to be wrong. Thus, we changed it: +in Tralics 2.9.5, \biguplus is the same character as \uplus. +Same formulas as above, with +command \biguplus used instead of \uplus

+a, a b, a b, a b +xa,x a b,x a b,x a b +

Same, with \textstyle

+a, a b, a b, a b +xa,x a b,x a b,x a b +

815 \[ A\xleftarrow{u}B\xleftarrow[d]{}C\xleftarrow[d]{u}

+

816    D\xrightarrow{u}E\xrightarrow[d]{}F\xrightarrow[d]{u}G \]

+

This example shows the use of \xleftarrow and \xrightarrow. +Optional argument below the arrow, mandatory argument below.

+A uB dC d uD uE dF d uG +

817 \[\begin{CD}

+

818 @.  0               @.     0\\

+

819 @.       @VVV                @VVV\\

+

820 0 @>>> D^{1 \times q} @>.R>> D^{1 \times p} @>\pi>> M @>>> 0\\

+

821 @.     @|  @VV.UV\\

+

822 0 @>>> D^{1 \times q} @>.J>> D^{1 \times p} @>\kappa>> D^{1 \times (p-q)} @>>>0\\

+

823 @.       @VVV                @VVV\\

+

824 @.  0               @.     0\\

+

825 \end{CD}\]

+

This example shows how to produce a commutative diagram (adapted from +)

+000 D 1×q .RD 1×p πM 0.U.U0 D 1×q .JD 1×p κD 1×(p-q) 000 +

826 \[\begin{CD}

+

827 @.  0               @.     0\\

+

828 @.       @VLLVV                @VVDV\\

+

829 0 @<\mathrm{above}<< D      @))\mathrm{below}) D @>\mathrm{above}>\mathrm{below}> 0\\

+

830 @.     @\vert  @VLLVDV\\

+

831 @.  0               @.     0\\

+

832 \end{CD}\]

+

A variant that shows how to put data above and below the arrows.

+00LLLLDD0 above D below D below above 0DLLDLL00 +

Some formulas that were badly rendered: +u(t)=1 2(x ˙ 1 (t-h)-x ¨ 1 (t)), +z 2 (t)=-1 2(ψ ¨(t)+2ψ(t)), +v(t)=1 2(-ψ ¨(t)+ψ ˙(t)).

+

More formulas: +formula A: +u(t)=1 2, +formula B: +u(t)=1 2, +formula C: +u(t)=1 2, +formula D: +u(t)=1 2, +and finally u(t)=1 2+1. +Using display style +1 2(x(1)+ψ(t))

+The connexion examples +

These are example where Tralics 2.10.5 produces the wrong size for closing +delimiters.

+

Example 1: d fine ' ={d j,λ ' } λΔ J-1 Δ j max and

+d fine ' ={d j,λ ' } λΔ J-1 Δ j max +

Example 2: μ 1 (d)=d(1-e -d 2 /2 ) -1 -2d -1 .

+

Example 3: a k * (a n ) p k -1 p .

+

Example 4: σ n (x) p Cn -r x w l τ ,1 τ=r+1 p.

+

Example 5: #Λ k 2 (-k-1)p c j Λ k |c j | p f X p p and

+#Λ k 2 (-k-1)p c j Λ k |c j | p f X p p . +

Example 6: d n (K) X E n (K) X .

+

Example 7: ||x-ΔΦ(x)|| 2 Cσ k (x) 1 k.

+

Example 8: +smaller parens f (n λA) versus larger parens +f(n Aλ).

+

Example 9:

+||η 0 || 2 C 2 2 k j=2 s ||η T j-1 +η T j || 1 C 2 2 k j=2 s ||η T j-1 || 1 +||η T j || 1 2C 2 2 k j=1 s ||η T j || 1 2C 2 2 kσ 2k (η) 1 . +
+Test of brackets +

833 $\bra{X}=\bra{x^2}=\ket{Y}=\ket{y^2} = \braket{X|Y}=\braket{x^2| y^2}$

+

834 $\Bra{X}=\Bra{x^2}=\Ket{Y}=\Ket{y^2} = \Braket{X|Y}=\Braket{x^2| y^2}$

+

835 $\Braket{x|y||z}$, $\Braket{x\|y|z}$

+

836 $\Braket{x+x_2|y+y^3||z+z^4+-5}$, $\Braket{x+x_2\|y+y^2|z+z^4_5}$

+

837 $   \Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi } $

+

838 $   \Set{ x\in\mathbf{R}^2 | 0<{|x|}<5 }$

+

Formula one X|=x 2 |=|Y=|y 2 =X|Y=x 2 |y 2

+

Formula two X=x 2 =Y=y 2 =X|Y=x 2 |y 2

+

Formula three x|yz, xy|z

+

Formula four x+x 2 |y+y 3 z+z 4 +-5,

+

Formula five x+x 2 y+y 2 |z+z 5 4 .

+

These are from the style file +ϕ| 2 t 2 |ψ +and +xR 2 |0<|x|<5.

+
+Recursion test +|f| 2 -|p n q n | 2 L (T) <ϵ, +g L 2 (dμ) 2 =1 2π -π π |g(e iθ )| 2 dμ(θ), +letting:E n,m (K,K ' )={pP m (K),qP n (K ' )suchthatxI,p(x) q(x)1}, +
+Font tests +

We assume that the property of each math font is one (later one we shall set +it to zero), and the translation of a character is an ASCII character +with an attribute. Otherwise, it is a Unicode character between +U+1D400 and U+1F7FF. In our test we use internal font commands +like \mml@font@italic.

+

839 \def\F#1{\mbox{#1: }\csname mml@font@#1\endcsname}

+

840 \def\La{AB=c+1+23}

+

841 \def\Lb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}

+

842 \def\Lc{$\Lx abcde$ $\Lx fghijklm$ $\Lx nopqrs$ $\Lx tuvwxyz$}

+

843 \def\Ld{0123456789}

+

844 \def\Test#1{\par Test of #1: \def\Lx{\csname mml@font@#1\endcsname}

+

845   $\Lx\La$, $\Lx\Lb$, \Lc, $\Lx\Ld$.}

+

846  

+

847 \Test{normal}

+

848 \Test{upright}

+

849 \Test{bold}

+

850 \Test{italic}

+

851 \Test{bolditalic}

+

852 \Test{script}

+

853 \Test{boldscript}

+

854 \Test{fraktur}

+

855 \Test{doublestruck}

+

856 \Test{boldfraktur}

+

857 \Test{sansserif}

+

858 \Test{boldsansserif}

+

859 \Test{sansserifitalic}

+

860 \Test{sansserifbolditalic}

+

861 \Test{monospace}

+
+

Test of normal: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of upright: + AB =c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ , abcde fghijklm nopqrs tuvwxyz , 0123456789.

+

Test of bold: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of italic: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of bolditalic: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of script: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of boldscript: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of fraktur: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of doublestruck: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of boldfraktur: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of sansserif: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of boldsansserif: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of sansserifitalic: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of sansserifbolditalic: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of monospace: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

In the Pdf version, we have problems with script and bold script for lower +letters and digits. In the MTML version, Firefox has no script, fraktur or +double struck font.

+

862 \mathfontproperty0=0

+

863 \mathfontproperty1=0

+

864 \mathfontproperty2=0

+

865 \mathfontproperty3=0

+

866 \mathfontproperty4=0

+

867 \mathfontproperty5=0

+

868 \mathfontproperty6=0

+

869 \mathfontproperty7=0

+

870 \mathfontproperty8=0

+

871 \mathfontproperty9=0

+

872 \mathfontproperty10=0

+

873 \mathfontproperty11=0

+

874 \mathfontproperty12=0

+

875 \mathfontproperty13=0

+

876 \mathfontproperty14=0

+

Test of normal: +AB=c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcde fghijklm nopqrs tuvwxyz, 0123456789.

+

Test of upright: + AB =c+1+23, ABCDEFGHIJKLMNOPQRSTUVWXYZ , abcde fghijklm nopqrs tuvwxyz , 0123456789.

+

Test of bold: +𝐀𝐁=𝐜+1+23, 𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙, 𝐚𝐛𝐜𝐝𝐞 𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦 𝐧𝐨𝐩𝐪𝐫𝐬 𝐭𝐮𝐯𝐰𝐱𝐲𝐳, 0123456789.

+

Test of italic: +𝐴𝐵=𝑐+1+23, 𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍, 𝑎𝑏𝑐𝑑𝑒 𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚 𝑛𝑜𝑝𝑞𝑟𝑠 𝑡𝑢𝑣𝑤𝑥𝑦𝑧, 0123456789.

+

Test of bolditalic: +𝑨𝑩=𝒄+1+23, 𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁, 𝒂𝒃𝒄𝒅𝒆 𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎 𝒏𝒐𝒑𝒒𝒓𝒔 𝒕𝒖𝒗𝒘𝒙𝒚𝒛, 0123456789.

+

Test of script: +𝒜ℬ=𝒸+1+23, 𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵, 𝒶𝒷𝒸𝒹ℯ 𝒻ℊ𝒽𝒾𝒿𝓀𝓁𝓂 𝓃ℴ𝓅𝓆𝓇𝓈 𝓉𝓊𝓋𝓌𝓍𝓎𝓏, 0123456789.

+

Test of boldscript: +𝓐𝓑=𝓬+1+23, 𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩, 𝓪𝓫𝓬𝓭𝓮 𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶 𝓷𝓸𝓹𝓺𝓻𝓼 𝓽𝓾𝓿𝔀𝔁𝔂𝔃, 0123456789.

+

Test of fraktur: +𝔄𝔅=𝔠+1+23, 𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜ℨ, 𝔞𝔟𝔠𝔡𝔢 𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪 𝔫𝔬𝔭𝔮𝔯𝔰 𝔱𝔲𝔳𝔴𝔵𝔶𝔷, 0123456789.

+

Test of doublestruck: +𝔸𝔹=𝕔+1+23, 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ, 𝕒𝕓𝕔𝕕𝕖 𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞 𝕟𝕠𝕡𝕢𝕣𝕤 𝕥𝕦𝕧𝕨𝕩𝕪𝕫, 0123456789.

+

Test of boldfraktur: +𝕬𝕭=𝖈+1+23, 𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅, 𝖆𝖇𝖈𝖉𝖊 𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒 𝖓𝖔𝖕𝖖𝖗𝖘 𝖙𝖚𝖛𝖜𝖝𝖞𝖟, 0123456789.

+

Test of sansserif: +𝖠𝖡=𝖼+1+23, 𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹, 𝖺𝖻𝖼𝖽𝖾 𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆 𝗇𝗈𝗉𝗊𝗋𝗌 𝗍𝗎𝗏𝗐𝗑𝗒𝗓, 0123456789.

+

Test of boldsansserif: +𝗔𝗕=𝗰+1+23, 𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭, 𝗮𝗯𝗰𝗱𝗲 𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺 𝗻𝗼𝗽𝗾𝗿𝘀 𝘁𝘂𝘃𝘄𝘅𝘆𝘇, 0123456789.

+

Test of sansserifitalic: +𝘈𝘉=𝘤+1+23, 𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡, 𝘢𝘣𝘤𝘥𝘦 𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮 𝘯𝘰𝘱𝘲𝘳𝘴 𝘵𝘶𝘷𝘸𝘹𝘺𝘻, 0123456789.

+

Test of sansserifbolditalic: +𝘼𝘽=𝙘+1+23, 𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕, 𝙖𝙗𝙘𝙙𝙚 𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢 𝙣𝙤𝙥𝙦𝙧𝙨 𝙩𝙪𝙫𝙬𝙭𝙮𝙯, 0123456789.

+

Test of monospace: +𝙰𝙱=𝚌+1+23, 𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉, 𝚊𝚋𝚌𝚍𝚎 𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖 𝚗𝚘𝚙𝚚𝚛𝚜 𝚝𝚞𝚟𝚠𝚡𝚢𝚣, 0123456789.

+

The Pdf version should be the same. The HTML version is different; only +characters in the BMP are shown (for instance, the set of integers, complex +numbers, etc, are often represented using a blackboard font, using characters +U+2124, U+2102, these are not repeated at U+1D551 and UD1D3A).

+

Testing internal commands that read/write math font properties.

+

877 \def\entity#1{\xmllatex{\&\#x#1;}{}}

+

878 \makeatletter

+

879 \mathfontproperty2=3 $\mathbf{x}$

+

880 Font property:\the\mathfontproperty\mml@font@bold,

+

881 Character propery:\the\setmathchar\mathbf`x.\\

+

882 \mathfontproperty\mathbf=0

+

883 Bold x: \setmathchar\mathbf`x={\entity{1d431}}$\mathbf{x}$

+

884 ComplexC: \setmathchar\mathbf`c={\entity{2102}}$\mathbf{c}$

+

885 \setmathchar 5 6 7 ok

+

x +Font property:1, +Character property:&#x1D431;. +Bold x: 𝐱 +ComplexC: + ok

+
+Examples from the MathML recommendation +

Examples and italic text taken from (Mathematical Markup +Language (MathML) Version 2.0, W3C recommendation 21 October 2003.

+Introduction +

886 \newcommand\Apply[2]{\mathbox{apply}{\mathbox{#1}{}#2}}

+

887 $\mathbox{mfenced}{{a+b}}^2$  % F1

+

888 $\Apply{power}{\Apply{plus}{\mathci{a}\mathci{b}} \mathcn{2}}$ %F2

+

889 ${(a+b)}^2$ % F3

+

The four lines above show a command and three math formulas, representing the +square of the sum of a and b. The MathML recommendation, in its +introduction, explains that there are three types of elements: presentation +elements (formula F1) and content elements (formula F2), as well as interface +elements (the toplevel <math> element, not discussed here). In any case, +a formula is a tree; leafs are token elements or canonically empty elements. +The main difference between these two types is the following: in the case of +formula F2, there is a possibility to evaluate the formula, for instance, +with a=2 and b=3, this should yield 25. In the case of F1, we have a formula +with a superscript; in a case like x 2 , it is impossible to tell if this +means the square of the variable x, or the second component of the vector +x.

+

In the example F3, there are five leafs, two identifiers, a number, two +operators. The default translation is a token element in presentation markup. +This means that the translation of `a' is implicitly a <mi> +obtained by \mathmi, instead of a <ci> obtained by \mathci. +A non-trivial question is how to translate `xy25' (the default is one or two +identifiers, followed by a number). Our formulas contain characters that are +neither letters nor digits: parenthesis, plus sign, superscript +character. These are operators; in the case of presentation markup, +an operator can be represented as a special element (<msup> for a +construction base plus exponent), or a token element (a <mo> element for a +sum). In the case of content markup, special element can be used (for instance +<list>, or empty elements, like <plus/>.

+

In content markup, the sum of two objects is specified by a <apply> +element, whose children are the operator <plus/> followed by the objects, +and a list of three objects is represented by a <list> element whose children are the +objects. In presentation markup, a sum is a sequence (an explicit or implicit +<mrow> element) containing the arguments and operators in order. In the +same fashion, a list can be defined as the sequence of all elements, plus the +separators (opening parentheses, closing parentheses, commas, etc.); it can +also be specified by a <mfenced> element, whose attributes define what is +at the start of the list, the end of the list, and between the +elements. These attributes have a default value adapted for lists, meaning +that f(x,y,z) can be obtained by the juxtaposition of f and a +<mfenced> element containing x, y and z. In the case of formula F1, +the content of <mfenced> element is the translation of {a+b}; +because of the braces this is a <mrow> element, with three children. +Formulas F1 and F3 are equivalent: a base and an exponent, the base contains +an opening parenthesis, the identifier a, the operator plus, the identifier b, +and a closing parenthesis. The renderer gives a+b 2 .

+

The second formula renders as +ab2. +My Web browser knows only some of the operators; hence it is possible that you +see the same as ab2. In the Pdf version, we implement the <apply> +element as follows: first the operator, then the arguments as a list. We could +do better, but all n-ary operators can have implicit arguments: it is possible +to represent the sum of all f(x) such that x satisfies some condition, +for instance, xN and x is a square. +Since Tralics does not generate content markup, this is not implemented at +all.

+

890 ${\mathbox{apply}{\mathbox{minus}{}\mathci{a}\mathci{b}}}$ %2.1.3

+

Simple example of presentation markup: +ab. Note that the +minus operator takes one or two arguments.

+
+More complicated examples +

891 ${x^2+{4\*x}+4}=0$

+

Rendering: +x 2 +4x+4=0. +Note the use of nested elements, to denote terms, for example, the +left-hand side of the equation; this is obtained here by simply putting +braces in the source. The &InvisibleTimes; MathML +character entity is used here to indicate to a renderer that there are +special spacing rules between the 4 and the x and that the 4 and the x should not be broken +onto separate lines. This special character can be obtained by the \* +command whose meaning is: do not consider any special spacing rule, but allow +a break here. We decide to translate \* in this way because it converts +an invisible product into an invisible product. We do not believe in +hyphenation for math formulas (inline formulas should be small, and not split, +big formulas should be in display mode). +Translation from XML to Pdf is empty for this character.

+

892 $x=\frac{{-b}\pm\sqrt{b^2-{4\* a\* c}}}{2\* a}$

+

Second example, +x=-b±b 2 -4ac 2a. +Notice that the `plus or minus' sign is given by the entity name +&PlusMinus; this is equivalent to using the character reference +&#00B1;. When converting an XML document into Pdf, the character +reference is +required (notice that the style sheet that converts from XML to XSL/FO +replaces entity names by character references, so that this is not a +problem). On the other hand, there are cases where entity names are refused in +a HTML document: if that document is presented as XML, and the DTD makes no +reference to MathML (this very document is likely to be XHTML1.0 strict).

+

893 $z\mathbox{mfenced}{{x+y}}$

+

894 $A=\begin{bmatrix}x&y\\z&w\end{bmatrix}$

+

Example three: zx+y. The MathML recommendation says +that there is some ambiguity: what is the relation between z and the +expression x+y that follows? implicit product or function application? A +translator like Tralics cannot guess.

+

Example four +A=xyzw. +Most elements have a number of attributes that control the details of +their screen and print rendering. The attributes for operator elements given +using <mo> are set to default values determined by a +dictionary. Translation of the environment is a <mfenced> element, with +two attributes; all other attributes are ignored in the XML to Pdf +conversion. No dictionary is currently used; translation of a <mo> is +complicated: the difference between lim and is that we have a +sequence of 3 ASCII characters, and a character reference (that could be +given in base 10, in base 16, or directly as a UTF-8 character). The XML +reader converts this into a command (with a complicated name) that expands to +\sum, that expands to whatever is defined by the style files.

+

895 \def\Cx{\mathci{x}} \def\Dz{\mathcn{0}}

+

896 \def\Dt{\mathcn{2}} \def\Df{\mathcn{4}}

+

897 $\Apply{eq}{

+

898   \Apply{plus}{ \Apply{power}{\Cx\Dt} \Apply{times}{\Df\Cx}\Df}

+

899   \Dz}$

+

Example 2.3.2, content markup. + + +x24x40 +This example shows that content markup is sometimes easier.

+

900 \def\Ca{\mathci{a}}\def\Cb{\mathci{b}} \def\Cc{\mathci{c}}

+

901 \def\Cpm{\mathcsymbol{^^b1}}

+

902 $\Apply{eq}{

+

903    \Cx

+

904    \Apply{divide}{

+

905      \mathbox{apply}{

+

906        \Cpm

+

907        \Apply{minus}{\Cb}

+

908        \Apply{root}{\mathbox{degree}{\Dt}

+

909           \Apply{minus}{

+

910             \Apply{power}{\Cb\Dt}

+

911             \Apply{times}{\Df\Ca\Cc}}}}

+

912      \Apply{times}{\Dt\Ca}}}$

+

Next example + + +x±b2b24ac2a. +This example has two interesting points. The first one is that some operators +can have optional arguments (in this case, the default value 2 is used). The +second point is that the first child of <apply> can be any function; +in this example, it is a <csymbol> element (equivalent of <mo>), whose +value is the character ± (that has to be entered as a character, not a +command). Other content markup examples omitted.

+

913 $\mathbox{mrow}{\mathbox{apply}{\mathbox{eq}{}\mathci{A}

+

914 \mathbox{matrix}{\mathbox{matrixrow}{\mathci{x}\mathci{y}}

+

915 \mathbox{matrixrow}{\mathci{z}\mathci{w}}}}}$

+

Next example +Axyzw. This example is badly rendered +in the Pdf (matrix operators not implemented), and my favorite HTML browser +shows the same result!

+
+Presentation Markup +

916 \def\X#1#2{\mathbox{#1}{\mathcnothing{\char32#2\char32}}}

+

917 $\X{mi}{x}\X{mo}{+}{\X{mi}{a}\X{mo}{/}\X{mi}{b}}$

+

918 $x+{a/b}$

+

Compare +` x + a / b ' +with `x+a/b'. +These two examples should look the same; in the first case the content of each +element is a space, a character, a space; for the second example, there are no +spaces.

+

919 $\mathmi[fontweight][bold][mathvariant][normal]{a}$

+

920 $\mathmi[fontweight][bold][mathvariant][sans-serif]{a}$

+

921 $\mathmi[fontweight][bold][mathvariant][fraktur]{a1}$

+

922 $\mathbox{mstyle}[fontstyle][italic]{\mathbf{a}b}$

+

Deprecated styles: `a' +should be a normal a, `a' +should be a sans-serif a, and +`a1' should be fraktur. +In the case of +`ab', the a should be bold +upright, and the b should be italic. The MathML recommendation says that +`mathvariant' should have precedence over `fontstyle', which is deprecated, +and not used by Tralics. In the Pdf, attributes of \mstyle are +currently ignored.

+

923 $x$ $\mathmi{\char32x\char32}$

+

924 $D$ $\mathmi{\char32sin\char32}$ $\mathmi[mathvariant][script]{L}$

+

925 $\mathmi{}$

+

Examples for 3.2.3: `x' (an x without spaces), +` x ' (an x with spaces), +`D', ` sin ', 'L' +and `' (empty identifier). An italic font should be used unless +defined by an attribute, or an upright font if the element has more than +one character. In the Pdf, spaces are incorreclty counted as characters.

+

926 $\sin(x)$ $\mathmi{sin}\ApplyFunction x$ $1+x+\mathmo{...}+n$

+

927 $1+x+\mathmi{...}+n$ $\pi, \ImaginaryI,\ExponentialE$

+

This is sin(x), using &ApplyFunction;, Unicode character U+2061: +`sinx'. Ellipses using <mo>: `1+x+...+n' +and <mi>: `1+x+...+n', constants π,, +(these are somehow unusual in Pdf).

+

928 $2, \mathmn{0.123}, \mathmn{1,000,000}, \mathmn{2.1e10},

+

929 \mathmn{0xFFEF}, \mathmn{MCMLXIX}, \mathmn{twenty one}$.

+

930 $2+{3\*\ImaginaryI},\frac12, \pi, \ExponentialE$.

+

A <mathmn> element represents a number, typeset with an upright font, +for instance +2, 0.123, 1,000,000, 2.1e10, +0xFFEF, MCMLXIX, twenty one. +Numbers, that could be <mathcn> (content markup numbers), but are not +<mathmn> (presentation markup numbers): +2+3,1 2,π,.

+

931 $+, <,\le, \mathmo{<=}, \mathmo{++}, \sum,\mathmo{.NOT}, \mathmo{and},

+

932 \*,\mathmo[mathvariant][bold]{+}$

+

933 $({a+b})$, $[{0,1})$, $f\ApplyFunction {({x,y})}$

+

934  $x\* y$, $f\ApplyFunction{(x)}$, $\sin\ApplyFunction x$

+

935 and $m_{1\InvisibleComma2}$.

+

Example of <mathmo> (operators): ++,<,,<=,++,,.NOT,and,,+. In the Pdf version, font attributes are +ignored for operators (they are complicated to implement, and only `bold' +variant is available with the current math fonts).

+

More examples: (a+b), [0,1), f(x,y).

+

Invisible operators: xy, f(x), sinx +and m 12 .

+

936 $\frac{\DifferentialD}{\DifferentialD x}$

+

Embellishment x. The MathML +recommendation says that the spacing around an embellished operator like + 4 +should be the same as that of the operator at its core. An expression like +4 + is not an embellished operator, but phantoms are. More surprising: a +fraction whose numerator is an operator is an embellished operator, the +example shown here being the motivation.

+

937 $\underline{(}\frac ab \overline)$.

+

938 $\mathmo[maxsize][1]{(} \frac ab\mathmo[maxsize][1]{)}$,

+

939 $(\frac ab)$

+

940 $x\mathop\rightarrow\limits_{\mtext{ maps to }}y$

+

Stretching: ( _a b) . With maxsize +(a b), and without +(a b). The rule is the following. An enbellished operator (for +instance an underlined parenthesis) should stretch vertically, +as it it were not embellished, this is not +implemented in the Pdf. A maximum size can be given (either as a dimension, or +a ratio to the default size, a value of 1 says that the operator should not +stretch. Horizontal stretching: +x maps to y. In the Pdf version, we have +a normal arrow.

+

941 $\mtext{ Theorem 1: }$

+

942 $X\mathbox{mtext}{\mathcnothing{^^^^2009}}X$

+

943 $X\mathbox{mtext}{\mathcnothing{^^^^2009^^^^200a^^^^200a^^^^2009%

+

944 ^^^^200a^^^^200a}}X$'

+

945 $X\mkern10muX$

+

946 $X\mtext{ /* a comment */ }X$'

+

947 $\mathmo{ there exists }{{\delta>0}\mathmo{ such that

+

948 }{{f\ApplyFunction{(x)}}<1}}$

+

Text: ` Theorem 1: ', +`X X' +`X      X' (expression obtained by inserting twice three characters: +thickspace, thinspace and verythinspace, should be the same as +`XX', +`X /* a comment */ X'. Other example: + there exists δ>0 such that +f(x)<1. The MathML rules say that initial and final +space should be removed and consecutive space characters should be replaced by +a single space character in elements like <mtext> or <mo>. This is not +done in the Pdf version, and you will see the following: normally <mtext> +is typeset via \text, and spaces are typeset as usual outside math mode; +the default for all other operators is a math font, and spaces are ignored. +A non-trivial question is: what amount of space is inserted between the +`exists' and the δ that follows? Firefox uses none, this is not good, + uses a small space, but ignores the space before it, the MathML +recommendation is unclear, and the sample renderings of the MathML test suite +show no space between two <mtext> elements or between a <mtext> and a +comma.

+

949 ${x\mathbox{malignmark}[edge][right]{}}^2$

+

Alignment: x 2 . The empty element used +in this formula is ignored in the Pdf version, (and, it seems, by my browser +also). It defines an alignment mark, that is ignored outside tables. +The idea is the following. If you want a table where all elements are +centered, except for the first row, first column, and element at position +(2,2), the easy way is to use a <mtable> element, specifying that +alignment is left, center, etc, specify alternative alignment for the first +row, or some specific elements. If this is not sufficient, an alternate method +is provided. Typically each row contains a single cell, with some empty +<maligngroup> elements. You can specify alignments for groups in the same +way as alignment for cells, with two additions: if the group contains numbers, +you can say that decimal points are aligned (there is an implicit point at the +end of the group); moreover you can explicitly set a mark. In the example +above, the mark is between the letter x and the superscript. Using a mark does +not alter rendering of the expression.

+

950 $\mathbox{ms}{\mathcnothing{\&}}$

+

951 $\mathbox{ms}{\mathcnothing{\&amp;}}$

+

952 $\mathbox{ms}{\mathcnothing{double quote is "}}$

+

953 $\mathbox{ms}[lquote][aa][rquote][bb]{\mathcnothing{test}}$

+

Literals &, +&amp;, +double quote is ", +test. +This element is not yet correctly converted in Pdf. There should be some kind +of quotes around the expression, the quotes may be given by attributes; my +browser shows strange characters.

+

954 ${2\* x}+y-z$, $({x,y})$

+

Example of <mrow>: 2x+y-z, (x,y).

+

955 \[\frac{(\frac ab\mathattribute{linethickness}{0})\qquad

+

956 \frac ab}{\frac cd}\mathattribute{linethickness}{2}\qquad

+

957 \frac{1}{x^3+\frac x3} = \frac{1}{x^3+\frac x3}

+

958 \mathattribute{bevelled}{true}\qquad \frac{1+\sqrt 5}{2}

+

959 \]

+

Example of <mfrac>; if the bevelled attribute is true, a diagonal line +should separate numerator and denoninator (not implemented in Pdf).

+(a b)a b c d1 x 3 +x 3=1 x 3 +x 31+5 2 +

960 $\mathbox{mstyle}[maxsize][1]{(\frac ab)}$

+

Example of <mstyle>: (a b). +Attributes of the element are used by children as default value. In the +example, both opening and closing parentheses should use maxsize=1. +This mechanism is not yet implemented in the Pdf.

+

961 $\mathbox{merror}{

+

962 \mtext{ Unrecognised element: mfraction; arguments were: }

+

963 {1+\sqrt5}\mtext{ and } 2}$

+

Error: Unrecognised element: mfraction; arguments were: 1+5 and 2.

+

964 \def\test{C\mathbox{mpadded}[width][0em]{\kern-0.3em\text{|}}}

+

965 $\test$, $\mathbox{semantics}

+

966 {\test\mathbox{annotation-xml}[encoding][MathML-Presentation]{\mathbb{C}}}$

+

967 $\mathbb{C}$

+

968 $\mathbox{mpadded}[width][0em]{C}\kern0.3em\text{|}$

+

Padding: C|, C|C. +The previous expression contains two letters C with a vertical bar over +it. None of them looks OK on my browser, because of the negative space. The Pdf +version contains a third C because the <semantics> element is not +implemented. The formula should mimic C. +Positive padding C| is +better in my browser.

+

969 $\frac{x+y+z}{x\phantom{\mathmo[form][infix]{+}y}+z}$

+

970 $\frac{x+y+z}{x\phantom{+}\phantom{y}+z}$

+

Phantom: x+y+z x+y+z +and x+y+z x+y+z. These two expressions should +produce the same result, the numerator and the denoninator have the same +width. Said otherwise, spacing around the plus symbol (inside or outside +phantom) should be that of a prefix plus operator if it is the first +element in a row, followed by something else, should be infix if it is the +sole element, or neither first nor last, should be postfix otherwise.

+

971 \def\mfence{\mathbox{mfenced}}

+

972 Fences: $\mfence{x}$, $(x)$, $\mfence{xy}$, $f\ApplyFunction\mfence{xy}$,

+

973 $(x,y)$, $\mfence{{a+b}}$, $\mfence[open][[]{0\relax1}$.

+

974 Wrong $\mfence{a+b}$, $\mfence{01}, \bf\mfence{xy}$,

+

975 right: $\bf\mfence{x y}$, $\bf\mfence{{x}{y}}$.

+

+Fences: x, (x), xy, fxy, +(x,y), a+b, 01. +Wrong a+b, 01,xy, +right: xy, xy. +Note that separators do not show in the Pdf, so that it is unclear why some +expressions are wrong.

+

The first expression is wrong, because the MathML +documentation says that a <mrow> is necessary so that the <mfenced> +has just one argument; a pair of braces should be added, this gives the +\mrow. Examples that follow are wrong because `01' or `xy' produce a +single <mn> or <mi> element; in the case of an identifier this may +depend on the font. You can use a separator (space or +\relax) or uses braces (no <mrow> is produced if there is a single +element in the math list). Note: spaces are ignored in math mode; it is not +completely clear whether or not a space is allowed as separator.

+

976 \[

+

977 \def\mtr{\mathbox{mtr}}

+

978 \def\mtdr{\mathbox{mtd}[columnalign][right]}

+

979 \def\ralign{\cellattribute{columnalign}{right}}

+

980 \def\X#1#2{\mathbox{menclose}[notation][#1]{#2}}

+

981 \mathbox{mtable}[columspacing][0pt][rowspacing][0pt]{

+

982   \mtr{\mathbox{mtd}{}\mtdr{10}}

+

983   \mtr{\mtdr{131}\mtdr{\X{longdiv}{1413}}}

+

984   \mtr{\mathbox{mtd}{}\mtdr{{\underline{131}\phantom{3}}}}

+

985   \mtr{\mathbox{mtd}{}\mtdr{103}}}

+

986 \qquad

+

987 a_{\X{actuarial}{n}\*i}

+

988 \qquad

+

989 \begin{array}{cc}

+

990   &\ralign10\\

+

991 \ralign131&\ralign\X{longdiv}{1413}\\

+

992   &\ralign \underline{131}\phantom{3}\\

+

993   &\ralign 103

+

994 \end{array}\mathattribute{columspacing}{0pt}\mathattribute{rowspacing}{0pt}

+

995 \]

+

Examples of menclose (Does not work in the Pdf or with Firefox; works with Amaya).

+101311413131 _3103a ni 101311413131 _3103 +

996 $(x+y)^2$ ${(x+y)}^2$ $\int_0^1{\ExponentialE^x\*{\DifferentialD x}}$

+

Scripts: +Compare (x+y) 2 (without braces) with (x+y) 2 (recommended), + 0 1 x x

+

997 $\underbrace{x+y+z}\mathattribute{accentunder}{true} \text{~versus~}

+

998 \underbrace{x+y+z}\mathattribute{accentunder}{false}

+

999 $, $\hat x \text{~versus~}\hat x\mathattribute{accent}{false}$,

+

1000 $\overbrace{x+y+z}\mathattribute{accent}{true} \text{~versus~}

+

1001 \overbrace{x+y+z}\mathattribute{accent}{false}$,

+

1002 $\mathop{\int\limits_0}\limits^\infty \text{~versus~} \int\limits_0^\infty$

+

Underscript, overscripts: +x+y+z versusx+y+z , x ^versusx ^, +x+y+z versusx+y+z . Converting mathml to Pdf is +not obvious because if a brace character is an accent-declared overscript, we +must apply some command to the kernel. In order for this example to work, +another command must be applied if the brace is non-accent (we use the same +command, that's simplier). In a case like + 0 versus 0 +there is no difference between an operator with underscript to which an +overscript is added, and an operator with two scripts.

+

1003 $\mathbox{mmultiscripts}{F1\none\mathbox{mprescripts}{}0\none}

+

1004 \ApplyFunction{({;a;z})}$

+

1005 $\mathbox{mmultiscripts}{Ri\none\none jk \none l\none}$

+

Multiscripts: +F10(;a;z) and +Rijkl.

+

1006 $(\begin{array}{ccc}1&0&0\\0&1&0\\0&0&1\end{array})$,

+

1007 $\mathbox{mtable}{\mathbox{mlabeledtr}[id][e-is=m-c-square]{

+

1008 \mathbox{mtd}{\text{(2.1)}}

+

1009 \mathbox{mtd}{{E={m\*c^2}}}}}$.

+

Tables: a matrix +(100010001), +and an numbered equation: +(2.1)E=mc 2 .

+

1010 $\def\X{\mathbox{maligngroup}{}}

+

1011 \def\A{{{\X\mathmn{8.44}\*\X x} \X +{\X \mathmn{55} \*\X y}}\X=\X0}

+

1012 \def\B{{{\X\mathmn{3.1} \*\X x} \X -{\X \mathmn{0.7}\*\X y}}\X=\X{-\mathmn{1.1}}}

+

1013 \mathbox{mtable}[groupalign][\char`\{decimalpoint left left decimalpoint left

+

1014 decimalpoint\char`\}]{

+

1015 \mathbox{mtr}{\mathbox{mtd}{{\A}}}

+

1016 \mathbox{mtr}{\mathbox{mtd}{{\B}}}}

+

1017 $

+

Alignment +8.44x+55y=03.1x-0.7y=-1.1. As explained above, this could be typeset, by aligning the \X. the +material between two \X commands should be left-aligned, or aligned on +the decimal point. In some cases, the \X is a direct child of the cell, +but not always. For this reason, it is nearly impossible to typeset this +correctlty in .

+ + + +A pdflatex-based automated journal production system +TUGboat +1 +27 +2006 + + + +XMLTEX: A non validating (and not 100% conforming) namespace aware XML parser implemented in +TUGboat +3 +21 +2000 +193-199 + + + +De XML à PDF avec xmltex et Passive +Cahiers Gutenberg +35-36 +79-114 +2000 + + + +Mathematical Markup Language (MathML) Version 2.0 +2001 +http://www.w3.org/TR/MathML2/ + + +Applications of the Quillen-Suslin theorem to multidimensional systems theory +Rapport de recherche INRIA +RR-6126 +2007 +96 +http://hal.inria.fr/inria-00131035/en/ + + +Tralics, a to XML translator, Part I +Rapport Technique +309 +Inria +2006 +http://hal.inria.fr/inria-00000198 + + +Tralics, a to XML translator, Part II +Rapport Technique +310 +Inria +2006 +http://hal.inria.fr/inria-00069870 + + +The book +Addison Wesley +1984 + + + +The companion, second edition +Addison Wesley +2004 + + + +Passive +http://www.tei-c.org.uk/Software/passivetex/ +2003 +
diff --git a/thirdparty/tralics-2.15.2/Modele/testpack.xml b/thirdparty/tralics-2.15.2/Modele/testpack.xml new file mode 100644 index 0000000..a54ae85 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testpack.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + +Star crossed lovers.The BardExample is the school of mankind, and they will learn at no otherLetters on a Regicide Peace Edmond Burke

A textAn author +A second textAn author +

+

AXB +AXB +AXB

+

df dx df dx df dx +d 2 f dx 2 d 2 f dx 2 d 2 f dx 2 +df dx x 0 df dx x 0 df dx x 0 +d 2 g dy 2 0 d 2 g dy 2 0 d 2 g dy 2 0

+

f x= 2 f x 2 =p V T = 3 f xy 2 = 2 f x 2 = 5 f x 2 y 3 z

+f x= 2 f x 2 =p V T = 3 f xy 2 = 2 f x 2 = 5 f x 2 y 3 z +

+
+
+
+
+
+
+
+
+
+

+

+

+ + +Text +Text +

+
+foo +Some text +Some text +Some text

+

textA

+

textB testC textDout + textD textE textFout + textG this and that + + + +textH etcredtextetcgreentext +textI +textJ +textK

+

xyz a b

+

+

Text. +IntroductionContinuation +

+

A1B1C2=3 +A1B1C2=3A12B12C2=3

+

textETC +textFOOETC

+

XYX MÌ‚( ( +blabla. (taratata) +blabla. (taratata) +mod

+

Testing fancybox

+New Glarus BirdwatchNew Glarus BirdwatchNew Glarus BirdwatchNew Glarus Birdwatch

xx + +

blah

+ +

Since the former doesn't use braces to delimit +the context of the box, ... +

+ +

xyz

+

x +

+

x=yy>x 4 5 f(x)dx= iF x i + + +x=yy>x 4 5 f(x)dx= iF x i + +

+

etc

+A table of foo and bar + +

foo +bar +

+ +A table of foo and bar + + + + +

foo +bar +

+ +

x +y +

+

+Love of life +and other short stories +by Policarpa Salabarrieta +
x

+

My list: +Galanga root +Coconot +Tempeh +
x

+ +Hello, world +
+ABCD

aa +bb +cc +dd

+

here we are again

+

happy as can be

+

all good friendsOK

+

and jolly good company OK +xyz

+blah di blah +blih da blih + diff --git a/thirdparty/tralics-2.15.2/Modele/testpackii.xml b/thirdparty/tralics-2.15.2/Modele/testpackii.xml new file mode 100644 index 0000000..dfb8a15 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/testpackii.xml @@ -0,0 +1,33 @@ + + + + +A +

Testing the float package

+
+B +

foo xxHeyfoo

+
+

Heyfoobar

+
+

foo xxHey

+
+

+ +

+ +List of figuresList of Programs +forloop +

+1+3+5+7+9 +=2=5=8=11=14=17 +=2=5=8=11=14=17

+ + + +Probability laws related to the Jacobi θ and Riemann ζ functions, and Brownian excursions +Bull. Amer. Math. Soc. +38 +435–465 +

+

This is the end of the document

+
diff --git a/thirdparty/tralics-2.15.2/Modele/teststr.xml b/thirdparty/tralics-2.15.2/Modele/teststr.xml new file mode 100644 index 0000000..137287a --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/teststr.xml @@ -0,0 +1,172 @@ + + + + +

OK +OK

+

0123 +--i-ii-iii + +OK + +OK + +OK

+

;c;c.

+

Substr, 12345,1, 2, 5: 12 +Substr, 12345,3, 5, 5: 345 +Substr, 12345,3, end, 5: 345 +Substr, 12345,3, beg, 5: 123 +Substr, 12345,-2, 1, 5: 4 +Substr, 12345,-1, 1, 5: 5 +Substr, 12345,3, -2, 5: 23 +Substr, 12345,-2, -2, 5: 34 +Substr, 12345,0, 5, 5: (the null string) +Substr, 12345,2, 0, 5: (the null string) +Substr, abcdefgh,2, 3, 8: bcd

+

Quantity 2.345 is decimal

+

Quantity 2.4.5 is not decimal

+

Quantity +-2.45 is not decimal

+

Quantity +2.345 is decimal

+

Quantity -2.345 is decimal

+

Quantity 2.345- is not decimal

+

Quantity 2.4+4.5 is not decimal

+

Quantity +4. is decimal

+

Quantity 4. is decimal

+

Quantity +.7 is decimal

+

Quantity .3 is decimal

+

Quantity 4 is decimal

+

Quantity 123456 is decimal

+

Quantity -12345 is decimal

+

Quantity +12345 is decimal

+

Quantity 2.345 is numeric

+

Quantity 2.4.5 is not numeric

+

Quantity +-2.45 is not numeric

+

Quantity +2.345 is numeric

+

Quantity -2.345 is numeric

+

Quantity 2.345- is not numeric

+

Quantity 2.4+4.5 is not numeric

+

Quantity +4. is numeric

+

Quantity 4. is numeric

+

Quantity +.7 is numeric

+

Quantity .3 is numeric

+

Quantity 4 is numeric

+

Quantity 123456 is numeric

+

Quantity -12345 is numeric

+

Quantity +12345 is numeric

+

Quantity 4.5 is numeric

+

Quantity 4.5e5 is numeric

+

Quantity +4.5e5 is numeric

+

Quantity 4.5e+5 is numeric

+

Quantity +4.5e+5 is numeric

+

Quantity 4.5E5 is numeric

+

Quantity -4.5E5 is numeric

+

Quantity 4.5E-5 is numeric

+

Quantity -4.5E-5 is numeric

+

Quantity -4.5E-5. is not numeric

+

Quantity 4.5.E-5 is not numeric

+

Quantity abcdefg is not numeric

+

Quantity abcE-5 is not numeric

+

Quantity 2.345 is not int

+

Quantity 2.4.5 is not int

+

Quantity +-2.45 is not int

+

Quantity +2.345 is not int

+

Quantity -2.345 is not int

+

Quantity 2.345- is not int

+

Quantity 2.4+4.5 is not int

+

Quantity +4. is not int

+

Quantity 4. is not int

+

Quantity +.7 is not int

+

Quantity .3 is not int

+

Quantity 4 is int

+

Quantity 123456 is int

+

Quantity -12345 is int

+

Quantity +12345 is int

+

Quantity 4.5 is not int

+

Quantity 4.5e5 is not int

+

Quantity +4.5e5 is not int

+

Quantity 4.5e+5 is not int

+

Quantity +4.5e+5 is not int

+

Quantity 4.5E5 is not int

+

Quantity -4.5E5 is not int

+

Quantity 4.5E-5 is not int

+

Quantity -4.5E-5 is not int

+

Quantity 4.5.E-5 is not int

+

Quantity abcdefg is not int

+

Quantity abcE-5 is not int

+

1;2;3;4. +1;23;;4. +Strlen 4 should be 4 +6=6 +6=6 +2=2 +33=33

+

.Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche., +.Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag., +.Monday Tuesday Wednesday Thursday Friday Saturday Sunday., +.Lunes Martes Miércoles Jueves Viernes Sábado Domingo..

+

.janvier février mars avril mai juin juillet août septembre octobre novembre décembre., +.Januar Februar März April Mai Juni Juli August September Oktober November Dezember., +.January February March April May June July August September October November December., +.enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre..

+

In 10 days is 4th April 2008 + +Today is 25th March 2008.

+

.Today is Mardi 25 mars 2008. +Today is Dienstag 25. März 2008. +Today is Martes 25 de marzo de 2008. +Today is Tuesday March 25, 2008. +Today is Tuesday 25th March 2008.

+

Tuesday

+

1·25>0.textṡ.

+BB + +CC + +xx + + + + + + + + + + + + + + + +Ok +Ok +Ok +Ok +Ok +

Paris + +rennes

+ + +Panorama 2 +

Module1

+Panorama 2 +

Module2

+
+Titre 3 +

Module3

+Titre 4 +

Module4

+ + + + + + +

+

+ + +

+
diff --git a/thirdparty/tralics-2.15.2/Modele/tormath.xml b/thirdparty/tralics-2.15.2/Modele/tormath.xml new file mode 100644 index 0000000..6ca8fa8 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tormath.xml @@ -0,0 +1,523 @@ + + + + +

DOCSTART

+x6 +simple math +

\sharp ♯

+

+\i \j \$ ~\, \_ \& \lbrace \rbrace \% \ \! \quad \qquad \dots \ldots \# \sharp \natural \flat += +\hspace{56.9055pt} \vspace{569.05511pt} \hspace{3.0pt}\vspace{4.0pt}\hspace*{5.0pt}\vspace*{6.0pt} +\hspace{-24.0pt} \vspace{-24.0pt} \hspace{-3.0pt}\vspace{4.0pt}\hspace*{-5.0pt}\vspace*{-6.0pt} +abcdefghijklmnopqrstuvwxyz +ABCDEFGHIJKLMNOPQRSTUVWXYZ +<>,?;./:+=-_"^{\prime }()§!` ^{\prime }" +ሴaà

+

\alpha \beta \gamma \delta \epsilon \varepsilon \zeta \eta \theta \iota \kappa \lambda \mu \nu \xi \pi \rho \sigma \tau \upsilon \phi \chi \psi \omega \varpi \varrho \varsigma \varphi \varkappa \vartheta +\Gamma \Delta \Theta \Lambda \Xi \Sigma \Upsilon \Phi \Pi \Psi \Omega

+

\hbar \ell \wp \Re \Im \partial \infty \emptyset \nabla \surd \top \bottom \bot \angle \triangle

+

\arccos \arcsin \arctan \arg \cos \cosh \cot \coth \csc \deg \dim + \exp \hom \ker \lg \ln \log \Pr \sec \sin \sinh \tan \tanh \det \gcd +\inf \injlim \lim \liminf \limsup \max \min \projlim \sup

+

\forall \exists

+

\coprod \bigvee \bigwedge \biguplus \bigcap \bigcup \int \sum \prod \bigotimes \bigoplus \bigodot \oint \bigsqcup \smallint

+

\triangleleft \triangleright \bigtriangleup \bigtriangledown \wedge \wedge \vee \vee \cap \cup \multimap \dagger \ddagger \sqcap \sqcup \amalg \diamond \Diamond \bullet \wr \div \odot \oslash \otimes \ominus \oplus \uplus \mp \pm \circ \bigcirc \setminus \cdot \ast \times \star

+

\propto \sqsubseteq \sqsupseteq \subseteq \sqsubset \parallel \mid \dashv \vdash \Vdash \models \nearrow \searrow \swarrow \nwarrow \Leftrightarrow \Leftarrow \Rightarrow \ne \ne \le \le \ge \ge \succ \approx \succeq \preceq \prec \doteq \subset \supset \supseteq \subseteq \bindnasrepma \ni \ni \gg \ll \gtrless \geqslant \leqslant \lnot \notin \leftrightarrow \leftarrow \leftarrow \rightarrow \rightarrow \mapsto \sim \simeq \perp \equiv \asymp \smile \frown \leftharpoonup \leftharpoondown \rightharpoonup \rightharpoondown \hookrightarrow \hookleftarrow \bowtie \bowtie \Longrightarrow \longrightarrow \longleftarrow \Longleftarrow \longmapsto \longleftrightarrow \Longleftrightarrow \iff

+

\cdots \hdots \vdots \ddots \imath \jmath \Vert \Vert \vert \uparrow \downarrow \Uparrow \Downarrow \Updownarrow \updownarrow \mho \clubsuit \diamondsuit \heartsuit \spadesuit \aleph \backslash \Box \langle \rangle \rmoustache \lmoustache \rgroup \lgroup \rbrace \lbrace \rceil \lceil \rfloor \lfloor \square \cong \lnot \lnot \in \prime

+

<>,.:;*?!()[]|+-/=

+

\hspace{5.0pt}\: \; \: \! \quad \qquad ~

+

\smallint \int \vee \ni \ldots \top \bot \nabla \flat \Re \infty \surd \natural \Im \hbar \ell \sharp \angle \emptyset \triangle \lnot \wp \partial

+

\alpha =\beta and +\gamma =\delta and \phi =\psi ; +and 0\ne \infty

+
+Mathaccents +

HAT: \hat{a} \acute{b} \bar{c} \dot{d} \breve{e} \check{f} \grave{g} \vec{h} +\ddot{k} \tilde{l}a\rightarrow b\longrightarrow c

+

ACUTE: \acute{x} \bar{x} \breve{x} \check{x} +\ddddot{x} \dddot{x} \ddot{x} \dot{x} +\grave{x} \hat{x} \mathring{x} \tilde{x} +\vec{x} \widehat{xyz} \widetilde{xyz}

+

WIDETILDE: \widetilde{abc} \widehat{abc} \overleftarrow{abc} \overrightarrow{abc} +\overline{abc} \underline{abc} \overbrace{abc} \underbrace{abc} +\underleftarrow{abc} \underrightarrow{abc} +

+
+Commands +

\min _xf(x) >\operatorname{dmin}_xf(x). + +\min _xf(x) >\operatornamewithlimits{dmin}_xf(x).

+

\overline{foo}\underline{bar} +\stackrel{j}{\longrightarrow } +\overset{*}{X} \underset{*}{X} +\overbrace{xyz} +\underbrace{xyz} +\frac{abc}{xyz} \dfrac{abc}{xyz} \tfrac{abc}{xyz} +\sqrt{abc} \@root n \of {abc} \@root n \of {abc}

+

\bigl [\frac{1}{a^2}\bigr [ +\left[\frac{1}{b^2}\right[ +[\frac{1}{x^2}[

+\genfrac{}{}{}{}{1}{2} +\genfrac[]{2.0pt}2{aaa}{bbb} +\genfrac(){0.0pt}0{n}{m} + +

a\nonscript \,b_{c\nonscript \,d} a\nonscript \,b_{\textstyle c\nonscript \,d}

+\mathchoice{a}{b}{c}{d}= \frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}} = +1_{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} = 2^ {\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} +

\mathchoice{a}{b}{c}{d}= \frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}} = +1_{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} = 2^ {\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}}

+

{\frac{1}{2}}{x\displaystyle \frac{1}{2}} +{x\textstyle \frac{1}{2}}{x\scriptstyle \frac{1}{2}}{x\scriptscriptstyle \frac{1}{2}} \qquad {x\displaystyle a}+{x\textstyle a}+{x\scriptstyle a}+{x\scriptscriptstyle a}\qquad \frac{x\displaystyle a}{x\textstyle b}+\frac{x\scriptstyle a}{x\scriptscriptstyle b}

+
+Environments + +Other + +\begin{aligned} +x^2+y^2&=1 & 1 &=X^2+Y^2\\ +x &=0.01& 0.001&=X +\end{aligned} + + +\sin =\cos \\ +\multicolumn{a}{b}{c}\\ +\multicolumn{1}{r}{\cos }\\ +\multicolumn{1}{l}{\sin }\\ +1+2 + +ccaaAbbBaa\beta A\hbox{aaB $\alpha C$} D +

AB

+ A\hbox{B $C$} D +

a+b a\mathbin +b

+ 0=1 + 0=2 + 0=3 + 0=4 + 0 = 5 + +\begin{split} +(a+b)^4 &= (a+b)^ 2 (a+b)^2 \\ +&= (a^2+2ab+b^2)(a^2+2ab+b^2) \\ +&= a^4+4a^3b+6a^2b^2+4ab^3+b^4 \\ +\end{split} + + +\begin{aligned} +(a+b)^4 &= (a+b)^ 2 (a+b)^2 \\ +&= (a^2+2ab+b^2)(a^2+2ab+b^2) \\ +&= a^4+4a^3b+6a^2b^2+4ab^3+b^4 \\ +\end{aligned} + + +x^2+y^2&=1\\ x&=\sqrt{1-y^2} + + +x & \ll & y_{1} + \cdots + y_{n} \\ +& \le &z + + +x & = &17y \\ +y & > & a + b + c+d+e+f+g+h+i+j+ \nonumber \\ +& & k+l+m+n+o+p + +EQ1 +

etc

+EQ2 +

etc

+EQ3 + +u& \equiv v+1 \mod {n^2} \\ +u& \equiv v+1 \bmod {n^2} \\ +u& = v+1 \pmod {n^2} \\ +u& = v+1 \hspace{10.0pt}(n^2) \\ + +\frac{1}{2} \dfrac{1}{2} \tfrac{1}{2} \qquad {}^{\frac{1}{2} \dfrac{1}{2} \tfrac{1}{2}} +\frac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tfrac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dfrac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}} +

\bar{\dot{\rm o}} +a - b – c — d

+\binom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\qquad {}^{\binom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}} +a\over {b\over c} + +

y´x^{\prime } x^{\prime \prime } x^{\prime \prime \prime } x^{\prime \prime \prime \prime } u_2^{\prime } v^{\prime 3}_4

+

\min _xf(x) >\operatorname{dmin}_xf(x).

+

\min _xf(x) >\mathmo{dmin}\mathattribute{form}{prefix}\mathattribute{movablelimits}{true}_xf(x).

+\begin{split} +\mathtt {Aa}\mathcal {A}\mathbf {Aa}\mathrm {Aa} +\mathit {Aa}\mathbb {A}\mathsf {Aa}\mathnormal {Aa} &\mathtt {Bb}\mathcal {B}\mathbf {Bb}\mathrm {Bb} +\mathit {Bb}\mathbb {B}\mathsf {Bb}\mathnormal {Bb}\\ +\mathtt {Cc}\mathcal {C}\mathbf {Cc}\mathrm {Cc} +\mathit {Cc}\mathbb {C}\mathsf {Cc}\mathnormal {Cc} &\mathtt {Dd}\mathcal {D}\mathbf {Dd}\mathrm {Dd} +\mathit {Dd}\mathbb {D}\mathsf {Dd}\mathnormal {Dd}\\ +\mathtt {Ee}\mathcal {E}\mathbf {Ee}\mathrm {Ee} +\mathit {Ee}\mathbb {E}\mathsf {Ee}\mathnormal {Ee} &\mathtt {Ff}\mathcal {F}\mathbf {Ff}\mathrm {Ff} +\mathit {Ff}\mathbb {F}\mathsf {Ff}\mathnormal {Ff}\\ +\mathtt {Gg}\mathcal {G}\mathbf {Gg}\mathrm {Gg} +\mathit {Gg}\mathbb {G}\mathsf {Gg}\mathnormal {Gg} &\mathtt {Hh}\mathcal {H}\mathbf {Hh}\mathrm {Hh} +\mathit {Hh}\mathbb {H}\mathsf {Hh}\mathnormal {Hh}\\ +\mathtt {Ii}\mathcal {I}\mathbf {Ii}\mathrm {Ii} +\mathit {Ii}\mathbb {I}\mathsf {Ii}\mathnormal {Ii} &\mathtt {Jj}\mathcal {J}\mathbf {Jj}\mathrm {Jj} +\mathit {Jj}\mathbb {J}\mathsf {Jj}\mathnormal {Jj}\\ +\mathtt {Kk}\mathcal {K}\mathbf {Kk}\mathrm {Kk} +\mathit {Kk}\mathbb {K}\mathsf {Kk}\mathnormal {Kk} &\mathtt {Ll}\mathcal {L}\mathbf {Ll}\mathrm {Ll} +\mathit {Ll}\mathbb {L}\mathsf {Ll}\mathnormal {Ll}\\ +\mathtt {Mm}\mathcal {M}\mathbf {Mm}\mathrm {Mm} +\mathit {Mm}\mathbb {M}\mathsf {Mm}\mathnormal {Mm} &\mathtt {Nn}\mathcal {N}\mathbf {Nn}\mathrm {Nn} +\mathit {Nn}\mathbb {N}\mathsf {Nn}\mathnormal {Nn}\\ +\mathtt {Oo}\mathcal {O}\mathbf {Oo}\mathrm {Oo} +\mathit {Oo}\mathbb {O}\mathsf {Oo}\mathnormal {Oo} &\mathtt {Pp}\mathcal {P}\mathbf {Pp}\mathrm {Pp} +\mathit {Pp}\mathbb {P}\mathsf {Pp}\mathnormal {Pp}\\ +\mathtt {Qq}\mathcal {Q}\mathbf {Qq}\mathrm {Qq} +\mathit {Qq}\mathbb {Q}\mathsf {Qq}\mathnormal {Qq} &\mathtt {Rr}\mathcal {R}\mathbf {Rr}\mathrm {Rr} +\mathit {Rr}\mathbb {R}\mathsf {Rr}\mathnormal {Rr}\\ +\mathtt {Ss}\mathcal {S}\mathbf {Ss}\mathrm {Ss} +\mathit {Ss}\mathbb {S}\mathsf {Ss}\mathnormal {Ss} &\mathtt {Tt}\mathcal {T}\mathbf {Tt}\mathrm {Tt} +\mathit {Tt}\mathbb {T}\mathsf {Tt}\mathnormal {Tt}\\ +\mathtt {Uu}\mathcal {U}\mathbf {Uu}\mathrm {Uu} +\mathit {Uu}\mathbb {U}\mathsf {Uu}\mathnormal {Uu} &\mathtt {Vv}\mathcal {V}\mathbf {Vv}\mathrm {Vv} +\mathit {Vv}\mathbb {V}\mathsf {Vv}\mathnormal {Vv}\\ +\mathtt {Ww}\mathcal {W}\mathbf {Ww}\mathrm {Ww} +\mathit {Ww}\mathbb {W}\mathsf {Ww}\mathnormal {Ww} &\mathtt {Xx}\mathcal {X}\mathbf {Xx}\mathrm {Xx} +\mathit {Xx}\mathbb {X}\mathsf {Xx}\mathnormal {Xx}\\ +\mathtt {Yy}\mathcal {Y}\mathbf {Yy}\mathrm {Yy} +\mathit {Yy}\mathbb {Y}\mathsf {Yy}\mathnormal {Yy} &\mathtt {Zz}\mathcal {Z}\mathbf {Zz}\mathrm {Zz} +\mathit {Zz}\mathbb {Z}\mathsf {Zz}\mathnormal {Zz}\\ +\end{split} + +

{\cal ABCDEFGHIJKLMNOPQRSTUVWXYZ}

+

\bf a \mathrm {a \mathcal {c} d}

+

a^c_b +a_b^c

+

x\Box

+\left| +\begin{array}{lcr} +AAAAAAA&BBBBBCC&CCCCCCC\\ +A&B&C\\ +\multicolumn{1}{c}{A}&\multicolumn{1}{c}{B}&\multicolumn{1}{c}{C}\\ +\multicolumn{1}{r}{A}&\multicolumn{1}{r}{B}&\multicolumn{r}{c}{C}\\ +\multicolumn{1}{l}{A}&\multicolumn{1}{l}{B}&\multicolumn{l}{c}{C}\\ +\begin{array}{cl}1&22\\3&4\end{array}&\begin{array}{cc}1&22\\3&4\end{array}&\begin{array}{cr}1&22\\3&4\end{array}\\ +\multicolumn{2}{c}{0123456789abcdef}&C\\ +A&\multicolumn{2}{c}{0123456789abcdef}\\ +\multicolumn{2}{r}{0123456789abcdef}&C\\ +A&\multicolumn{2}{l}{0123456789abcdef}\\ +A&B&C\\ +\end{array} +\right| + +\left\lbrace \begin{array}{lcl} +\dot{x} & = & Ax+g(x,u)\\ +y & = & Cx \\ +\multicolumn{3}{l}{x\in \mathbf {R}^n} +\end{array} +\right. + +

a) x1 +b) x2 +c)

+ x3 +

d)

+ x4 +

e)

+ x5 +

text A

+

text B

+

text C

+

line one

+

this is the second line

+

1^efoobar.

+

1^efoobar. +FooBar

+ +\begin{array}{lcl} +\dot{x} & = & Ax+g(x,u)\\[2mm] +y & = & Cx \\ +\multicolumn{3}{l}{x\in R^n} +\end{array} + +a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F + + + + + + + + + +aaa +bbb +ccc +ddd +eee +fff +
+ \arccos ^2 (x),\, \arcsin ^2(x) ,\, \arctan ^2(x) ,\, \arg ^2(x),\, +\cos ^2(x) ,\, \cosh ^2(x) ,\, \cot ^2(x) + \coth ^2(x) ,\, \csc ^2(x),\, \deg ^2(x),\, \dim ^2(x),\, \exp ^2(x),\, +\hom ^2(x),\, \ker ^2(x) ,\, \lg ^2(x) + \ln ^2(x),\, \log ^2(x),\, \Pr ^2(x),\, \sec ^2(x),\, \sin ^2(x) ,\, +\sinh ^2(x),\, \tan ^2(x),\, \tanh ^2(x) + \det _{x=1},\, \gcd _{x=1},\, \inf _{x=1},\, \injlim _{x=1},\, +\lim _{x=1},\, \liminf _{x=1},\,\limsup _{x=1},\, +\max _{x=1},\, \min _{x=1},\, \projlim _{x=1},\, \sup _{x=1} + +

\stackrel{j}{\longrightarrow } \overset{*}{X} \underset{*}{X} +\sqrt{abc} \@root n \of {abc} \@root n \of {abc} +\frac{abc}{xyz} \dfrac{abc}{xyz} +

+\binom{\frac{n+m}{2}}{n} \quad \tbinom{\frac{n+m}{2}}{n} \quad \dbinom{\frac{n+m}{2}}{n}\qquad {}^{\binom{\frac{n+m}{2}}{n} \quad \tbinom{\frac{n+m}{2}}{n} \quad \dbinom{\frac{n+m}{2}}{n}} +

\Leftrightarrow

+

1st xième ysome text.

+\genfrac{}{}{}{}{1}{2} +\genfrac[]{2.0pt}2{aaa}{bbb} +\genfrac(){0.0pt}0{n}{m} + +

\genfrac{}{}{}0{a}{b} +\genfrac{}{}{}1{a}{b} +\genfrac{}{}{}2{a}{b} +\genfrac{}{}{}3{a}{b}

+

{a\over b}\quad {a\above 1pt b}\quad {a\atop b} +{a\overwithdelims () b}\quad {a\abovewithdelims ()1pt b}\quad {a\atopwithdelims () b} +\genfrac(){2.0pt}{}{foo}{bar}

+\frac{\frac{n+m}{2}}{n} \quad \tfrac{\frac{n+m}{2}}{n} \quad \dfrac{\frac{n+m}{2}}{n} + +\sup _{x=2}y~ +\frac{1}{k}\log _2 c(f)\; +\tfrac{1}{k}\log _2 c(f)\; +\sqrt{\frac{1}{k}\log _2 c(f)}\; +\sqrt{\dfrac{1}{k}\log _2 c(f)} + +

\genfrac(){2.84526pt}3{aaaaaaaaaaaaaaaaaa}{111111111} +\genfrac(){0.0pt}3{aaaaaaaaaaaaaaaaaa}{111111111} +\genfrac{}{}{}0{abc}{def} +\genfrac{}{}{}1{abc}{def} +\genfrac{}{}{}2{abc}{def} +\genfrac{}{}{}3{abc}{def}

+

\tilde{a},\tilde{z}, \tilde{a+b}

+

\overline{\tt P} P

+

á ááá á á á +\hat{a} \acute{a} \bar{a} \dot{a} \breve{a} +\check{a} \grave{a} \vec{a} \ddot{a} \tilde{a} +

+d=z^2=( I_t + \nabla I\vec{vvvv} +I div(\vec{vvvvv}) )^2, +

a\hbox{b=1} c +a\hbox{b~1}~c

+

x^{y^\epsilon _\varepsilon }

+ +\vec{B}(\vec{r}) = \frac{\mu _0}{4\pi }\left\lbrace +\frac{3\vec{m}({\vec{r}}^{\prime })\cdot (\vec{r}-{\vec{r}}^{\prime })}{|\vec{r}-{\vec{r}}^{\prime }|^5} +(\vec{r}-{\vec{r}}^{\prime }) - \frac{\vec{m}({\vec{r}}^{\prime })}{|\vec{r}-{\vec{r}}^{\prime }|^3} +\right\rbrace . + +

+ +\left\Vert \left|\left[\left(\left\lbrace \frac{x^1_2}{y^3_4}\right\rbrace \right)\right]\right|\right\Vert \left|\left|\left<\left\langle \frac{x^1_2}{y^3_4}\right\rangle \right>\right|\right|\left\lbrace \left\lceil \left\lfloor \frac{x^1_2}{y^3_4}\right\rfloor \right\rceil \right\rbrace []a\hspace{0.55542pt}b\hspace{1.111pt}c \hspace{2.22214pt}d \hspace{4.44443pt}e \hspace{8.88885pt}f +

+

+\left\moustache \left\uparrow \left\Uparrow \left\updownarrow \left\lgroup \frac{x^1_2}{y^3_4}\right\rgroup \right\Updownarrow \right\Downarrow \right\downarrow \right\moustache + +\left \lmoustache \left \uparrow \left \Uparrow \left \updownarrow \left \lgroup \frac{x^1_2}{y^3_4}\right \rgroup \right \Updownarrow \right \Downarrow \right \downarrow \right \rmoustache + +\left\moustache \left\uparrow \left\Uparrow \left\updownarrow \left\lgroup \int _0^{\frac{x^1_2}{y^3_4}}\right\rgroup \right\Updownarrow \right\Downarrow \right\downarrow \right\moustache

+

\Longrightarrow + +\cal X_yand \cal X_yZ +\sin (x) + \cos ^2(x) and \overbrace{xyz} ^t

+

\bigl [\frac{1}{a^2}\bigr [ +\left[\frac{1}{b^2}\right[ +[\frac{1}{x^2}[

+

\int f\mathopen )a+b\mathclose (=c+d +\int f(a+b)=c+d

+

a\limits \displaylimits \nolimits b

+

wwwwwwwwwwwwa...b...c   d      e f$g%h&ij k{l}mın♯o♮p♭q_

+

a\dots b\ldots c\quad d\qquad e f\$g\%h\&i\!j\,k\lbrace l\rbrace m\i n\sharp o\natural p\flat q\_

+

Math spacing

+

xxxxx

+

x\,x\:x\;x\!x

+

a\,\,\,\,\,a\:\:\:\:\:a

+

a\;\;\;a\;\;\;\;a

+

!?\#\_.@\%\Vert /|

+ +\mathop {\mathop {arg\,min}\nolimits _\Psi }\limits _{\theta \in \Theta } +\Delta \left( {\mathop \Phi \nolimits _\theta \left( {\Omega _s } +\right)-\Omega _t } \right) +\qquad x_{y_z} = {x_y}_z= +x^{y_z} = {x^y}_z= +x_{y^z} = {x_y}^z= +x^{y^z} = {x^y}^z +\left\lbrace \lbrace \frac{2}{3}\rbrace \right\rbrace + +

x=0123456789 +\@root 3 \of {4} \@root 3 \of {4}

+ +0=\hspace{11.38092pt}1 + +

 â Ấ ấ Ầ ầ Ẩ ẩ Ẫ ẫ +Ậ ậ Ĉ ĉ + Ê ê Ế ế Ề ỠỂ +ể Ễ á»… Ệ ệ Äœ Ä Ä¤ Ä¥ ÃŽ î Ä´ ĵ + +Ô ô Ỡố á»’ ồ á»” ổ á»– á»— +Ộ á»™ Åœ ŠÛ û Å´ ŵ Ŷ Å· Ạẑ +à á Ǻ Ç» Ǽ ǽ Ấ ấ Ắ ắ +Ć ć Ḉ ḉ É é Ḗ +ḗ Ế ế Ç´ ǵ à í +Ḯ ḯ Ḱ ḱ Ĺ ĺ Ḿ +ḿ Ń Å„ Ó ó Ǿ Ç¿ Ṍ á¹ á¹’ ṓ á» +ố Ớ á»› + á¹” ṕ Å” Å• Åš Å› +Ṥ á¹¥ Ú ú Ç— ǘ Ṹ á¹¹ Ứ ứ +Ẃ ẃ à ý Ź ź +À à Ầ ầ Ằ ằ È è Ḕ ḕ Ề +á» ÃŒ ì Ǹ ǹ +Ã’ ò Ṡṑ á»’ ồ +Ờ ỠÙ ù Ç› Çœ Ừ ừ Ẁ ẠỲỳ +Ä ä Çž ÇŸ Ë ë Ḧ ḧ à ï Ḯ ḯ Ö ö +Ȫ È« Ṏ Ṡẗ + Ãœ ü Ṻ á¹» Ç› Çœ +Ç— ǘ Ç™ Çš Ẅ ẅ Ẍ ẠŸ ÿ +Ç ç Ḉ ḉ Ḡḑ Ȩ È© Ḝ Ḡ+ +Ḩ ḩ Ä¢ Ä£ Ķ Ä· Ä» ļ Å… ņ Å– Å— Åž ÅŸ Å¢ Å£ +È€ È È„ È… Ȉ ȉ ÈŒ È È È‘ È” È• +Ä‚ ă Ằ ằ Ắ ắ Ẳ ẳ Ẵ ẵ +Ặ ặ + Ä” Ä• Ḝ ḠĞ ÄŸ Ĭ Ä­ +ÅŽ ŠŬ Å­ +Ç ÇŽ ÄŒ Ä ÄŽ Ä Äš Ä› Ǧ ǧ Èž ÈŸ Ǩ Ç© +Ç Ç Ç° Ľ ľ Ň ň + Ç‘ +Ç’ Ř Å™ Å  Å¡ Ť Å¥ Ç“ Ç” Ç™ Çš Ṧ +ṧ Ž ž +Å Å‘ Å° ű + +Ớ á»› Ờ ỠỞ ở á»  ỡ +Ợ ợ + Ứ ứ Ừ ừ Ử á»­ á»® +ữ á»° á»± +Ả ả Ẩ ẩ Ẳ ẳ Ẻ ẻ Ể ể Ỉ +ỉ + Ỏ á» á»” ổ Ở ở Ủ ủ +Ử á»­ Ỷ á»· +Ä„ Ä… Ę Ä™ Ä® į Ǫ Ç« Ǭ Ç­ Ų ų +Ã… Ã¥ Å® ů ẘ ẙ +Ạ ạ Ậ ậ Ặ ặ Ḅ ḅ Ḍ ḠẸ ẹ +Ệ ệ Ḥ ḥ Ị ị Ḳ ḳ Ḷ ḷ Ḹ ḹ + +Ṃ ṃ Ṇ ṇ Ọ ỠỘ á»™ Ợ ợ +Ṛ á¹› Ṝ á¹ á¹¢ á¹£ Ṩ ṩ Ṭ + +á¹­ Ụ ụ á»° á»± á¹¾ +ṿ Ẉ ẉ á»´ ỵ Ẓ ẓ +Ḁ Ḡ+Ḇ ḇ Ḏ Ḡẖ Ḵ ḵ Ḻ ḻ +Ṉ ṉ Ṟ ṟ á¹® ṯ Ẕ ẕ +È‚ ȃ Ȇ ȇ ÈŠ È‹ ÈŽ È È’ È“ È– È— +Ḛ ḛ Ḭ ḭ á¹´ á¹µ +Ḓ ḓ Ḙ ḙ Ḽ ḽ Ṋ ṋ á¹° á¹± Ṷ á¹· +Ä€ Ä Çž ÇŸ Ç  Ç¡ ǢǣĒ Ä“ Ḗ ḗ +Ḕ ḕ Ḡ ḡ Ħ ħ + +Ī Ä« Ḹ ḹ ÅŒ ŠǬ Ç­ Ȫ È« Ȭ +È­ È° ȱ Ṡṑ á¹’ ṓ + Ṝ á¹ +Ŧ ŧ Ū Å« Ṻ á¹» Ȳ ȳ +Ȧ ȧ Ç  Ç¡ Ḃ ḃ ÄŠ Ä‹ Ḋ ḋ Ä– Ä— Ḟ ḟ Ä  Ä¡ Ḣ +ḣ Ä° +Ä¿ Å€ á¹€ ṠṄ á¹… È® ȯ È° ȱ á¹– á¹— Ṙ á¹™ + +á¹  +ṡ Ṩ ṩ Ṧ ṧ Ṥ á¹¥ Ṫ ṫ Ẇ ẇ Ẋ +ẋ Ẏ ẠŻ ż +

+

B

+

\mml@font@normal ab+2c=DE\mml@font@upright ab+2c=DE\mml@font@bold ab+2c=DE\mml@font@italic ab+2c=DE\mml@font@bolditalic ab+2c=DE\mml@font@script ab+2c=DE\mml@font@boldscript ab+2c=DE\mml@font@fraktur ab+2c=DE\mml@font@doublestruck ab+2c=DE\mml@font@boldfraktur ab+2c=DE\mml@font@sansserif ab+2c=DE\mml@font@boldsansserif ab+2c=DE\mml@font@sansserifitalic ab+2c=DE\mml@font@sansserifbolditalic ab+2c=DE\mml@font@monospace ab+2c=DE

+

Xx\mathcal {Cal}\mathrm {Rm}\mathbf {Bf}\mathsf {Sf}\mathtt {Tt}\mathtt {x}\mathtt {y+1}\mathnormal {No} \mathit {It}\mathfrak {Fr} +Xx\mathcal {Cal}\mathrm {Rm}\mathbf {Bf}\mathsf {Sf}\mathtt {Tt}\mathtt {x}\mathtt {y+1}\mathnormal {No} \mathit {It}\mathfrak {Fr} + +\frac{\mathit {\mathbf {foo}}}{\mathrm {bar}+1}=3 + +a\text{b=1} c

+

oooooooooooooo +a\myhbox{b=1} c +a\text{b=1} c +a\mbox{b=1} c +a\hbox{b=1} c

+

a\mbox{b=1} c

+

\begin{pmatrix} +\binom{1}{2}&\int _0^\infty f(x)dx\\[2cm] +\mathfrak {W}_2&\text{xyz}=\sqrt{xxyyzz} +\end{pmatrix}

+

signal \bar{x }\in \mathcal {F} (y ) with smallest support.

+

\mbox{(\ref {W102})}=(\ref {W102})=\mbox{(\ref {W102})}

+ +a & = & b \\ +& = & c +\mbox{by (\ref {eqn:main2})} +1234 +

Non math version +Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

{}\left\lbrace \begin{array}{ll} 2 h(n) &\text{ for $0 \le n \le N/2-1$ }\\0 &\text{ otherwise }\\\end{array}\right.

+x +\rm \binom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \tbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \dbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}}\qquad {}^{\binom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \tbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \dbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}}} +

Additional tests +\hspace{20.0pt}, \hspace*{56.9055pt} 12>10\,\$ +\left[\mathit {x}^1_2 y^{22}_{33}\right\lbrace +\overline{x}\frac{1}{2} \mathmi[A='B']{c} +\genfrac{}{}{2.0pt}3{u}{v} \genfrac[]{}{}{u}{v} +\sqrt{10} \@root 3 \of {4} \@root 6 \of {7} +If x\in \emptyset then \forall n>0, \dfrac{1}{n^2}<0

+

Kumar test +x_{\mbox{{\scriptsize {H\,{\sc i}}}}} +x_{\mbox{{\scriptsize {H\,\quad \qquad \!\,\:\;{\sc i}}}}} +Testing references +a\mbox{b=1} c + + +\varPi =\varPsi

+ 123&34\\56&78 + 123&34\\56&78 + 123&34\\56&78 + 123&34\\56&78 +23&34\\56&78 +23&34\\56&78 +23&34\\56&78 +23&34\\56&78 +23&34\\56&78 +23&34\\56&78 +

+ok

+

AT_DOC_END

+
diff --git a/thirdparty/tralics-2.15.2/Modele/tormath1.xml b/thirdparty/tralics-2.15.2/Modele/tormath1.xml new file mode 100644 index 0000000..6ff6d03 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tormath1.xml @@ -0,0 +1,293 @@ + + + + +

DOCSTART

+x6 +simple math +

♯

+

ıj$_&{}%...# += + + +abcdefghijklmnopqrstuvwxyz +ABCDEFGHIJKLMNOPQRSTUVWXYZ +<>,?;./:+=- " ' ()§!` ' " +ሴaà

+

αβγδϵϵζηθικλμνξπρστυϕχψωϖϱςφϰϑ +ΓΔΘΛΞΣϒΦΠΨΩ

+

+

arccosarcsinarctanargcoscoshcotcothcscdegdim +exphomkerlglnlogPrsecsinsinhtantanhdetgcd +infinj limlimlim inflim supmaxminproj limsup

+

+

+

⨿÷±·*×

+

¬

+

ıȷ|}{¬¬'

+

<>,.:;*?!()[]|+-/=

+

+

...¬

+

α=β and +γ=δ and ϕ=ψ; +and 0

+
+Mathaccents +

HAT:a ^b ´c d ˙e ˘f ˇg `h k ¨l ˜abc

+

ACUTE:x ´x x ˘x ˇx x x ¨x ˙x `x ^x ˚x ˜x xyz ^xyz ˜

+

WIDETILDE:abc ˜abc ^abc abc abc abc _abc abc abc abc

+
+Commands +

min x f(x)>dmin x f(x). + +min x f(x)>dmin x f(x).

+

foo bar _ + j +X *X * +xyz +xyz +abc xyzabc xyzabc xyz +abcabc nabc n

+

1 a 2 +1 b 2 +[1 x 2 [

+1 2aaa bbbn m +

ab cd ab cd

+a=b b=1 cd d =2 cd d +

b=c c=1 cd d =2 cd d

+

1 2x1 2x1 2x1 2x1 2xa+xa+xa+xaxa xb+xa xb

+
+Environments + +Other +x 2 +y 2 =11=X 2 +Y 2 x=0.010.001=X +sin=cosccossin1+2 +ccaaAbbBaaβAaaBαCD +

AB

+ABCD +

a+b a+b

+0=1 +0=2 +0=3 +0=4 +0=5 +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +x 2 +y 2 =1x=1-y 2 +xy 1 ++y n z +x=17yy>a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p +EQ1 +

etc

+EQ2 +

etc

+EQ3 +uv+1modn 2 uv+1modn 2 u=v+1(modn 2 )u=v+1(n 2 ) +1 21 21 2 1 21 21 2 +bc+m 2 bcd+m 2 cbc+m 2 b +

o ˙ +a - b – c — d

+c+m 2 bd+m 2 cc+m 2 b d+m 2 dd+m 2 cc+m 2 b +a b c +

y´x ' x '' x ''' x '''' u 2 ' v 4 '3

+

min x f(x)>dmin x f(x).

+

min x f(x)>dmin x f(x).

+𝙰𝚊𝒜𝐀𝐚 Aa 𝐴𝑎𝔸𝖠𝖺Aa𝙱𝚋𝐁𝐛 Bb 𝐵𝑏𝔹𝖡𝖻Bb𝙲𝚌𝒞𝐂𝐜 Cc 𝐶𝑐𝖢𝖼Cc𝙳𝚍𝒟𝐃𝐝 Dd 𝐷𝑑𝔻𝖣𝖽Dd𝙴𝚎𝐄𝐞 Ee 𝐸𝑒𝔼𝖤𝖾Ee𝙵𝚏𝐅𝐟 Ff 𝐹𝑓𝔽𝖥𝖿Ff𝙶𝚐𝒢𝐆𝐠 Gg 𝐺𝑔𝔾𝖦𝗀Gg𝙷𝚑𝐇𝐡 Hh 𝐻ℎ𝖧𝗁Hh𝙸𝚒𝐈𝐢 Ii 𝐼𝑖𝕀𝖨𝗂Ii𝙹𝚓𝒥𝐉𝐣 Jj 𝐽𝑗𝕁𝖩𝗃Jj𝙺𝚔𝒦𝐊𝐤 Kk 𝐾𝑘𝕂𝖪𝗄Kk𝙻𝚕𝐋𝐥 Ll 𝐿𝑙𝕃𝖫𝗅Ll𝙼𝚖𝐌𝐦 Mm 𝑀𝑚𝕄𝖬𝗆Mm𝙽𝚗𝒩𝐍𝐧 Nn 𝑁𝑛𝖭𝗇Nn𝙾𝚘𝒪𝐎𝐨 Oo 𝑂𝑜𝕆𝖮𝗈Oo𝙿𝚙𝒫𝐏𝐩 Pp 𝑃𝑝𝖯𝗉Pp𝚀𝚚𝒬𝐐𝐪 Qq 𝑄𝑞𝖰𝗊Qq𝚁𝚛𝐑𝐫 Rr 𝑅𝑟𝖱𝗋Rr𝚂𝚜𝒮𝐒𝐬 Ss 𝑆𝑠𝕊𝖲𝗌Ss𝚃𝚝𝒯𝐓𝐭 Tt 𝑇𝑡𝕋𝖳𝗍Tt𝚄𝚞𝒰𝐔𝐮 Uu 𝑈𝑢𝕌𝖴𝗎Uu𝚅𝚟𝒱𝐕𝐯 Vv 𝑉𝑣𝕍𝖵𝗏Vv𝚆𝚠𝒲𝐖𝐰 Ww 𝑊𝑤𝕎𝖶𝗐Ww𝚇𝚡𝒳𝐗𝐱 Xx 𝑋𝑥𝕏𝖷𝗑Xx𝚈𝚢𝒴𝐘𝐲 Yy 𝑌𝑦𝕐𝖸𝗒Yy𝚉𝚣𝒵𝐙𝐳 Zz 𝑍𝑧𝖹𝗓Zz +

𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵

+

𝐚a𝒸d

+

a b c +a b c

+

x

+AAAAAAABBBBBCCCCCCCCCABCABCABCABC1223412234122340123456789abcdefCA0123456789abcdef0123456789abcdefCA0123456789abcdefABC +x ˙=Ax+g(x,u)y=Cxx𝐑 n +

a) x1 +b) x2 +c)

+x3 +

d)

+x4 +

e)

+x5 +

text A

+

text B

+

text C

+

line one

+

this is the second line

+

1efoobar.

+

1efoobar. +FooBar

+x ˙=Ax+g(x,u)y=CxxR n +a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F + + + + + + + + + +aaa +bbb +ccc +ddd +eee +fff +
+arccos 2 (x),arcsin 2 (x),arctan 2 (x),arg 2 (x),cos 2 (x),cosh 2 (x),cot 2 (x) +coth 2 (x),csc 2 (x),deg 2 (x),dim 2 (x),exp 2 (x),hom 2 (x),ker 2 (x),lg 2 (x) +ln 2 (x),log 2 (x),Pr 2 (x),sec 2 (x),sin 2 (x),sinh 2 (x),tan 2 (x),tanh 2 (x) +det x=1 ,gcd x=1 ,inf x=1 ,inj lim x=1 ,lim x=1 ,lim inf x=1 ,lim sup x=1 ,max x=1 ,min x=1 ,proj lim x=1 ,sup x=1 +

jX *X *abcabc nabc nabc xyzabc xyz

+n+m 2 nn+m 2 nn+m 2 n n+m 2 nn+m 2 nn+m 2 n +

+

1st xième ysome text.

+1 2aaa bbbn m +

a ba ba ba b

+

a ba ba b +a ba ba b +foo bar

+n+m 2 nn+m 2 nn+m 2 n +sup x=2 y1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f) +

aaaaaaaaaaaaaaaaaa 111111111 +aaaaaaaaaaaaaaaaaa 111111111 +abc def +abc def +abc def +abc def

+

a ˜,z ˜,a+b ˜

+

𝙿 P

+

á ááá á á á +a ^a ´a a ˙a ˘a ˇa `a a ¨a ˜

+d=z 2 =(I t +Ivvvv +Idiv(vvvvv )) 2 , +

ab=1c +ab1c

+

x y ϵ ϵ

+B (r )=μ 0 4π3m (r ' )·(r -r ' ) |r -r ' | 5 (r -r ' )-m (r ' ) |r -r ' | 3 . +

x 2 1 y 4 3 x 2 1 y 4 3 x 2 1 y 4 3 []abcdef

+

x 2 1 y 4 3 +x 2 1 y 4 3 + 0 x 2 1 y 4 3

+

+ +𝒳 𝓎 and 𝒳 𝓎 𝒵 +sin(x)+cos 2 (x) and xyz t

+

1 a 2 +1 b 2 +[1 x 2 [

+

f)a+b(=c+d +f(a+b)=c+d

+

ab

+

wwwwwwwwwwwwa...b...c   d      e f$g%h&ij k{l}mın♯o♮p♭q_

+

ab...cdef$g%h&ijk{l}mınopq_

+

Math spacing

+

xxxxx

+

xxxxx

+

aaa

+

aaa

+

!?#_.@%/|

+argmin Ψ θΘ ΔΦ θ Ω s -Ω t x y z =x y z =x y z =x y z =x y z =x y z =x y z =x y z {2 3} +

x=0123456789 +4 3 4 3

+0=1 +

ÂâẤấẦầẨẩẪẫẬậĈĉ +ÊêẾếỀá»á»‚ểỄễỆệĜÄĤĥÎîĴĵ +Ôôá»á»‘ỒồỔổỖỗỘộŜÅÛûŴŵŶŷáºáº‘ÃáǺǻǼǽẤấẮắĆćḈḉÉéḖḗẾếǴǵÃí +ḮḯḰḱĹĺḾḿŃńÓóǾǿṌá¹á¹’ṓá»á»‘Ớớ +ṔṕŔশṤṥÚúǗǘṸṹỨứẂẃÃýŹźÀàẦầẰằÈèḔḕỀá»ÃŒÃ¬Ç¸Ç¹ +Òòá¹á¹‘ỒồỜá»Ã™Ã¹Ç›Çœá»ªá»«áº€áºá»²á»³Ã„äǞǟËëḦḧÃïḮḯÖöȪȫṎá¹áº— +ÜüṺṻǛǜǗǘǙǚẄẅẌáºÅ¸Ã¿Ã‡Ã§á¸ˆá¸‰á¸á¸‘ȨȩḜḠ+ḨḩĢģĶķĻļŅņŖŗŞşŢţȀÈȄȅȈȉȌÈÈȑȔȕĂăẰằẮắẲẳẴẵẶặ +ĔĕḜá¸ÄžÄŸÄ¬Ä­ÅŽÅŬŭÇÇŽÄŒÄÄŽÄĚěǦǧȞȟǨǩÇÇǰĽľŇň +ǑǒŘřŠšŤťǓǔǙǚṦṧŽžÅőŰű +ỚớỜá»á»žá»Ÿá» á»¡á»¢á»£ +ỨứỪừỬửỮữỰựẢảẨẩẲẳẺẻỂểỈỉ +Ỏá»á»”ổỞởỦủỬửỶỷĄąĘęĮįǪǫǬǭŲųÅåŮůẘẙẠạẬậẶặḄḅḌá¸áº¸áº¹á»†á»‡á¸¤á¸¥á»Šá»‹á¸²á¸³á¸¶á¸·á¸¸á¸¹ +ṂṃṆṇỌá»á»˜á»™á»¢á»£á¹šá¹›á¹œá¹á¹¢á¹£á¹¨á¹©á¹¬ +ṭỤụỰựṾṿẈẉỴỵẒẓḀá¸á¸†á¸‡á¸Žá¸áº–ḴḵḺḻṈṉṞṟṮṯẔẕȂȃȆȇȊȋȎÈȒȓȖȗḚḛḬḭṴṵḒḓḘḙḼḽṊṋṰṱṶṷĀÄǞǟǠǡǢǣĒēḖḗḔḕḠḡĦħ +ĪīḸḹŌÅǬǭȪȫȬȭȰȱá¹á¹‘Ṓṓ +Ṝá¹Å¦Å§ÅªÅ«á¹ºá¹»È²È³È¦È§Ç Ç¡á¸‚ḃĊċḊḋĖėḞḟĠġḢḣİ +ĿŀṀá¹á¹„ṅȮȯȰȱṖṗṘṙ +ṠṡṨṩṦṧṤṥṪṫẆẇẊẋẎáºÅ»Å¼

+

B

+

ab+2c=DE ab +2c= DE 𝐚𝐛+2𝐜=𝐃𝐄𝑎𝑏+2𝑐=𝐷𝐸𝒂𝒃+2𝒄=𝑫𝑬𝒶𝒷+2𝒸=𝒟ℰ𝓪𝓫+2𝓬=𝓓𝓔𝔞𝔟+2𝔠=𝔇𝔈𝕒𝕓+2𝕔=𝔻𝔼𝖆𝖇+2𝖈=𝕯𝕰𝖺𝖻+2𝖼=𝖣𝖤𝗮𝗯+2𝗰=𝗗𝗘𝘢𝘣+2𝘤=𝘋𝘌𝙖𝙗+2𝙘=𝘿𝙀𝚊𝚋+2𝚌=𝙳𝙴

+

Xx𝒞𝒶𝓁 Rm 𝐁𝐟𝖲𝖿𝚃𝚝𝚡𝚢+1No𝐼𝑡𝔉𝔯 +𝐗𝐱𝓒𝓪𝓵 Rm 𝐁𝐟𝗦𝗳𝚃𝚝𝚡𝚢+1𝐍𝐨𝑰𝒕𝕱𝖗 + +𝐟𝐨𝐨 bar +1=3 + +𝐚b=1𝐜

+

oooooooooooooo +ab=1c +ab=1c +ab=1c +ab=1c

+

ab=1c

+

1 2 0 f(x)dx𝔚 2 xyz=xxyyzz

+

signal x (y) with smallest support.

+

()=()=()

+a=b=cby() +1234 +

Non math version +Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

2h(n)for0nN/2-10otherwise

+x +\scriptstyle+m 2 \textstyle0\scriptscriptstyle+m 2 \scriptstyle0\scriptstyle+m 2 \textstyle0 \scriptscriptstyle+m 2 \scriptscriptstyle0\scriptscriptstyle+m 2 \scriptstyle0\scriptstyle+m 2 \textstyle0 +

Additional tests +,12>10$ +𝑥 2 1 y 33 22 +x 1 2c +u vu v +104 37 6 +If x then n>0,1 n 2 <0

+

Kumar test +x Hi +x Hi +Testing references +ab=1c + + +Π=Ψ

+123345678 +123345678 +123345678 +123345678 +23345678 +23345678 +23345678 +23345678 +23345678 +23345678 +

+ok

+

AT_DOC_END

+
diff --git a/thirdparty/tralics-2.15.2/Modele/tormath2.xml b/thirdparty/tralics-2.15.2/Modele/tormath2.xml new file mode 100644 index 0000000..8066fc6 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tormath2.xml @@ -0,0 +1,523 @@ + + + + +

DOCSTART

+x6 +simple math +

+

+ ~ += +56.9055pt 569.05511pt 3.0pt4.0pt5.0pt6.0pt +-24.0pt -24.0pt -3.0pt4.0pt-5.0pt-6.0pt +abcdefghijklmnopqrstuvwxyz +ABCDEFGHIJKLMNOPQRSTUVWXYZ +<>,?;./:+=-"()§!` " +ሴaà

+

+

+

+

+ +

+

+

+

+

+

+

<>,.:;*?!()[]|+-/=

+

5.0pt ~

+

+

= and += and =; +and 0

+ +Mathaccents +

HAT: a b c d e f g h +k labc

+

ACUTE: x x x x +x x x x +x x x x +x xyz xyz

+

WIDETILDE: abc abc abc abc +abc abc abc abc +abc abc +

+
+Commands +

xf(x) >dminxf(x). + +xf(x) >dminxf(x).

+

foobar +j +*X *X +xyz +xyz +abcxyz abcxyz abcxyz +abc nabc n abc

+

[1a2[ +1b2 +[1x2[

+12 +aaabbb +nm + +

abcd abcd

+abcd= abcdabcd = +1abcdabcdabcd = 2 abcdabcdabcd +

abcd= abcdabcd = +1abcdabcdabcd = 2 abcdabcdabcd

+

12x12 +x12x12x12 xa+xa+xa+xaxaxb+xaxb

+
+Environments + +Other + + +x2+y2&=1 & 1 &=X2+Y2 +x &=0.01& 0.001&=X + + + += +abc +1r +1l +1+2 + +ccaaAbbBaa AaaB C D +

AB

+ AB C D +

a+b a+b

+ 0=1 + 0=2 + 0=3 + 0=4 + 0 = 5 + + +(a+b)4 &= (a+b) 2 (a+b)2 +&= (a2+2ab+b2)(a2+2ab+b2) +&= a4+4a3b+6a2b2+4ab3+b4 + + + + +(a+b)4 &= (a+b) 2 (a+b)2 +&= (a2+2ab+b2)(a2+2ab+b2) +&= a4+4a3b+6a2b2+4ab3+b4 + + + +x2+y2&=1 x&=1-y2 + + +x & & y1 + + yn +& &z + + +x & = &17y +y & > & a + b + c+d+e+f+g+h+i+j+ +& & k+l+m+n+o+p + +EQ1 +

etc

+EQ2 +

etc

+EQ3 + +u& v+1 n2 +u& v+1 n2 +u& = v+1 n2 +u& = v+1 10.0pt(n2) + +12 12 12 12 12 12 +abcdabcd+m2abcdabcdabcd+m2abcdabcdabcd+m2abcd +

o +a - b – c — d

+abcd+m2abcdabcd+m2abcdabcd+m2abcdabcd+m2abcdabcd+m2abcdabcd+m2abcd +abc + +

x x x x u2 v34

+

xf(x) >dminxf(x).

+

xf(x) >dminformprefixmovablelimitstruexf(x).

+ +AaAAaAa +AaAAaAa &BbBBbBb +BbBBbBb +CcCCcCc +CcCCcCc &DdDDdDd +DdDDdDd +EeEEeEe +EeEEeEe &FfFFfFf +FfFFfFf +GgGGgGg +GgGGgGg &HhHHhHh +HhHHhHh +IiIIiIi +IiIIiIi &JjJJjJj +JjJJjJj +KkKKkKk +KkKKkKk &LlLLlLl +LlLLlLl +MmMMmMm +MmMMmMm &NnNNnNn +NnNNnNn +OoOOoOo +OoOOoOo &PpPPpPp +PpPPpPp +QqQQqQq +QqQQqQq &RrRRrRr +RrRRrRr +SsSSsSs +SsSSsSs &TtTTtTt +TtTTtTt +UuUUuUu +UuUUuUu &VvVVvVv +VvVVvVv +WwWWwWw +WwWWwWw &XxXXxXx +XxXXxXx +YyYYyYy +YyYYyYy &ZzZZzZz +ZzZZzZz + + +

ABCDEFGHIJKLMNOPQRSTUVWXYZ

+

a a c d

+

acb +abc

+

x

+ +lcr +AAAAAAA&BBBBBCC&CCCCCCC +A&B&C +1cA&1cB&1cC +1rA&1rB&rcC +1lA&1lB&lcC +cl1&223&4&cc1&223&4&cr1&223&4 +2c0123456789abcdef&C +A&2c0123456789abcdef +2r0123456789abcdef&C +A&2l0123456789abcdef +A&B&C + + + +lcl +x & = & Ax+g(x,u) +y & = & Cx +3lxRn + + + +

a) x1 +b) x2 +c)

+ x3 +

d)

+ x4 +

e)

+ x5 +

text A

+

text B

+

text C

+

line one

+

this is the second line

+

1efoobar.

+

1efoobar. +FooBar

+ +lcl +x & = & Ax+g(x,u)[2mm] +y & = & Cx +3lxRn + + +a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F + + + + + + + + + +aaa +bbb +ccc +ddd +eee +fff +
+ 2 (x), 2(x) , 2(x) , 2(x), +2(x) , 2(x) , 2(x) + 2(x) , 2(x), 2(x), 2(x), 2(x), +2(x), 2(x) , 2(x) + 2(x), 2(x), 2(x), 2(x), 2(x) , +2(x), 2(x), 2(x) + x=1, x=1, x=1, x=1, +x=1, x=1,x=1, +x=1, x=1, x=1, x=1 + +

j *X *X +abc nabc n abc +abcxyz abcxyz +

+n+m2n n+m2n n+m2nn+m2n n+m2n n+m2n +

+

1st xième ysome text.

+12 +aaabbb +nm + +

ab +ab +ab +ab

+

aba1pt bab +a() ba()1pt ba() b +foobar

+n+m2n n+m2n n+m2n + +x=2y~ +1k2 c(f) +1k2 c(f) +1k2 c(f) +1k2 c(f) + +

aaaaaaaaaaaaaaaaaa111111111 +aaaaaaaaaaaaaaaaaa111111111 +abcdef +abcdef +abcdef +abcdef

+

a,z, a+b

+

P P

+

á ááá á á á +a a a a a +a a a a a +

+d=z2=( It + Ivvvv +I div(vvvvv) )2, +

ab=1 c +ab~1~c

+

xy

+ +B(r) = 04 +3m(r)(r-r)|r-r|5 +(r-r) - m(r)|r-r|3 +. + +

+ + x12y34x12y34x12y34[]a0.55542ptb1.111ptc 2.22214ptd 4.44443pte 8.88885ptf +

+

+x12y34 + +x12y34 + +0x12y34

+

+ +Xyand XyZ +(x) + 2(x) and xyz t

+

[1a2[ +1b2 +[1x2[

+

f)a+b(=c+d +f(a+b)=c+d

+

ab

+

wwwwwwwwwwwwa...b...c   d      e f$g%h&ij k{l}mın♯o♮p♭q_

+

abcde fghijklmnopq

+

Math spacing

+

xxxxx

+

xxxxx

+

aaa

+

aaa

+

!?.@/|

+ +argmin + s +-t +xyz = xyz= +xyz = xyz= +xyz = xyz= +xyz = xyz +23 + +

x=0123456789 +3 4 34

+ +0=11.38092pt1 + +

 â Ấ ấ Ầ ầ Ẩ ẩ Ẫ ẫ +Ậ ậ Ĉ ĉ + Ê ê Ế ế Ề ề Ể +ể Ễ ễ Ệ ệ Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ + +Ô ô Ố ố Ồ ồ Ổ ổ Ỗ ỗ +Ộ ộ Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ Ẑ ẑ +Á á Ǻ ǻ Ǽ ǽ Ấ ấ Ắ ắ +Ć ć Ḉ ḉ É é Ḗ +ḗ Ế ế Ǵ ǵ Í í +Ḯ ḯ Ḱ ḱ Ĺ ĺ Ḿ +ḿ Ń ń Ó ó Ǿ ǿ Ṍ ṍ Ṓ ṓ Ố +ố Ớ ớ + Ṕ ṕ Ŕ ŕ Ś ś +Ṥ ṥ Ú ú Ǘ ǘ Ṹ ṹ Ứ ứ +Ẃ ẃ Ý ý Ź ź +À à Ầ ầ Ằ ằ È è Ḕ ḕ Ề +ề Ì ì Ǹ ǹ +Ò ò Ṑ ṑ Ồ ồ +Ờ ờ Ù ù Ǜ ǜ Ừ ừ Ẁ ẁ Ỳỳ +Ä ä Ǟ ǟ Ë ë Ḧ ḧ Ï ï Ḯ ḯ Ö ö +Ȫ ȫ Ṏ ṏ ẗ + Ü ü Ṻ ṻ Ǜ ǜ +Ǘ ǘ Ǚ ǚ Ẅ ẅ Ẍ ẍ Ÿ ÿ +Ç ç Ḉ ḉ Ḑ ḑ Ȩ ȩ Ḝ ḝ + +Ḩ ḩ Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ +Ȁ ȁ Ȅ ȅ Ȉ ȉ Ȍ ȍ Ȑ ȑ Ȕ ȕ +Ă ă Ằ ằ Ắ ắ Ẳ ẳ Ẵ ẵ +Ặ ặ + Ĕ ĕ Ḝ ḝ Ğ ğ Ĭ ĭ +Ŏ ŏ Ŭ ŭ +Ǎ ǎ Č č Ď ď Ě ě Ǧ ǧ Ȟ ȟ Ǩ ǩ +Ǐ ǐ ǰ Ľ ľ Ň ň + Ǒ +ǒ Ř ř Š š Ť ť Ǔ ǔ Ǚ ǚ Ṧ +ṧ Ž ž +Ő ő Ű ű + +Ớ ớ Ờ ờ Ở ở Ỡ ỡ +Ợ ợ + Ứ ứ Ừ ừ Ử ử Ữ +ữ Ự ự +Ả ả Ẩ ẩ Ẳ ẳ Ẻ ẻ Ể ể Ỉ +ỉ + Ỏ ỏ Ổ ổ Ở ở Ủ ủ +Ử ử Ỷ ỷ +Ą ą Ę ę Į į Ǫ ǫ Ǭ ǭ Ų ų +Å å Ů ů ẘ ẙ +Ạ ạ Ậ ậ Ặ ặ Ḅ ḅ Ḍ ḍ Ẹ ẹ +Ệ ệ Ḥ ḥ Ị ị Ḳ ḳ Ḷ ḷ Ḹ ḹ + +Ṃ ṃ Ṇ ṇ Ọ ọ Ộ ộ Ợ ợ +Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṩ ṩ Ṭ + +ṭ Ụ ụ Ự ự Ṿ +ṿ Ẉ ẉ Ỵ ỵ Ẓ ẓ +Ḁ ḁ +Ḇ ḇ Ḏ ḏ ẖ Ḵ ḵ Ḻ ḻ +Ṉ ṉ Ṟ ṟ Ṯ ṯ Ẕ ẕ +Ȃ ȃ Ȇ ȇ Ȋ ȋ Ȏ ȏ Ȓ ȓ Ȗ ȗ +Ḛ ḛ Ḭ ḭ Ṵ ṵ +Ḓ ḓ Ḙ ḙ Ḽ ḽ Ṋ ṋ Ṱ ṱ Ṷ ṷ +Ā ā Ǟ ǟ Ǡ ǡ ǢǣĒ ē Ḗ ḗ +Ḕ ḕ Ḡ ḡ Ħ ħ + +Ī ī Ḹ ḹ Ō ō Ǭ ǭ Ȫ ȫ Ȭ +ȭ Ȱ ȱ Ṑ ṑ Ṓ ṓ + Ṝ ṝ +Ŧ ŧ Ū ū Ṻ ṻ Ȳ ȳ +Ȧ ȧ Ǡ ǡ Ḃ ḃ Ċ ċ Ḋ ḋ Ė ė Ḟ ḟ Ġ ġ Ḣ +ḣ İ +Ŀ ŀ Ṁ ṁ Ṅ ṅ Ȯ ȯ Ȱ ȱ Ṗ ṗ Ṙ ṙ + +Ṡ +ṡ Ṩ ṩ Ṧ ṧ Ṥ ṥ Ṫ ṫ Ẇ ẇ Ẋ +ẋ Ẏ ẏ Ż ż +

+

B

+

ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE ab+2c=DE

+

XxCalRmBfSfTtxy+1No ItFr +XxCalRmBfSfTtxy+1No ItFr + +foobar+1=3 + +ab=1 c

+

oooooooooooooo +ab=1 c +ab=1 c +ab=1 c +ab=1 c

+

ab=1 ctag8-2-3

+

+12&0f(x)dx[2cm] +W2&xyz=xxyyzz +

+

signal x F (y ) with smallest support.

+

(W102)=(W102)=(W102)

+ +a & = & b +& = & c +by (eqn:main2) +1234 +

Non math version +Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

ll 2 h(n) & for 0 n N/2-1 0 & otherwise

+xlabel1 +\displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0 \displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0 \displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0\displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0 \displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0 \displaystyle+\textstyle+\scriptstyle+\scriptscriptstyle+m2\displaystyle0\textstyle0\scriptstyle0\scriptscriptstyle0 +

Additional tests +20.0pt, 56.9055pt 12>10 +x12 y2233 +x12 c +uv uv +10 3 4 67 +If x then n>0, 1n2<0

+

Kumar test +xHi +xHi +Testing references +ab=1 ctag8-2-3xxyy + + +=

+ 123&3456&78 + 123&3456&78 + 123&3456&78 + 123&3456&78 +23&3456&78 +23&3456&78 +23&3456&78 +23&3456&78 +23&3456&78 +23&3456&78 +

+ok

+

AT_DOC_END

+ diff --git a/thirdparty/tralics-2.15.2/Modele/tormath3.xml b/thirdparty/tralics-2.15.2/Modele/tormath3.xml new file mode 100644 index 0000000..8dc028a --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tormath3.xml @@ -0,0 +1,523 @@ + + + + +

DOCSTART

+x6x6 +simple math +

\sharp

+

ıj$_&{}%...# +\i \j \$ ~\, \_ \& \lbrace \rbrace \% \ \! \quad \qquad \dots \ldots \# \sharp \natural \flat += +\hspace{56.9055pt} \vspace{569.05511pt} \hspace{3.0pt}\vspace{4.0pt}\hspace*{5.0pt}\vspace*{6.0pt} +\hspace{-24.0pt} \vspace{-24.0pt} \hspace{-3.0pt}\vspace{4.0pt}\hspace*{-5.0pt}\vspace*{-6.0pt} +abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz +ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ +<>,?;./:+=- " ' ()§!` ' "<>,?;./:+=-_"^{\prime }()§!` ^{\prime }" +aàሴaà

+

αβγδϵϵζηθικλμνξπρστυϕχψωϖϱςφϰϑ\alpha \beta \gamma \delta \epsilon \varepsilon \zeta \eta \theta \iota \kappa \lambda \mu \nu \xi \pi \rho \sigma \tau \upsilon \phi \chi \psi \omega \varpi \varrho \varsigma \varphi \varkappa \vartheta +ΓΔΘΛΞΣϒΦΠΨΩ\Gamma \Delta \Theta \Lambda \Xi \Sigma \Upsilon \Phi \Pi \Psi \Omega

+

\hbar \ell \wp \Re \Im \partial \infty \emptyset \nabla \surd \top \bottom \bot \angle \triangle

+

arccosarcsinarctanargcoscoshcotcothcscdegdim \arccos \arcsin \arctan \arg \cos \cosh \cot \coth \csc \deg \dim +exphomkerlglnlogPrsecsinsinhtantanhdetgcd \exp \hom \ker \lg \ln \log \Pr \sec \sin \sinh \tan \tanh \det \gcd +infinj limlimlim inflim supmaxminproj limsup\inf \injlim \lim \liminf \limsup \max \min \projlim \sup

+

\forall \exists

+

\coprod \bigvee \bigwedge \biguplus \bigcap \bigcup \int \sum \prod \bigotimes \bigoplus \bigodot \oint \bigsqcup \smallint

+

⨿÷±·*×\triangleleft \triangleright \bigtriangleup \bigtriangledown \wedge \wedge \vee \vee \cap \cup \multimap \dagger \ddagger \sqcap \sqcup \amalg \diamond \Diamond \bullet \wr \div \odot \oslash \otimes \ominus \oplus \uplus \mp \pm \circ \bigcirc \setminus \cdot \ast \times \star

+

¬\propto \sqsubseteq \sqsupseteq \subseteq \sqsubset \parallel \mid \dashv \vdash \Vdash \models \nearrow \searrow \swarrow \nwarrow \Leftrightarrow \Leftarrow \Rightarrow \ne \ne \le \le \ge \ge \succ \approx \succeq \preceq \prec \doteq \subset \supset \supseteq \subseteq \bindnasrepma \ni \ni \gg \ll \gtrless \geqslant \leqslant \lnot \notin \leftrightarrow \leftarrow \leftarrow \rightarrow \rightarrow \mapsto \sim \simeq \perp \equiv \asymp \smile \frown \leftharpoonup \leftharpoondown \rightharpoonup \rightharpoondown \hookrightarrow \hookleftarrow \bowtie \bowtie \Longrightarrow \longrightarrow \longleftarrow \Longleftarrow \longmapsto \longleftrightarrow \Longleftrightarrow \iff

+

ıȷ|}{¬¬' \cdots \hdots \vdots \ddots \imath \jmath \Vert \Vert \vert \uparrow \downarrow \Uparrow \Downarrow \Updownarrow \updownarrow \mho \clubsuit \diamondsuit \heartsuit \spadesuit \aleph \backslash \Box \langle \rangle \rmoustache \lmoustache \rgroup \lgroup \rbrace \lbrace \rceil \lceil \rfloor \lfloor \square \cong \lnot \lnot \in \prime

+

<>,.:;*?!()[]|+-/= <>,.:;*?!()[]|+-/=

+

\hspace{5.0pt}\: \; \: \! \quad \qquad ~

+

...¬\smallint \int \vee \ni \ldots \top \bot \nabla \flat \Re \infty \surd \natural \Im \hbar \ell \sharp \angle \emptyset \triangle \lnot \wp \partial

+

α=β\alpha =\beta and +γ=δ\gamma =\delta and ϕ=ψ\phi =\psi ; +and 00\ne \infty

+
+Mathaccents +

HAT:a ^b ´c d ˙e ˘f ˇg `h k ¨l ˜abcHAT: \hat{a} \acute{b} \bar{c} \dot{d} \breve{e} \check{f} \grave{g} \vec{h} +\ddot{k} \tilde{l}a\rightarrow b\longrightarrow c

+

ACUTE:x ´x x ˘x ˇx x x ¨x ˙x `x ^x ˚x ˜x xyz ^xyz ˜ACUTE: \acute{x} \bar{x} \breve{x} \check{x} +\ddddot{x} \dddot{x} \ddot{x} \dot{x} +\grave{x} \hat{x} \mathring{x} \tilde{x} +\vec{x} \widehat{xyz} \widetilde{xyz}

+

WIDETILDE:abc ˜abc ^abc abc abc abc _abc abc abc abc WIDETILDE: \widetilde{abc} \widehat{abc} \overleftarrow{abc} \overrightarrow{abc} +\overline{abc} \underline{abc} \overbrace{abc} \underbrace{abc} +\underleftarrow{abc} \underrightarrow{abc} +

+
+Commands +

min x f(x)>dmin x f(x)\min _xf(x) >\operatorname{dmin}_xf(x). + +min x f(x)>dmin x f(x)\min _xf(x) >\operatornamewithlimits{dmin}_xf(x).

+

foo bar _\overline{foo}\underline{bar} + j\stackrel{j}{\longrightarrow } +X *X *\overset{*}{X} \underset{*}{X} +xyz \overbrace{xyz} +xyz \underbrace{xyz} +abc xyzabc xyzabc xyz\frac{abc}{xyz} \dfrac{abc}{xyz} \tfrac{abc}{xyz} +abcabc nabc n\sqrt{abc} \@root n \of {abc} \@root n \of {abc}

+

1 a 2 \bigl [\frac{1}{a^2}\bigr [ +1 b 2 \left[\frac{1}{b^2}\right[ +[1 x 2 [[\frac{1}{x^2}[

+1 2aaa bbbn m\genfrac{}{}{}{}{1}{2} +\genfrac[]{2.0pt}2{aaa}{bbb} +\genfrac(){0.0pt}0{n}{m} + +

ab cd ab cd a\nonscript \,b_{c\nonscript \,d} a\nonscript \,b_{\textstyle c\nonscript \,d}

+a=b b=1 cd d =2 cd d \mathchoice{a}{b}{c}{d}= \frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}} = +1_{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} = 2^ {\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} +

b=c c=1 cd d =2 cd d \mathchoice{a}{b}{c}{d}= \frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}} = +1_{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}} = 2^ {\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}}{\mathchoice{a}{b}{c}{d}}}

+

1 2x1 2x1 2x1 2x1 2xa+xa+xa+xaxa xb+xa xb{\frac{1}{2}}{x\displaystyle \frac{1}{2}} +{x\textstyle \frac{1}{2}}{x\scriptstyle \frac{1}{2}}{x\scriptscriptstyle \frac{1}{2}} \qquad {x\displaystyle a}+{x\textstyle a}+{x\scriptstyle a}+{x\scriptscriptstyle a}\qquad \frac{x\displaystyle a}{x\textstyle b}+\frac{x\scriptstyle a}{x\scriptscriptstyle b}

+
+Environments + +Other +x 2 +y 2 =11=X 2 +Y 2 x=0.010.001=X +\begin{aligned} +x^2+y^2&=1 & 1 &=X^2+Y^2\\ +x &=0.01& 0.001&=X +\end{aligned} + +sin=cosccossin1+2 +\sin =\cos \\ +\multicolumn{a}{b}{c}\\ +\multicolumn{1}{r}{\cos }\\ +\multicolumn{1}{l}{\sin }\\ +1+2 + +ccaaAbbBaaβAaaBαCD\beta A\hbox{aaB $\alpha C$} D +

AB

+ABCD A\hbox{B $C$} D +

a+ba+b a+ba\mathbin +b

+0=1 0=1 +0=2 0=2 +0=3 0=3 +0=4 0=4 +0=5 0 = 5 +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +\begin{split} +(a+b)^4 &= (a+b)^ 2 (a+b)^2 \\ +&= (a^2+2ab+b^2)(a^2+2ab+b^2) \\ +&= a^4+4a^3b+6a^2b^2+4ab^3+b^4 \\ +\end{split} + +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +\begin{aligned} +(a+b)^4 &= (a+b)^ 2 (a+b)^2 \\ +&= (a^2+2ab+b^2)(a^2+2ab+b^2) \\ +&= a^4+4a^3b+6a^2b^2+4ab^3+b^4 \\ +\end{aligned} + +x 2 +y 2 =1x=1-y 2 +x^2+y^2&=1\\ x&=\sqrt{1-y^2} + +xy 1 ++y n z +x & \ll & y_{1} + \cdots + y_{n} \\ +& \le &z + +x=17yy>a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p +x & = &17y \\ +y & > & a + b + c+d+e+f+g+h+i+j+ \nonumber \\ +& & k+l+m+n+o+p + +EQ1EQ1 +

etc

+EQ2EQ2 +

etc

+EQ3EQ3 +uv+1modn 2 uv+1modn 2 u=v+1(modn 2 )u=v+1(n 2 ) +u& \equiv v+1 \mod {n^2} \\ +u& \equiv v+1 \bmod {n^2} \\ +u& = v+1 \pmod {n^2} \\ +u& = v+1 \hspace{10.0pt}(n^2) \\ + +1 21 21 2 1 21 21 2 \frac{1}{2} \dfrac{1}{2} \tfrac{1}{2} \qquad {}^{\frac{1}{2} \dfrac{1}{2} \tfrac{1}{2}} +bc+m 2 bcd+m 2 cbc+m 2 b\frac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tfrac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dfrac{\mathchoice{a}{b}{c}{d}\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}} +

o ˙ \bar{\dot{\rm o}} +a - b – c — d

+c+m 2 bd+m 2 cc+m 2 b d+m 2 dd+m 2 cc+m 2 b \binom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\qquad {}^{\binom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \tbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}\quad \dbinom{\frac{\mathchoice{a}{b}{c}{d}+m}{2}}{\mathchoice{a}{b}{c}{d}}} +a b ca\over {b\over c} + +

x ' x '' x ''' x '''' u 2 ' v 4 '3 x^{\prime } x^{\prime \prime } x^{\prime \prime \prime } x^{\prime \prime \prime \prime } u_2^{\prime } v^{\prime 3}_4

+

min x f(x)>dmin x f(x)\min _xf(x) >\operatorname{dmin}_xf(x).

+

min x f(x)>dmin x f(x)\min _xf(x) >\mathmo{dmin}\mathattribute{form}{prefix}\mathattribute{movablelimits}{true}_xf(x).

+𝙰𝚊𝒜𝐀𝐚 Aa 𝐴𝑎𝔸𝖠𝖺Aa𝙱𝚋𝐁𝐛 Bb 𝐵𝑏𝔹𝖡𝖻Bb𝙲𝚌𝒞𝐂𝐜 Cc 𝐶𝑐𝖢𝖼Cc𝙳𝚍𝒟𝐃𝐝 Dd 𝐷𝑑𝔻𝖣𝖽Dd𝙴𝚎𝐄𝐞 Ee 𝐸𝑒𝔼𝖤𝖾Ee𝙵𝚏𝐅𝐟 Ff 𝐹𝑓𝔽𝖥𝖿Ff𝙶𝚐𝒢𝐆𝐠 Gg 𝐺𝑔𝔾𝖦𝗀Gg𝙷𝚑𝐇𝐡 Hh 𝐻ℎ𝖧𝗁Hh𝙸𝚒𝐈𝐢 Ii 𝐼𝑖𝕀𝖨𝗂Ii𝙹𝚓𝒥𝐉𝐣 Jj 𝐽𝑗𝕁𝖩𝗃Jj𝙺𝚔𝒦𝐊𝐤 Kk 𝐾𝑘𝕂𝖪𝗄Kk𝙻𝚕𝐋𝐥 Ll 𝐿𝑙𝕃𝖫𝗅Ll𝙼𝚖𝐌𝐦 Mm 𝑀𝑚𝕄𝖬𝗆Mm𝙽𝚗𝒩𝐍𝐧 Nn 𝑁𝑛𝖭𝗇Nn𝙾𝚘𝒪𝐎𝐨 Oo 𝑂𝑜𝕆𝖮𝗈Oo𝙿𝚙𝒫𝐏𝐩 Pp 𝑃𝑝𝖯𝗉Pp𝚀𝚚𝒬𝐐𝐪 Qq 𝑄𝑞𝖰𝗊Qq𝚁𝚛𝐑𝐫 Rr 𝑅𝑟𝖱𝗋Rr𝚂𝚜𝒮𝐒𝐬 Ss 𝑆𝑠𝕊𝖲𝗌Ss𝚃𝚝𝒯𝐓𝐭 Tt 𝑇𝑡𝕋𝖳𝗍Tt𝚄𝚞𝒰𝐔𝐮 Uu 𝑈𝑢𝕌𝖴𝗎Uu𝚅𝚟𝒱𝐕𝐯 Vv 𝑉𝑣𝕍𝖵𝗏Vv𝚆𝚠𝒲𝐖𝐰 Ww 𝑊𝑤𝕎𝖶𝗐Ww𝚇𝚡𝒳𝐗𝐱 Xx 𝑋𝑥𝕏𝖷𝗑Xx𝚈𝚢𝒴𝐘𝐲 Yy 𝑌𝑦𝕐𝖸𝗒Yy𝚉𝚣𝒵𝐙𝐳 Zz 𝑍𝑧𝖹𝗓Zz\begin{split} +\mathtt {Aa}\mathcal {A}\mathbf {Aa}\mathrm {Aa} +\mathit {Aa}\mathbb {A}\mathsf {Aa}\mathnormal {Aa} &\mathtt {Bb}\mathcal {B}\mathbf {Bb}\mathrm {Bb} +\mathit {Bb}\mathbb {B}\mathsf {Bb}\mathnormal {Bb}\\ +\mathtt {Cc}\mathcal {C}\mathbf {Cc}\mathrm {Cc} +\mathit {Cc}\mathbb {C}\mathsf {Cc}\mathnormal {Cc} &\mathtt {Dd}\mathcal {D}\mathbf {Dd}\mathrm {Dd} +\mathit {Dd}\mathbb {D}\mathsf {Dd}\mathnormal {Dd}\\ +\mathtt {Ee}\mathcal {E}\mathbf {Ee}\mathrm {Ee} +\mathit {Ee}\mathbb {E}\mathsf {Ee}\mathnormal {Ee} &\mathtt {Ff}\mathcal {F}\mathbf {Ff}\mathrm {Ff} +\mathit {Ff}\mathbb {F}\mathsf {Ff}\mathnormal {Ff}\\ +\mathtt {Gg}\mathcal {G}\mathbf {Gg}\mathrm {Gg} +\mathit {Gg}\mathbb {G}\mathsf {Gg}\mathnormal {Gg} &\mathtt {Hh}\mathcal {H}\mathbf {Hh}\mathrm {Hh} +\mathit {Hh}\mathbb {H}\mathsf {Hh}\mathnormal {Hh}\\ +\mathtt {Ii}\mathcal {I}\mathbf {Ii}\mathrm {Ii} +\mathit {Ii}\mathbb {I}\mathsf {Ii}\mathnormal {Ii} &\mathtt {Jj}\mathcal {J}\mathbf {Jj}\mathrm {Jj} +\mathit {Jj}\mathbb {J}\mathsf {Jj}\mathnormal {Jj}\\ +\mathtt {Kk}\mathcal {K}\mathbf {Kk}\mathrm {Kk} +\mathit {Kk}\mathbb {K}\mathsf {Kk}\mathnormal {Kk} &\mathtt {Ll}\mathcal {L}\mathbf {Ll}\mathrm {Ll} +\mathit {Ll}\mathbb {L}\mathsf {Ll}\mathnormal {Ll}\\ +\mathtt {Mm}\mathcal {M}\mathbf {Mm}\mathrm {Mm} +\mathit {Mm}\mathbb {M}\mathsf {Mm}\mathnormal {Mm} &\mathtt {Nn}\mathcal {N}\mathbf {Nn}\mathrm {Nn} +\mathit {Nn}\mathbb {N}\mathsf {Nn}\mathnormal {Nn}\\ +\mathtt {Oo}\mathcal {O}\mathbf {Oo}\mathrm {Oo} +\mathit {Oo}\mathbb {O}\mathsf {Oo}\mathnormal {Oo} &\mathtt {Pp}\mathcal {P}\mathbf {Pp}\mathrm {Pp} +\mathit {Pp}\mathbb {P}\mathsf {Pp}\mathnormal {Pp}\\ +\mathtt {Qq}\mathcal {Q}\mathbf {Qq}\mathrm {Qq} +\mathit {Qq}\mathbb {Q}\mathsf {Qq}\mathnormal {Qq} &\mathtt {Rr}\mathcal {R}\mathbf {Rr}\mathrm {Rr} +\mathit {Rr}\mathbb {R}\mathsf {Rr}\mathnormal {Rr}\\ +\mathtt {Ss}\mathcal {S}\mathbf {Ss}\mathrm {Ss} +\mathit {Ss}\mathbb {S}\mathsf {Ss}\mathnormal {Ss} &\mathtt {Tt}\mathcal {T}\mathbf {Tt}\mathrm {Tt} +\mathit {Tt}\mathbb {T}\mathsf {Tt}\mathnormal {Tt}\\ +\mathtt {Uu}\mathcal {U}\mathbf {Uu}\mathrm {Uu} +\mathit {Uu}\mathbb {U}\mathsf {Uu}\mathnormal {Uu} &\mathtt {Vv}\mathcal {V}\mathbf {Vv}\mathrm {Vv} +\mathit {Vv}\mathbb {V}\mathsf {Vv}\mathnormal {Vv}\\ +\mathtt {Ww}\mathcal {W}\mathbf {Ww}\mathrm {Ww} +\mathit {Ww}\mathbb {W}\mathsf {Ww}\mathnormal {Ww} &\mathtt {Xx}\mathcal {X}\mathbf {Xx}\mathrm {Xx} +\mathit {Xx}\mathbb {X}\mathsf {Xx}\mathnormal {Xx}\\ +\mathtt {Yy}\mathcal {Y}\mathbf {Yy}\mathrm {Yy} +\mathit {Yy}\mathbb {Y}\mathsf {Yy}\mathnormal {Yy} &\mathtt {Zz}\mathcal {Z}\mathbf {Zz}\mathrm {Zz} +\mathit {Zz}\mathbb {Z}\mathsf {Zz}\mathnormal {Zz}\\ +\end{split} + +

𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵{\cal ABCDEFGHIJKLMNOPQRSTUVWXYZ}

+

𝐚a𝒸d \bf a \mathrm {a \mathcal {c} d}

+

a b c a^c_b +a b c a_b^c

+

xx\Box

+AAAAAAABBBBBCCCCCCCCCABCABCABCABC1223412234122340123456789abcdefCA0123456789abcdef0123456789abcdefCA0123456789abcdefABC\left| +\begin{array}{lcr} +AAAAAAA&BBBBBCC&CCCCCCC\\ +A&B&C\\ +\multicolumn{1}{c}{A}&\multicolumn{1}{c}{B}&\multicolumn{1}{c}{C}\\ +\multicolumn{1}{r}{A}&\multicolumn{1}{r}{B}&\multicolumn{r}{c}{C}\\ +\multicolumn{1}{l}{A}&\multicolumn{1}{l}{B}&\multicolumn{l}{c}{C}\\ +\begin{array}{cl}1&22\\3&4\end{array}&\begin{array}{cc}1&22\\3&4\end{array}&\begin{array}{cr}1&22\\3&4\end{array}\\ +\multicolumn{2}{c}{0123456789abcdef}&C\\ +A&\multicolumn{2}{c}{0123456789abcdef}\\ +\multicolumn{2}{r}{0123456789abcdef}&C\\ +A&\multicolumn{2}{l}{0123456789abcdef}\\ +A&B&C\\ +\end{array} +\right| +x ˙=Ax+g(x,u)y=Cxx𝐑 n +\left\lbrace \begin{array}{lcl} +\dot{x} & = & Ax+g(x,u)\\ +y & = & Cx \\ +\multicolumn{3}{l}{x\in \mathbf {R}^n} +\end{array} +\right. + +

a) x1 x1 +b) x2 x2 +c)

+x3 x3 +

d)

+x4 x4 +

e)

+x5 x5 +

text A

+

text B

+

text C

+

line one

+

this is the second line

+

1efoobar.

+

1efoobar. +FooBar

+x ˙=Ax+g(x,u)y=CxxR n +\begin{array}{lcl} +\dot{x} & = & Ax+g(x,u)\\[2mm] +y & = & Cx \\ +\multicolumn{3}{l}{x\in R^n} +\end{array} + +a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F + + + + + + + + + +aaa +bbb +ccc +ddd +eee +fff +
+arccos 2 (x),arcsin 2 (x),arctan 2 (x),arg 2 (x),cos 2 (x),cosh 2 (x),cot 2 (x) \arccos ^2 (x),\, \arcsin ^2(x) ,\, \arctan ^2(x) ,\, \arg ^2(x),\, +\cos ^2(x) ,\, \cosh ^2(x) ,\, \cot ^2(x) +coth 2 (x),csc 2 (x),deg 2 (x),dim 2 (x),exp 2 (x),hom 2 (x),ker 2 (x),lg 2 (x) \coth ^2(x) ,\, \csc ^2(x),\, \deg ^2(x),\, \dim ^2(x),\, \exp ^2(x),\, +\hom ^2(x),\, \ker ^2(x) ,\, \lg ^2(x) +ln 2 (x),log 2 (x),Pr 2 (x),sec 2 (x),sin 2 (x),sinh 2 (x),tan 2 (x),tanh 2 (x) \ln ^2(x),\, \log ^2(x),\, \Pr ^2(x),\, \sec ^2(x),\, \sin ^2(x) ,\, +\sinh ^2(x),\, \tan ^2(x),\, \tanh ^2(x) +det x=1 ,gcd x=1 ,inf x=1 ,inj lim x=1 ,lim x=1 ,lim inf x=1 ,lim sup x=1 ,max x=1 ,min x=1 ,proj lim x=1 ,sup x=1 \det _{x=1},\, \gcd _{x=1},\, \inf _{x=1},\, \injlim _{x=1},\, +\lim _{x=1},\, \liminf _{x=1},\,\limsup _{x=1},\, +\max _{x=1},\, \min _{x=1},\, \projlim _{x=1},\, \sup _{x=1} + +

jX *X *abcabc nabc nabc xyzabc xyz\stackrel{j}{\longrightarrow } \overset{*}{X} \underset{*}{X} +\sqrt{abc} \@root n \of {abc} \@root n \of {abc} +\frac{abc}{xyz} \dfrac{abc}{xyz} +

+n+m 2 nn+m 2 nn+m 2 n n+m 2 nn+m 2 nn+m 2 n \binom{\frac{n+m}{2}}{n} \quad \tbinom{\frac{n+m}{2}}{n} \quad \dbinom{\frac{n+m}{2}}{n}\qquad {}^{\binom{\frac{n+m}{2}}{n} \quad \tbinom{\frac{n+m}{2}}{n} \quad \dbinom{\frac{n+m}{2}}{n}} +

\Leftrightarrow

+

1st xième ysome text.

+1 2aaa bbbn m\genfrac{}{}{}{}{1}{2} +\genfrac[]{2.0pt}2{aaa}{bbb} +\genfrac(){0.0pt}0{n}{m} + +

a ba ba ba b\genfrac{}{}{}0{a}{b} +\genfrac{}{}{}1{a}{b} +\genfrac{}{}{}2{a}{b} +\genfrac{}{}{}3{a}{b}

+

a ba ba b{a\over b}\quad {a\above 1pt b}\quad {a\atop b} +a ba ba b{a\overwithdelims () b}\quad {a\abovewithdelims ()1pt b}\quad {a\atopwithdelims () b} +foo bar\genfrac(){2.0pt}{}{foo}{bar}

+n+m 2 nn+m 2 nn+m 2 n\frac{\frac{n+m}{2}}{n} \quad \tfrac{\frac{n+m}{2}}{n} \quad \dfrac{\frac{n+m}{2}}{n} +sup x=2 y1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f) +\sup _{x=2}y~ +\frac{1}{k}\log _2 c(f)\; +\tfrac{1}{k}\log _2 c(f)\; +\sqrt{\frac{1}{k}\log _2 c(f)}\; +\sqrt{\dfrac{1}{k}\log _2 c(f)} + +

aaaaaaaaaaaaaaaaaa 111111111\genfrac(){2.84526pt}3{aaaaaaaaaaaaaaaaaa}{111111111} +aaaaaaaaaaaaaaaaaa 111111111\genfrac(){0.0pt}3{aaaaaaaaaaaaaaaaaa}{111111111} +abc def\genfrac{}{}{}0{abc}{def} +abc def\genfrac{}{}{}1{abc}{def} +abc def\genfrac{}{}{}2{abc}{def} +abc def\genfrac{}{}{}3{abc}{def}

+

a ˜,z ˜,a+b ˜\tilde{a},\tilde{z}, \tilde{a+b}

+

𝙿 P\overline{\tt P} P

+

á ááá á á á +a ^a ´a a ˙a ˘a ˇa `a a ¨a ˜\hat{a} \acute{a} \bar{a} \dot{a} \breve{a} +\check{a} \grave{a} \vec{a} \ddot{a} \tilde{a} +

+d=z 2 =(I t +Ivvvv +Idiv(vvvvv )) 2 ,d=z^2=( I_t + \nabla I\vec{vvvv} +I div(\vec{vvvvv}) )^2, +

ab=1ca\hbox{b=1} c +ab1ca\hbox{b~1}~c

+

x y ϵ ϵ x^{y^\epsilon _\varepsilon }

+B (r )=μ 0 4π3m (r ' )·(r -r ' ) |r -r ' | 5 (r -r ' )-m (r ' ) |r -r ' | 3 . +\vec{B}(\vec{r}) = \frac{\mu _0}{4\pi }\left\lbrace +\frac{3\vec{m}({\vec{r}}^{\prime })\cdot (\vec{r}-{\vec{r}}^{\prime })}{|\vec{r}-{\vec{r}}^{\prime }|^5} +(\vec{r}-{\vec{r}}^{\prime }) - \frac{\vec{m}({\vec{r}}^{\prime })}{|\vec{r}-{\vec{r}}^{\prime }|^3} +\right\rbrace . + +

x 2 1 y 4 3 x 2 1 y 4 3 x 2 1 y 4 3 []abcdef + +\left\Vert \left|\left[\left(\left\lbrace \frac{x^1_2}{y^3_4}\right\rbrace \right)\right]\right|\right\Vert \left|\left|\left<\left\langle \frac{x^1_2}{y^3_4}\right\rangle \right>\right|\right|\left\lbrace \left\lceil \left\lfloor \frac{x^1_2}{y^3_4}\right\rfloor \right\rceil \right\rbrace []a\hspace{0.55542pt}b\hspace{1.111pt}c \hspace{2.22214pt}d \hspace{4.44443pt}e \hspace{8.88885pt}f +

+

x 2 1 y 4 3 +\left\moustache \left\uparrow \left\Uparrow \left\updownarrow \left\lgroup \frac{x^1_2}{y^3_4}\right\rgroup \right\Updownarrow \right\Downarrow \right\downarrow \right\moustache +x 2 1 y 4 3 +\left \lmoustache \left \uparrow \left \Uparrow \left \updownarrow \left \lgroup \frac{x^1_2}{y^3_4}\right \rgroup \right \Updownarrow \right \Downarrow \right \downarrow \right \rmoustache + 0 x 2 1 y 4 3 +\left\moustache \left\uparrow \left\Uparrow \left\updownarrow \left\lgroup \int _0^{\frac{x^1_2}{y^3_4}}\right\rgroup \right\Updownarrow \right\Downarrow \right\downarrow \right\moustache

+

\Longrightarrow + +𝒳 𝓎 \cal X_yand 𝒳 𝓎 𝒵\cal X_yZ +sin(x)+cos 2 (x)\sin (x) + \cos ^2(x) and xyz t \overbrace{xyz} ^t

+

1 a 2 \bigl [\frac{1}{a^2}\bigr [ +1 b 2 \left[\frac{1}{b^2}\right[ +[1 x 2 [[\frac{1}{x^2}[

+

f)a+b(=c+d\int f\mathopen )a+b\mathclose (=c+d +f(a+b)=c+d\int f(a+b)=c+d

+

aba\limits \displaylimits \nolimits b

+

wwwwwwwwwwwwa...b...c   d      e f$g%h&ij k{l}mın♯o♮p♭q_

+

ab...cdef$g%h&ijk{l}mınopq_a\dots b\ldots c\quad d\qquad e f\$g\%h\&i\!j\,k\lbrace l\rbrace m\i n\sharp o\natural p\flat q\_

+

Math spacing

+

xxxxxxxxxx

+

xxxxxx\,x\:x\;x\!x

+

aaaa\,\,\,\,\,a\:\:\:\:\:a

+

aaaa\;\;\;a\;\;\;\;a

+

!?#_.@%/|!?\#\_.@\%\Vert /|

+argmin Ψ θΘ ΔΦ θ Ω s -Ω t x y z =x y z =x y z =x y z =x y z =x y z =x y z =x y z {2 3} +\mathop {\mathop {arg\,min}\nolimits _\Psi }\limits _{\theta \in \Theta } +\Delta \left( {\mathop \Phi \nolimits _\theta \left( {\Omega _s } +\right)-\Omega _t } \right) +\qquad x_{y_z} = {x_y}_z= +x^{y_z} = {x^y}_z= +x_{y^z} = {x_y}^z= +x^{y^z} = {x^y}^z +\left\lbrace \lbrace \frac{2}{3}\rbrace \right\rbrace + +

x=0123456789x=0123456789 +4 3\@root 3 \of {4} 4 3\@root 3 \of {4}

+0=1 +0=\hspace{11.38092pt}1 + +

ÂâĈĉ  â Ấ ấ Ầ ầ Ẩ ẩ Ẫ ẫ +Ậ ậ Ĉ ĉ +ÊêếĜĝĤĥÎîĴĵ Ê ê Ế ế Ề ề Ể +ể Ễ ễ Ệ ệ Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ +ÔôŜŝÛûŴŵŶŷÁáǺǻǼǽĆćÉéếǴǵÍí +Ô ô Ố ố Ồ ồ Ổ ổ Ỗ ỗ +Ộ ộ Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ Ẑ ẑ +Á á Ǻ ǻ Ǽ ǽ Ấ ấ Ắ ắ +Ć ć Ḉ ḉ É é Ḗ +ḗ Ế ế Ǵ ǵ Í í +ĹĺḿŃńÓóǾǿḮ ḯ Ḱ ḱ Ĺ ĺ Ḿ +ḿ Ń ń Ó ó Ǿ ǿ Ṍ ṍ Ṓ ṓ Ố +ố Ớ ớ +ŔশÚúǗǘÝýŹźÀàÈèÌìǸǹ Ṕ ṕ Ŕ ŕ Ś ś +Ṥ ṥ Ú ú Ǘ ǘ Ṹ ṹ Ứ ứ +Ẃ ẃ Ý ý Ź ź +À à Ầ ầ Ằ ằ È è Ḕ ḕ Ề +ề Ì ì Ǹ ǹ +ÒòÙùǛǜÄäǞǟËëÏïÖöȪȫÒ ò Ṑ ṑ Ồ ồ +Ờ ờ Ù ù Ǜ ǜ Ừ ừ Ẁ ẁ Ỳỳ +Ä ä Ǟ ǟ Ë ë Ḧ ḧ Ï ï Ḯ ḯ Ö ö +Ȫ ȫ Ṏ ṏ ẗ +ÜüǛǜǗǘǙǚŸÿÇçȨȩ Ü ü Ṻ ṻ Ǜ ǜ +Ǘ ǘ Ǚ ǚ Ẅ ẅ Ẍ ẍ Ÿ ÿ +Ç ç Ḉ ḉ Ḑ ḑ Ȩ ȩ Ḝ ḝ +ĢģĶķĻļŅņŖŗŞşŢţȀȁȄȅȈȉȌȍȐȑȔȕĂă +Ḩ ḩ Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ +Ȁ ȁ Ȅ ȅ Ȉ ȉ Ȍ ȍ Ȑ ȑ Ȕ ȕ +Ă ă Ằ ằ Ắ ắ Ẳ ẳ Ẵ ẵ +Ặ ặ +ĔĕĞğĬĭŎŏŬŭǍǎČčĎďĚěǦǧȞȟǨǩǏǐǰĽľŇň Ĕ ĕ Ḝ ḝ Ğ ğ Ĭ ĭ +Ŏ ŏ Ŭ ŭ +Ǎ ǎ Č č Ď ď Ě ě Ǧ ǧ Ȟ ȟ Ǩ ǩ +Ǐ ǐ ǰ Ľ ľ Ň ň +ǑǒŘřŠšŤťǓǔǙǚŽžŐőŰű Ǒ +ǒ Ř ř Š š Ť ť Ǔ ǔ Ǚ ǚ Ṧ +ṧ Ž ž +Ő ő Ű ű + +Ớ ớ Ờ ờ Ở ở Ỡ ỡ +Ợ ợ + Ứ ứ Ừ ừ Ử ử Ữ +ữ Ự ự +Ả ả Ẩ ẩ Ẳ ẳ Ẻ ẻ Ể ể Ỉ +ỉ +ĄąĘęĮįǪǫǬǭŲųÅåŮů Ỏ ỏ Ổ ổ Ở ở Ủ ủ +Ử ử Ỷ ỷ +Ą ą Ę ę Į į Ǫ ǫ Ǭ ǭ Ų ų +Å å Ů ů ẘ ẙ +Ạ ạ Ậ ậ Ặ ặ Ḅ ḅ Ḍ ḍ Ẹ ẹ +Ệ ệ Ḥ ḥ Ị ị Ḳ ḳ Ḷ ḷ Ḹ ḹ + +Ṃ ṃ Ṇ ṇ Ọ ọ Ộ ộ Ợ ợ +Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṩ ṩ Ṭ +ṿȂȃȆȇȊȋȎȏȒȓȖȗĀāǞǟǠǡǢǣĒēĦħ +ṭ Ụ ụ Ự ự Ṿ +ṿ Ẉ ẉ Ỵ ỵ Ẓ ẓ +Ḁ ḁ +Ḇ ḇ Ḏ ḏ ẖ Ḵ ḵ Ḻ ḻ +Ṉ ṉ Ṟ ṟ Ṯ ṯ Ẕ ẕ +Ȃ ȃ Ȇ ȇ Ȋ ȋ Ȏ ȏ Ȓ ȓ Ȗ ȗ +Ḛ ḛ Ḭ ḭ Ṵ ṵ +Ḓ ḓ Ḙ ḙ Ḽ ḽ Ṋ ṋ Ṱ ṱ Ṷ ṷ +Ā ā Ǟ ǟ Ǡ ǡ ǢǣĒ ē Ḗ ḗ +Ḕ ḕ Ḡ ḡ Ħ ħ +ĪīŌōǬǭȪȫȬȭȰȱ +Ī ī Ḹ ḹ Ō ō Ǭ ǭ Ȫ ȫ Ȭ +ȭ Ȱ ȱ Ṑ ṑ Ṓ ṓ +ŦŧŪūȲȳȦȧǠǡĊċĖėĠġİ Ṝ ṝ +Ŧ ŧ Ū ū Ṻ ṻ Ȳ ȳ +Ȧ ȧ Ǡ ǡ Ḃ ḃ Ċ ċ Ḋ ḋ Ė ė Ḟ ḟ Ġ ġ Ḣ +ḣ İ +ĿŀȮȯȰȱĿ ŀ Ṁ ṁ Ṅ ṅ Ȯ ȯ Ȱ ȱ Ṗ ṗ Ṙ ṙ +Żż +Ṡ +ṡ Ṩ ṩ Ṧ ṧ Ṥ ṥ Ṫ ṫ Ẇ ẇ Ẋ +ẋ Ẏ ẏ Ż ż +

+

BB

+

ab+2c=DE ab +2c= DE 𝐚𝐛+2𝐜=𝐃𝐄𝑎𝑏+2𝑐=𝐷𝐸𝒂𝒃+2𝒄=𝑫𝑬𝒶𝒷+2𝒸=𝒟ℰ𝓪𝓫+2𝓬=𝓓𝓔𝔞𝔟+2𝔠=𝔇𝔈𝕒𝕓+2𝕔=𝔻𝔼𝖆𝖇+2𝖈=𝕯𝕰𝖺𝖻+2𝖼=𝖣𝖤𝗮𝗯+2𝗰=𝗗𝗘𝘢𝘣+2𝘤=𝘋𝘌𝙖𝙗+2𝙘=𝘿𝙀𝚊𝚋+2𝚌=𝙳𝙴 \mml@font@normal ab+2c=DE\mml@font@upright ab+2c=DE\mml@font@bold ab+2c=DE\mml@font@italic ab+2c=DE\mml@font@bolditalic ab+2c=DE\mml@font@script ab+2c=DE\mml@font@boldscript ab+2c=DE\mml@font@fraktur ab+2c=DE\mml@font@doublestruck ab+2c=DE\mml@font@boldfraktur ab+2c=DE\mml@font@sansserif ab+2c=DE\mml@font@boldsansserif ab+2c=DE\mml@font@sansserifitalic ab+2c=DE\mml@font@sansserifbolditalic ab+2c=DE\mml@font@monospace ab+2c=DE

+

Xx𝒞𝒶𝓁 Rm 𝐁𝐟𝖲𝖿𝚃𝚝𝚡𝚢+1No𝐼𝑡𝔉𝔯Xx\mathcal {Cal}\mathrm {Rm}\mathbf {Bf}\mathsf {Sf}\mathtt {Tt}\mathtt {x}\mathtt {y+1}\mathnormal {No} \mathit {It}\mathfrak {Fr} +𝐗𝐱𝓒𝓪𝓵 Rm 𝐁𝐟𝗦𝗳𝚃𝚝𝚡𝚢+1𝐍𝐨𝑰𝒕𝕱𝖗Xx\mathcal {Cal}\mathrm {Rm}\mathbf {Bf}\mathsf {Sf}\mathtt {Tt}\mathtt {x}\mathtt {y+1}\mathnormal {No} \mathit {It}\mathfrak {Fr} + +𝐟𝐨𝐨 bar +1=3\frac{\mathit {\mathbf {foo}}}{\mathrm {bar}+1}=3 + +𝐚b=1𝐜a\text{b=1} c

+

oooooooooooooo +ab=1ca\myhbox{b=1} c +ab=1ca\text{b=1} c +ab=1ca\mbox{b=1} c +ab=1ca\hbox{b=1} c

+

ab=1ca\mbox{b=1} c

+

1 2 0 f(x)dx𝔚 2 xyz=xxyyzz\begin{pmatrix} +\binom{1}{2}&\int _0^\infty f(x)dx\\[2cm] +\mathfrak {W}_2&\text{xyz}=\sqrt{xxyyzz} +\end{pmatrix}

+

signal x (y)\bar{x }\in \mathcal {F} (y ) with smallest support.

+

()=()=()\mbox{(\ref {W102})}=(\ref {W102})=\mbox{(\ref {W102})}

+a=b=cby() +a & = & b \\ +& = & c +\mbox{by (\ref {eqn:main2})} +12341234 +

Non math version +Is upper case : BAR

+

Is lower case : bar

+

Is upper case : FOO

+

Is lower case : foo

+

Is upper case : BAR

+

Is upper case : BAR

+

Is lower case : bar

+

Is lower case : bar

+

Is upper case : BARBAR

+

Is lower case : barbar

+

Is upper case : FOOFOO

+

Is lower case : foofoo

+

Is upper case : BARBAR

+

Is upper case : BARBAR

+

Is lower case : barbar

+

Is lower case : barbar

+

2h(n)for0nN/2-10otherwise{}\left\lbrace \begin{array}{ll} 2 h(n) &\text{ for $0 \le n \le N/2-1$ }\\0 &\text{ otherwise }\\\end{array}\right.

+xx +\scriptstyle+m 2 \textstyle0\scriptscriptstyle+m 2 \scriptstyle0\scriptstyle+m 2 \textstyle0 \scriptscriptstyle+m 2 \scriptscriptstyle0\scriptscriptstyle+m 2 \scriptstyle0\scriptstyle+m 2 \textstyle0 \rm \binom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \tbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \dbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}}\qquad {}^{\binom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \tbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}} \quad \dbinom{\frac{\mathchoice{\displaystyle+}{\textstyle+}{\scriptstyle+}{\scriptscriptstyle+}m}{2}}{\mathchoice{\displaystyle0}{\textstyle0}{\scriptstyle0}{\scriptscriptstyle0}}} +

Additional tests +,12>10$\hspace{20.0pt}, \hspace*{56.9055pt} 12>10\,\$ +𝑥 2 1 y 33 22 \left[\mathit {x}^1_2 y^{22}_{33}\right\lbrace +x 1 2c\overline{x}\frac{1}{2} \mathmi[A='B']{c} +u vu v\genfrac{}{}{2.0pt}3{u}{v} \genfrac[]{}{}{u}{v} +104 37 6\sqrt{10} \@root 3 \of {4} \@root 6 \of {7} +If xx\in \emptyset then n>0,1 n 2 <0\forall n>0, \dfrac{1}{n^2}<0

+

Kumar test +x Hi x_{\mbox{{\scriptsize {H\,{\sc i}}}}} +x Hi x_{\mbox{{\scriptsize {H\,\quad \qquad \!\,\:\;{\sc i}}}}} +Testing references +ab=1ca\mbox{b=1} c + + +Π=Ψ\varPi =\varPsi

+123345678 123&34\\56&78 +123345678 123&34\\56&78 +123345678 123&34\\56&78 +123345678 123&34\\56&78 +2334567823&34\\56&78 +2334567823&34\\56&78 +2334567823&34\\56&78 +2334567823&34\\56&78 +2334567823&34\\56&78 +2334567823&34\\56&78 +

+ok

+

AT_DOC_END

+
diff --git a/thirdparty/tralics-2.15.2/Modele/torture.xml b/thirdparty/tralics-2.15.2/Modele/torture.xml new file mode 100644 index 0000000..6741a9e --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/torture.xml @@ -0,0 +1,1443 @@ + + + + +

The time is 08h 47min, 22nd January 2015.

+

DOCSTART

+First +

31.5pt0.0pt0.0mu1717.0pt17.0pt plus 1.0pt minus 2.0pt17.0mu plus 1.0mu minus 2.0mu119811511.0pt +45 +25cmr10 +foo= foo

+Macroexpansion +

Version2.15.2. +foo=foo. +foo=foo. +foo=bold-foo non-bold foo. +bold-foo=nonbold-foo +barbar=barbar +bold-barbar=bold-barbar +bold-barbar=nonbold-barbar +babar=babar +barbar=barbar

+

firstofone + +Testing addtohook.

+

__12345__12345__12345__12345abc +emptyempty + + + +abc=abc ++a++b++c+

+

=Textetexte=

+

aaaa bbbbaaaa bbbb ab

+

=_#&a~&#& _=

+

27e +27 jie `me

+
+hathat +

1;«2«3«4okOK +« x 2 M1 è =A

+

œ=Œ=Ÿ= +Żx? +Compare:œŒŸŻ

+

Test for German thing +OK: äöüëïÄÖÜÏËßßSSSZckCKffFFllLLmmMMnnNNppPPrrRRttTT +Ok: --=„”«»

+
+accents + +latin extended-A +

ligne 010x: ĀāĂ㥹 ĆćĈî ĊċČčĎď

+

ligne 011x: ??ĒēĔĕĖėĘęĚěĜĝĞğ

+

ligne 013x: İıIJijĴĵĶķ?ĹĺĻļĽľ?

+

ligne 014x: ?ŁłŃńŅņŇň?ŊŋŌōŎŏ

+

ligne 015x: ŐőŒœŔŕŖŗŘřŚśŜŝŞş

+

ligne 016x: ŠšŢţŤť??ŨũŪūŬŭŮů

+

ligne 017x: ŰűŲųŴŵŶŷŸŹźŻżŽž?

+

testpar

+

a paragraph

+
+

A

+

B

+ +
+
Caption of the figure +
+

+
+
+
+

+a table with a caption +
+
+
+
+
+Glossary

y1

+

y2

+
+ + + + + + + + + + + +3 + + +

abstract +a body

+

additional information

+
+

ok

+x 2 +y 2 =11=X 2 +Y 2 x=0.010.001=X +sin=coscossin1+2 +

ABCABCABC

+

XX

+ccaaAbbBaaβAaaBαCD +

AB

+ABCD +

023400

+

ASSTEST + +.

+

a+b a+b

+

{\let\rm\bf \bf toto}

+

<!--this is a comment -->

+

&dollar; not &equals; EURO &excl;

+

{\let\rm\bf \bf toto} + +$ not = EURO !

+

a ^b ´c d ˙e ˘f ˇg `h k ¨l ˜abc

+

x ´x x ˘x ˇx x x ¨x ˙x `x ^x ˚x ˜x xyz ^xyz ˜

+

α=β and γ=δ and ϕ=ψ; +and 0

+0=0 +0=0 +0=0 +0=0 +0=0 +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +(a+b) 4 =(a+b) 2 (a+b) 2 =(a 2 +2ab+b 2 )(a 2 +2ab+b 2 )=a 4 +4a 3 b+6a 2 b 2 +4ab 3 +b 4 +x 2 +y 2 =1x=1-y 2 +xy 1 ++y n z +x=17yy>a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p +EQ1 +

etc

+EQ2 +

etc

+EQ3 +

etc

+

1 +2 +3 +4

+

Ḉ ḉ Ḗ ḗ Ḯ ḯ +ok

+

+uv+1modn 2 uv+1modn 2 u=v+1(modn 2 )u=v+1(n 2 ) +1 21 21 2 1 21 21 2 +bc+m 2 bcd+m 2 cbc+m 2 b + +

3 +1956-2008, Research Director + +1956-2008, Research Director +.

+

1Ǵǵ +Ǎǎ +ǵǴ

+

o ˙ +a - b – c — d

+

ABCABCŒŒØØÆÆÐÐĐĐŁŁŊŊSSSSÞÞ

+

abcabcœœøøææððđđłłŋŋßßþþ

+

Check:fooøø=fooøø +Check:FOOØØ=FOOØØ

+

13

+c+m 2 bd+m 2 cc+m 2 b d+m 2 dd+m 2 cc+m 2 b +

ab cd ab cd

+1 2aaa bbbn m +a=b b=1 cd d =2 cd d +

b=c c=1 cd d =2 cd d

+

1 2x1 2x1 2x1 2x1 2xa+xa+xa+xaxa xb+xa xb

+a b c +

x ' x '' x ''' x '''' u 2 ' v 4 '3

+t +

c + + +Testing raw XML. +texte1 + +texte2 + +

+

min x f(x)>dmin x f(x).

+

min x f(x)>dmin x f(x).

+

+

code starts here

+

ok

+

ok

+

ok + +ok +

+

é=é è=è

+ABy Cxbox contains foo

Optional argument trick. + +no-opt and opt-bar-arg[optional]

+

ncaand ncband nccarg1arg2 and +ncdarg1arg2 and ncdxarg2

+

Another idea (heiko) + no-opt and opt-bar-arg[optional]

+

xx +xyzxyz

+

31=31, +0=0 +11101=11101

+
+Test verbatim +

Essai de verbatim 1) ␣x␣y 2) ␣x␣y

+

5 test : !@#$%^&*()_$

+

6 test : {\foo\} et zxcvbnm,./

+

7 test ZXVBNM<>? ~

+

8 test \verb+\verb-xx-+

+

9 test ligatures: <<>>``''-- et --- !

+

10 ! \end{verbatim} Not this one

+

11 \end{notverbatim}

+

Fin du verbatim. \toto et \verb+ { } $$. +\begin{verbatim} doit passer Autre verbatim (sans numéro)

+

test : !@#$%^&*()_$

+

test : {\foo\} et zxcvbnm,./

+

test ZXVBNM<>? ~

+

test \verb+\verb-xx-+

+

test ligatures: <<>>``''-- et --- !

+

test BL : \\738! et \\838!.

+

Verbatim_line

+

Verbatim_line

+

Verbatim env with line numbers

+

1 TEST

+

and without

+

[ok]TEST

+

TEST

+

5 5,one line

+

6 6,one line

+

9 9,one line

+

10 10,one line

+

Test of \DefineShortVerb and \UndefineShortVerb. + +test 1 toto x +x- |t| + +test 2 toto +x+ +x- +t+ +espace: + + + +Verbatimfoo: + foo +*foo*foo* +Verbatimfoo: + foo +*foo*foo*.

+

} +Test },|, $_.

+

+␣+

+

Some␣Verbatim␣text.

+

+ +,  , .

+

More Verbatim text.

+

Some Verbatim text.

+Thesignfunction:𝒮(x)=-1x<00x=01x>0 +

Verbatim test

+

\verb+ { } $$. +\verb+␣{␣}␣$$. ++x+!

+
+ifthenelse +

ok1 +ok2 +ok3 +ok4 +ok5 +ok6 +ok7 +ok8 + + +ok9 +ok10 +ok11 +ok12 +ok13 +ok14 +ok15 +ok16 +ok17 +ok18 +ok19 +ok20 +ok21

+

dd et rr.

+

You agree “OK” or don't “not OK”. +D'accord “OK” ou pas “not OK”.

+
+CALC +

1=1 +-5=-5

+

28.4526pt=28.4526pt + 0.99985pt=0.99985pt + 0.99998pt=0.99998pt + 1.00018pt=1.00018pt + 0.99985pt=0.99985pt + 0.99985pt=0.99985pt + 1.00018pt=1.00018pt + 1.00018pt=1.00018pt

+

6 +10.0pt=10pt + 321=321

+

a +x

+

2

+ok

, and ok, and ok, and ! +okok3

+ok

and ; okok. +XY. +XxY. +XxY. +XxY. +XxY. +XxY. +XxY.

+

Test.236.47191pt plus 0.03815pt=236.47191pt plus 0.03815pt.

+x

axb +axb

+

test hbox AabB. +some box content.

+

UPPERCASE

+

33.4

+

+
+
+

+

{} +{} +YX

+

0¶¶¶¶

+ +Biblio +

This is some text +, text, +foo +p32, p32, +text, , +, p3,

+key1key2

MINIPAGE +Hàn Thế Thành designed pdf. ł and ł.

+

In Tralics version 2, you can say Thế

+𝙰𝚊𝒜𝐀𝐚 Aa 𝐴𝑎𝔸𝖠𝖺Aa𝙱𝚋𝐁𝐛 Bb 𝐵𝑏𝔹𝖡𝖻Bb𝙲𝚌𝒞𝐂𝐜 Cc 𝐶𝑐𝖢𝖼Cc𝙳𝚍𝒟𝐃𝐝 Dd 𝐷𝑑𝔻𝖣𝖽Dd𝙴𝚎𝐄𝐞 Ee 𝐸𝑒𝔼𝖤𝖾Ee𝙵𝚏𝐅𝐟 Ff 𝐹𝑓𝔽𝖥𝖿Ff𝙶𝚐𝒢𝐆𝐠 Gg 𝐺𝑔𝔾𝖦𝗀Gg𝙷𝚑𝐇𝐡 Hh 𝐻ℎ𝖧𝗁Hh𝙸𝚒𝐈𝐢 Ii 𝐼𝑖𝕀𝖨𝗂Ii𝙹𝚓𝒥𝐉𝐣 Jj 𝐽𝑗𝕁𝖩𝗃Jj𝙺𝚔𝒦𝐊𝐤 Kk 𝐾𝑘𝕂𝖪𝗄Kk𝙻𝚕𝐋𝐥 Ll 𝐿𝑙𝕃𝖫𝗅Ll𝙼𝚖𝐌𝐦 Mm 𝑀𝑚𝕄𝖬𝗆Mm𝙽𝚗𝒩𝐍𝐧 Nn 𝑁𝑛𝖭𝗇Nn𝙾𝚘𝒪𝐎𝐨 Oo 𝑂𝑜𝕆𝖮𝗈Oo𝙿𝚙𝒫𝐏𝐩 Pp 𝑃𝑝𝖯𝗉Pp𝚀𝚚𝒬𝐐𝐪 Qq 𝑄𝑞𝖰𝗊Qq𝚁𝚛𝐑𝐫 Rr 𝑅𝑟𝖱𝗋Rr𝚂𝚜𝒮𝐒𝐬 Ss 𝑆𝑠𝕊𝖲𝗌Ss𝚃𝚝𝒯𝐓𝐭 Tt 𝑇𝑡𝕋𝖳𝗍Tt𝚄𝚞𝒰𝐔𝐮 Uu 𝑈𝑢𝕌𝖴𝗎Uu𝚅𝚟𝒱𝐕𝐯 Vv 𝑉𝑣𝕍𝖵𝗏Vv𝚆𝚠𝒲𝐖𝐰 Ww 𝑊𝑤𝕎𝖶𝗐Ww𝚇𝚡𝒳𝐗𝐱 Xx 𝑋𝑥𝕏𝖷𝗑Xx𝚈𝚢𝒴𝐘𝐲 Yy 𝑌𝑦𝕐𝖸𝗒Yy𝚉𝚣𝒵𝐙𝐳 Zz 𝑍𝑧𝖹𝗓Zz +

𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵

+

xx

+

abc

+

xx

+

abc

+

abc

+

abc

+

abc

+

some text +some text

+

With opt AABBWithout opt CC + + +Without opt BBWithout opt CC

+

xfoo

+
+Letter c +

testchar< + é Ĭ ~ -- '' `` << >> +;:!?«»&~--``xx''<<>>;:!?«»& + –“«  » ; : ! ?«  »”& + +< + é Ĭ ~ -- '' `` << >> +;:!?«»&~--``<<>>;:!?«»&'' + –“<<>>;:!?«»”& + +𝐚a𝒸d

+

a b c +a b c

+

the letter the letter %the character =

+

abc ˜abc ^abc abc abc abc _abc abc abc abc

+

x

+AAAAAAABBBBBCCCCCCCCCABCABCABCABC1223412234122340123456789abcdefCA0123456789abcdef0123456789abcdefCA0123456789abcdefABC +x ˙=Ax+g(x,u)y=Cxx𝐑 n +

1.123456789abc123456789abc

+

2.123456789abc

+

3.123456789abc123456789abc

+

4.123456789abc

+

5.123456789abc123456789abc

+

6.123456789abc

+

FILL

+

ABCparshape

+

11 +a '2 a '2

+

2

+

a) x1 +b) x2 +c)

+x3 +

d)

+x4 +

e)

+x5 +

text A

+

text B

+

text C

+

line one

+

this is the second line

+

text A

+

text B

+

text C

+

text D

+

short line

+

a longer line

+

a still longer line

+

a very long line of text

+

Some text Some text Some text +Some text Some text Some text Some text

+

1st xième ysome text +1efoobar.

+

+

1st xième ysome text +1efoobar. +FooBar

+

rmmdup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfmdup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttmdup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmbfup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfbfup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttbfup +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmmdit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfmdit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttmdit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmbfit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfbfit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttbfit +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmmdsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfmdsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttmdsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmbfsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfbfsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttbfsc +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmmdsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfmdsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttmdsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+rmbfsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+sfbfsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+ttbfsl +Textrm Textsf Texttt +Testbf Textit Textsc Textsl +Textnormal Textmd Emph Textup

+

+

1234567890

+

1234567890

+

AaBb Cc Dd Ee Ff +Gg Hh Ii Jj Kk

+

+x ˙=Ax+g(x,u)y=CxxR n +a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F + + + + + + + + + +aaa +bbb +ccc +ddd +eee +fff +
+
+A + +B + +C c +Ddd +E +F +G +

Text

+

more text + +

+
+A +

+

+
+B +x +
+ +

a

+
+

b

+
+ +xxxxx +

123

+
+xxxxx +

456

+
+

ENDOFSUBSECTION

+ +

Test tilde: ~ab. +a~b~n_d +a~b~n_d +text a +a~b~n_d +URL in footnote.... +a~b~n_d +a~b~n_d +text a +a~b~n_d

+arccos 2 (x),arcsin 2 (x),arctan 2 (x),arg 2 (x),cos 2 (x),cosh 2 (x),cot 2 (x) +coth 2 (x),csc 2 (x),deg 2 (x),dim 2 (x),exp 2 (x),hom 2 (x),ker 2 (x),lg 2 (x) +

jX *X *abcabc nabc nabc xyzabc xyz

+n+m 2 nn+m 2 nn+m 2 n n+m 2 nn+m 2 nn+m 2 n +

+

+

1st xième ysome text.

+1 2aaa bbbn m +IngoZschoch01-01-2004

a ba ba ba b

+

a ba ba b +a ba ba b +foo bar

+n+m 2 nn+m 2 nn+m 2 n +ln 2 (x),log 2 (x),Pr 2 (x),sec 2 (x),sin 2 (x),sinh 2 (x),tan 2 (x),tanh 2 (x) +det x=1 ,gcd x=1 ,inf x=1 ,inj lim x=1 ,lim x=1 ,lim inf x=1 ,lim sup x=1 ,max x=1 ,min x=1 ,proj lim x=1 ,sup x=1 +sup x=2 y1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f)1 klog 2 c(f) +

aaaaaaaaaaaaaaaaaa 111111111 +aaaaaaaaaaaaaaaaaa 111111111 +abc def +abc def +abc def +abc def

+

1a, 2, 3b, +4a~b~n_d, +5a~b~n_d,

+

1a, 2, 3b, +4a~b~n_d, +5a~b~n_d.

+

a ˜,z ˜,a+b ˜

+

αβγδϵϵζηθικλμνξπρστυϕχψωϖϱςφϰϑ +ΓΔΘΛΞΣϒΦΠΨΩ

+

+

±×÷*·⨿

+

+

+ + + + + +

+

ok

+

oka +okb

+

okb

+

0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1

+

ok

+

ok +ok +ok +ok +ok

+

*****

+

y

+

0.0pt00.0pt

+

=1=2===3=4

+

=1=2==25=3=4

+

𝙿 P

+

The first thirty prime numbers are 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, and 113. trial division macro was +expanded 132 times.

+a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F +ab +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +
+

á ááá á á á +a ^a ´a a ˙a ˘a ˇa `a a ¨a ˜

+d=z 2 =(I t +Ivvvv +Idiv(vvvvv )) 2 , +

ab=1c +ab1c

+

℃₩₦₤ƒ₫‰‱※†

+

‡‶″‵′⁅⁆Ω℧№

+

℗℞℠℮•‽

+

+

IEME 1er 1re 1ers 1res 2e 2es no No

+ +          Propositional linear +logic + + +Rudimentary linear +logic + + +Negation +Multiplicatives +Additives +Exponentials +Negation +A + + + +Conjunction + +AB +A&B + +Disjunction + +AB +AB + +Implication + +AB + + +Constants + +1, +,0 + +Modalities + + + +!A, ?A +
+cm1 +2 +3 +4 +5 +car

http://www-sop.inria.fr/miaou/Jose&Grimm + + + + + + + +

+

+ + + + +1Ab2Ab3Ab4Ab5Ab6Ab7Ab

+ + + + + +

x y ϵ ϵ

+B (r )=μ 0 4π3m (r ' )·(r -r ' ) |r -r ' | 5 (r -r ' )-m (r ' ) |r -r ' | 3 . +

+

+

...'ıȷ¬

+

+

¬¬

+

x 2 1 y 4 3 x 2 1 y 4 3 x 2 1 y 4 3 []abcdef

+

1bcd

+

123

+ +aaabbbcccdddeeeW

1 i I a A * *

+

2 ii II b B

+

3 iii III c C

+

4 iv IV d D § §

+

5 v V e E ¶

+

6 vi VI f F

+

7 vii VII g G ** **

+

8 viii VIII h H

+

9 ix IX i I

+

10

+

x 2 1 y 4 3 +x 2 1 y 4 3 + 0 x 2 1 y 4 3

+

+

Redefining par +!

+

!

+

Redefining par

+

3

+ +

This is the first item

+
+

This is the second item

+
+

This is the last item

+ +

description of a.

+
+

description of b.

+
+

description of cde.

+
+

description of other letters

+ +

One

+
+

Two

+
+

Threee

+
+
+
+

A:aa, B:bb, C:

+D:a=y, E: a=bbydefinition.

+

A:aa B:bb C:cc C:cc +Dtext +Etext +Ftext

+

+ +𝒳 𝓎 and 𝒳 𝓎 𝒵 +sin(x)+cos 2 (x) and xyz t

+

1 a 2 +1 b 2 +[1 x 2 [

+

f)a+b(=c+d +f(a+b)=c+d

+

ab

+

wwwwwwwwwwwwa...b...c   d      e f$g%h&ij k{l}mın♯o♮p♭q_

+

ab...cdef$g%h&ijk{l}mınopq_

+

Math spacing

+

xxxxx

+

xxxxx

+

aaa

+

aaa

+

!?#_.@%/|

+List of Very Important Persons 1 + +author of + +No footnote here + +List of Very Important Persons 2 +Jeande la FontaineTalesFrenchphd +DonaldKnuthMathAmericanauthor of +LeslieLamportComputer ScienceAmerican +JoseGrimmSophiaInriaFrenchNo footnote here, funny text + +List of Very Important Persons 3 + +author of + + +List of Very Important Persons 4 +Jeande la FontaineDonaldKnuthauthor of LeslieLamport +Ok +Ok +Ok +Ok +Ok + +

B

+
+Glossary

y

+
+A + +B + +C +D +E +F +G + +first +second +

ab c 0 xxxxxxxxxxxxxxxxxxxxxxxxxxxx +foo +okopt +anote +

par1

+

pr2

+ +last +

+

A

+

B

+ +
+

+
+
+
+

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is normal

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is normal

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is normal

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is center

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is center

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is center

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is left

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is left

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is left

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is right

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is right

+

This is some text explaining and showing how text is centered, +flushed left or flushed right or indented or not indented. Mode is right

+a +b +c +s +e +
+

XX

+

0,

+

2294XX

+

2298XX

+

XX

+

X

+

2340XXbar

+

barX

+barY

2340AbcAbcAbc

+ +latex +xml +translator +

ligne2060

+a +b +c +s +e +
+

Gcd(144,272) = +gcd(144,128) = gcd(16,128) = gcd(16,112) = gcd(16,96) = gcd(16,80) = gcd(16,64) = gcd(16,48) = gcd(16,32) = gcd(16,16) = 16.

+

gcd(144,272) = gcd(144,128) = gcd(16,128) = gcd(16,112) = gcd(16,96) = gcd(16,80) = gcd(16,64) = gcd(16,48) = gcd(16,32) = gcd(16,16) = 16.

+

Gcd(144,272) = Gcd(128,144) = Gcd(16,128) = Gcd(16,112) = Gcd(16,96) = Gcd(16,80) = Gcd(16,64) = Gcd(16,48) = Gcd(16,32) = 16.

+

Xgcd(144,272) = Xgcd(144,128) = Xgcd(128,16) = Xgcd(16,112) = Xgcd(16,96) = Xgcd(16,80) = Xgcd(16,64) = Xgcd(16,48) = Xgcd(16,32) = 16.

+

* + + +§ +¶ + +** + +

+

EOLy

+

FooBar +FooBar

+

3 23

+

123456789abc 123456789abc +7686 7686 +7686 7686 +7e8e 7e8e

+ +a +

aa

+
+b +

bb

+righmarkrighmarkleftmarkleftmarkOKOK

ok

+a +b +c +A +B +C +
+a1 +a2 +a3x +a4 +b1 +b2x +b3 +b4 +c1 +c2x +c3 +c4 +d1 +d2x +d3 +d4 +Wa1 +Wa2 +Wa3x +Wa4 +Wb1 +Wb2x +Wb3 +Wb4 +Wc1 +Wc2x +Wc3 +Wc4 +Wd1 +Wd2x +Wd3 +Wd4 +

+B

+

okok

+

+
+x +

xx

+

yy

+
+abc +

abc

+

def

+ab +
+abc +

abc

+

def

+
+abc +

abc

+

def

+
+abc +

abc

+

def

+
+abc +abc +

abc

+

def

+

+
+x

+

a

+

a1

+

a2

+

a3

+

a4

+

b

+

b1

+

b2

+

b3

+

b4

+

c

+

c1

+

c2

+

c3

+

c4

+

d

+

d1

+

d2

+

d3

+

d4

+

fe

+

e1

+

e2

+

e3

+

e4

+

A

+

A1

+

A2

+

A3

+

A4

+

B

+

B1

+

B2

+

B3

+

B4

+

C

+

C1

+

C2

+

C3

+

C4

+

D

+

D1

+

D2

+

D3

+

D4

+

F

+

E

+

E1

+

E2

+

E3

+

E4

+

I

+

I1

+

I2

+

I3

+

I4

+

J

+

J1

+

J2

+

J3

+

J4

+aaaaaaaac +b +c +d +
+a +b +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +A +BCD +E +F +ab +c +d +e +f +aaa +bbb +ccc +ddd +eee +fff +
+1Ax +2By +b3Cza +1100x +210y +b31za +
+

test de table

+ +

+
+
+a :c +
+ +

+

+
+
+
+
+

+

Corollary 1 This is a sentence typeset in the theorem environment Cor.

+ +

Example 17.1 This is a sentence typeset in the theorem environment Exa.

+ +

Remark 1 This is a sentence typeset in the theorem environment Rem.

+ +

lemma 2 (Ben User) +This is a sentence typeset in the theorem environment Lem.

+ +

Definition 3 (Very Impressive definition) +This is a sentence typeset in the theorem environment Def.

+ +argmin Ψ θΘ ΔΦ θ Ω s -Ω t x y z =x y z =x y z =x y z =x y z =x y z =x y z =x y z {2 3} + +

text

+

+ +0.366,2.133, 1.25,3.19, 2.5,4.42, +5.0,6.10, 7.5,7.24, 10,8.09, 15,9.28, 20,9.90, 30,10.3, +40,10.22, 50,9.80, 60,8.98, 70,7.70, 80,5.91, 90,3.79, +95,2.58, 99.24,1.52 + +1.25,0, 99.24,0 +

+

The RAF 6E has a flat undersurface.

+

+ + + + + + +0.366,2.133, 1.25,3.19, 2.5,4.42, +5.0,6.10, 7.5,7.24, 10,8.09, 15,9.28, 20,9.90, 30,10.3, +40,10.22, 50,9.80, 60,8.98, 70,7.70, 80,5.91, 90,3.79, +95,2.58, 99.24,1.52 + +1.25,0, 99.24,0 +

+

The RAF 6E has maximum lift at angles of attack over 12 .

+ +80,0, 0,0, 40,100, 80,0, 0,0 +150,0, 190,100, 230,0 +300,0, 340,100, 380,0 + + + + + + + + +
Protocol +Proof +
max # of +“back” steps +
+Time +ms. +
+Otway-Rees +Yes +0 +0.35 + +

112233

+

=torture

+

4

+

00

+

Bx

+

m

+

1 2 +1 2 +2 1

+1 +

x=0123456789 +4 3 4 3̡񔌡 +XYZ

+ + + +BRACETEST1 leave leave a leave H + + + +Some title +http://www.inria.fr/rrrt/rt-0265.html50 +70 +21 +some note + + + +Mathematical Markup Language (MathML) Version 2.0 +http://www.w3.org/TR/MathML2/ +2001 +

markXY +XYZ T

+

‰‱′″

+

‴‵‶‷

+

+

OK

+

Blabla

+

Blabla

+

Test: AfooA and AbarA

+

Bline1B

+

Bline2B

+

123

+0=1 +

Unskip:a bcde

+

DMObarOK*barok

+

ok +Ifempty 122112112122122112112122 222. +Ifempty 122112112122122112112122 222.

+

This is a date +a b +a b

+

A

+BxyA +

D

+

Gobble:xxx

+

soul:ABCxyzwetc

+

HEY!

+ +

bla bla

+
+

ble ble

+
+

blu blu

+ +

e1

+
+

e1

+
+

e3

+
+ + +

i1

+
+

i2

+
+

i3

+
+

i5

+
+
+

e5

+
+
+

bli bli

+
+

-'`<><<>> + +-'`<>«  »

+

00

+Vest1Vest2 3West1West2 3

A

+

B

+

C

+

D E F +G +

+

Reference to figure: +Reference to first subfigure: +Reference to second subfigure:

+
main figure caption +

+
+ + +
+ +(a) first subfigure caption(b) second subfigure caption

+
main figure caption +first subfigure caption +second subfigure caption + +
+Infinite and finite discrete time signal processing. +abcdefghiabcdefghi
+bar
+

+

Example 17.2 +This is a sentence typeset

+

in the theorem environment Exa.

+ +

Example 17.3 +This is a sentence typeset

+

in the theorem environment Exa.

+
+ +Example +

x

+
+

Example 17.5 x

+ + +Example +

x

+
+

Example 17.7 x

+ +

Aξξ 1 Bξ 1 +𝐀ξξ 1 𝐁ξ 1 +α

+

ABCDEFGHIJ +aBc +

+

   

+ +

one

+
+

two

+
+

three

+ +

three.one

+
+

three.two

+
+

three.three

+ +

three.three.one

+
+

three.three.two

+
+

three.three.three

+ +

three.three.three.one

+
+

three.three.three.two

+
+

three.three.three.three

+
+
+
+
+a table with a caption +opt arg for caption +
+
+
+
+
+

border matrix CIC ' C(100)Ib-b0Ca ' 1-a

+

+a: UPPER MiXeD Mixed UPPER

+

b: UPPER BarMixed Yy, Zz UPPER

+

c: TEXT AND UPPER +d: UPPER

+

a: lower MiXeD Mixed lower

+

b: lower BarMixed Yy, Zz lower

+

c: TEXT AND LOWER +d: lower

+

AT_DOC_END

+ diff --git a/thirdparty/tralics-2.15.2/Modele/tpa.xml b/thirdparty/tralics-2.15.2/Modele/tpa.xml new file mode 100644 index 0000000..5ab68e3 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tpa.xml @@ -0,0 +1,45 @@ + + + + + +Titlepage customisation in Tralics +No title +José Grimm +Knuth +JG +DEK + +No authors +

+This is an abstract with

+

some paragraphs in it

+

ok ? +

+ +This is an abstract without paragraphs in it + +

Another abstract

+

with

+

in it

+Another abstract without par +no abstract1 +no abstract2 +no abstract3 +no abstract4 + + + + + + + + + +
somewhere
+nodefault +CMDA +CMDB +CMDC +
+
diff --git a/thirdparty/tralics-2.15.2/Modele/tpa2.xml b/thirdparty/tralics-2.15.2/Modele/tpa2.xml new file mode 100644 index 0000000..8e0b866 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tpa2.xml @@ -0,0 +1,252 @@ + + + + + +Chapter one +

OK

+
+ +First Part of document +

Some text here

+
+Second Part +Chapter two +Section one +Subsection one +Subsubsection one +First paragraph +First sub paragraph +

Normal text

+
+

We are now in the backmatter.

+a +b +c +d +e +f +A +BCD +E +F +ab +c +d +e +f + +
+

+

+

Caption of the figure

+ +

(a)  one(b)

(c)  two(d)

+ +a +b +

ok

+
+

a

B

+

C

+

D

+
+

a caption

+
+ one

+

b x +ab

+a +

+

A

+

+ +a +

B

+
+

C

+ +
+

D

+ +ok +
+

a

+

c

+
b

+

fob +foo +foo +foo +foo +foob +x +foofoofoofoo

+ + +some text here150,0, 190,100, 230,0 +300,0, 340,100, 380,0 +80,0, 0,0, 40,100, 80,0, 0,0 + + +

b

+
+

b

+
+ +

item value

+ +

okok

+
+ + +

First

+
+

Second

+ +

some item

+
+

another one

+
+
+
+
+ +Corollary +Important +

this is easy

+
+

abcde +fg +hij

+

abcdefghij

+

abcdef +xxx abcd +efhhi +Normal text

+

+ +1bk=,BK=,N=Citation,S=Citation. + + +

+

p 30

+key1

OKOK

+

+2bk=toto,BK=,N=bibitem,S=p. +tata

+

+3bk=,BK=toto,N=Bibitem,S=p. +tata +()

+

No everything tested here

+ + + +xxOk +The famous glossaryaa

bb

+
cc

dd

+

Text +barbarbar

+

Word + +

+ +first +second +(max,+) +

éfoo

+

xy

+ x +

x

+

a

+

b

+

A

+

B

+

C

+

D

+

E

+a +b +x +

+abx

+

ok +

+ +Corollary +

This is a sentence typeset in the theorem environment Cor.

+
+

+ +Example +

+This is a sentence typeset

+

in the theorem environment Exa.

+
+ +Remark +

This is a sentence typeset in the theorem environment Rem.

+
+ +lemma +Ben User +

This is a sentence typeset in the theorem environment Lem.

+
+ +Definition +Very Impressive definition +

This is a sentence typeset in the theorem environment Def.

+
+ + + + +

            + +cm1 +2 +3 +4 +5 +car

+

On the fly changes are possible, for instance +ab + +ab

+

You can change attributes also

+

B

+

B

+Section twoSection 1 +Subsection twoSubsetion 2 +

A

+x +

B

+x +
+

C

+x +

+A

+x +

B

+x +
+

C

+x +
+

text

+ +

              

+

text

+

Same test as in torture file + +

+
+
+a :c +

+foo +barb +bara + diff --git a/thirdparty/tralics-2.15.2/Modele/tpa2x.xml b/thirdparty/tralics-2.15.2/Modele/tpa2x.xml new file mode 100644 index 0000000..fd74583 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/tpa2x.xml @@ -0,0 +1,265 @@ + + + + + +Chapter one +

OK

+
+ +First Part of document +

Some text here

+
+Second Part +Chapter two +Section one +Subsection one +Subsubsection one +First paragraph +First sub paragraph +

Normal text

+
+

We are now in the backmatter.

+a +b +c +d +e +f +A +BCD +E +F +ab +c +d +e +f + +
+

+

+

 one

+

 two

+

Caption of the figure

+

+ +

a +b +
+

ok

+

+
+

a

B

+

C

+

D

+
+

a caption

+
+ one

+

b x +ab

+a +

+

A

+

+

a +
+

B

+

+
+

+

C

+

+ +

+

D

+
ok

+ +

a

+

c

+
b

+

fob +foo +foo +foo +foo +foob +x +foofoofoofoo

+ + +some text here150,0, 190,100, 230,0 +300,0, 340,100, 380,0 +80,0, 0,0, 40,100, 80,0, 0,0 + + +

b

+
+

b

+
+ +

item value

+ +

okok

+
+ + +

First

+
+

Second

+ +

some item

+
+

another one

+
+
+
+
+ +Corollary +Important +

this is easy

+
+

abcde +fg +hij

+

abcdefghij

+

abcdef +xxx abcd +efhhi +Normal text

+

+ +1bk=,BK=,N=Citation,S=Citation. + + +

+

p 30

+key1

OKOK

+

+2bk=toto,BK=,N=bibitem,S=p. +tata

+

+3bk=,BK=toto,N=Bibitem,S=p. +tata +()

+

No everything tested here

+ + + +xxOk +The famous glossaryaa

bb

+
cc

dd

+

Text +barbarbar

+

Word + +

+ +first +second +(max,+) +

éfoo

+

xy

+ x +

x

+

a

+

b

+

A

+

B

+

C

+

D

+

E

+a +b +x +

+abx

+

ok +

+ +Corollary +

This is a sentence typeset in the theorem environment Cor.

+
+

+ +Example +

+This is a sentence typeset

+

in the theorem environment Exa.

+
+ +Remark +

This is a sentence typeset in the theorem environment Rem.

+
+ +lemma +Ben User +

This is a sentence typeset in the theorem environment Lem.

+
+ +Definition +Very Impressive definition +

This is a sentence typeset in the theorem environment Def.

+
+ + + + +

            + +cm1 +2 +3 +4 +5 +car

+

On the fly changes are possible, for instance +ab + +ab

+

You can change attributes also

+

B

+

B

+Section twoSection 1 +Subsection twoSubsetion 2 +

A

+

x

+
+

B

+

x +

+
+

C

+x +

+A

+

x

+
+

B

+

x +

+
+

C

+x +
+

text

+
+

+ +

              

+ +

text

+ +

Same test as in torture file + +

+
+
+a :c +

+foo +barb +bara + diff --git a/thirdparty/tralics-2.15.2/Modele/txerr.xml b/thirdparty/tralics-2.15.2/Modele/txerr.xml new file mode 100644 index 0000000..d913dff --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/txerr.xml @@ -0,0 +1,9 @@ + + + + +

This file contains a number of error + +Undefined environment

+

Now we have We have also !

+
diff --git a/thirdparty/tralics-2.15.2/Modele/txtc.xml b/thirdparty/tralics-2.15.2/Modele/txtc.xml new file mode 100644 index 0000000..3f17f3a --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/txtc.xml @@ -0,0 +1,209 @@ + + + + +A sample file for TralicsJosé Grimm

This document shows some commands of Tralics. +We use it also to show that characters are converted into the right encoding +in a lot of situations, including commands, titles, indices etc. +The XML result is translated via XSLT into HTML +and available on the web +http://www-sop.inria.fr/apics/tralics/txtc.html. +Source document can be found at +http://www-sop.inria.fr/apics/tralics/doc-step.html.

+
Latex, XML, HTML, UTF8, Hàn +Who is Hàn +

If you call tralics with options -te1a ou -te8a, the terminal should show +^^e0Index here for the section title; +if you say -te1, there is a single byte, if you say +-te8, there are two bytes. If you say -e1a or -e8a, the XML file should +contain &#E0;, in the case -oe1 ou -oe8, the XML file contains the +characters shown on the terminal.

+

The following lines try to demonstrate that Tralics handles 16bit characters. +An error will be signaled because the argument is out of range; but the +character with hex value 312 should be valid; the command defined here +by csname has two characters in its name, it must be followed by an +exclamation point (a space is allowed between the command and the exclamation +point). + + + +123! 123! 312!

+

This is standard verbatim: a _bç, aâ£_bç, a _bç, +\verb+ { } $$, +x+. Think about this last example. +We index here a word. Location is just before period. +This is a verbatim environment

+

{\let\rm\bf \bf totoé}

+

<​!-​-​this is a comment -​-​>​

+

&Dollar; not &Equals; &Euro;

+

{\let\rm\bf \bf totoé} + +&Dollar; not &Equals; &Euro;

+

Note. A verbatim environment neutralises meaning of some commands. +The last line of the verbatim environment should start with an ampersand +character; since this is a special character in XML, it is represented as +&amp; or &#x26;. Lines can be numbered; spaces can be replaced +by non-breaking ones; lines can use special fonts; paragraphs can be +no-indented, etc.

+

On the other hand, a rawxml environment is left unchanged. Remember however +that end-of-line characters and spaces are removed from the end of the line; a +new line character is added at the end of the line. If you remove the comment +between the two environments, replacing it by an empty line, then the second +environment will be in vertical mode. Otherwise, the end of the verbatim +environment inserts a \noindent, and the environment that follows is in +horizontal mode. As a consequence, there will be a P element on the first +line of the raw xml; moreover, since the final space in a paragraph is +removed, you will find the end-P element at the end of the line.

+

The translation of the environment contains e-acute (its representation +depends on the output encoding), three ampersand characters, a less than sign, +a greater than sign. The second line is a valid XML comment, the third line is +well-formed XML (it contains three entities, so that the XML is valid only if +the DTD defines these entities); it is very easy to produce invalid and +ill-formed XML.

+

The xmllatex command is to be used with care. It can produce +Hàn Thế ThànhHàn is the author of +pdftex. The second argument is meant to be translated by , it is +ignored by Tralics. Instead of \xmllatex{foo}{bar}, define a command, +use it in the text, and overwrite it in a ult file (user configuratin file).

+

In the current version, you can say ế because the double-accent +mechanism is implemented, or ế, this is a character, as valid as the +other ones. This is possible and dangerous too .

+
+Index +

This demonstrates how accents work in the index +a +b +c +d +e +f +g +h +OK

+

These words are in the glossary +12 +34 +These are in the second index +12 +34

+

A verbatim test. We put some stuff in English and French before, in order +to show how it is translated differently. The end of the environment can +contain spaces (see example above), but nothing else. +test ligatures: <<>>“â€â€“ et — ! +test ligatures : «  »“â€â€“ et — !

+

1 test : !@#$%^&*()_$

+

2 test : {\foo\} et zxcvbnm,./

+

3 test ZXVBNM<​>​? ~

+

4 test \verb+\verb-​xx-​+

+

5 test ligatures: <​<​>​>​`​`​'​'​-​-​ et -​-​-​ !

+

6  \end+{verbatim} Not this one %% + added in version 2.11

+

7 \end{notverbatim}

+

Verbatim without line numbers.

+

test : !@#$%^&*()_$

+

test : {\foo\} et zxcvbnm,./

+

test ZXVBNM<​>​? ~

+

test \verb+\verb-​xx-​+

+

test ligatures: <​<​>​>​`​`​'​'​-​-​ et -​-​-​ !

+

test BL : \\738! et \\838!.

+

The BL test is funny ; why should it fail ? a long long time ago, before +it was called Tralics, our translator was written in Perl, and such a line +was illegal ; the math was converted by Omega, see . We cite also +(), and ().

+

We now test the verbatim extensions. We start with Verbatim +and demonstrate the counting possibilities

+

1 test line 1a

+

2 test line 1b

+

and without numbers

+

[numbers=true]test line 2a

+

[numbers=true]test line 2b

+

1 The environment has an optional argument; spaces but no newlines are allowed

+

2 between brace and bracket; what follows the argument on the line is ignored

+

We put here the first character of the line in italics

+

5 5 we use here counter number 3

+

6 6 for counting lines

+

Define our Verbatim hook now.

+

7 7 we use here counter number 03 (the same)

+

8 8 but the HTML output differs a lot.

+
+

9 9 we use here counter named vbcounter

+

10 10 initialised to the value of the previous counter

+
+

11 11 yet another verbatim line (ok with é^^e9?)

+

1 note that, if no counter is specified, it is FancyVerbLine

+
+

2 and that the first line is numbered one by default.

+

3 Of course, options given on the line have precedence over options

+

4 inherited from the definition.

+

In French, centré means centered.

+
+Short Verb, as in $_ +

Test of \DefineShortVerb and \UndefineShortVerb. Normally +the bar is used, but 16bit characters are possible. Example, with itrema : + +toto x +x-​ |t|, + +and without : +toto ïxï +x-​ ïtï +Spaces : like this + + or that +â£+ +Verbatimfoo : +â£fooâ£+*foo*foo*.

+

Test of useverb A}A, A}A,A|A, A$_A.

+

BWeâ£haveâ£changedâ£theâ£font,â£andâ£addedâ£aâ£prefixB

+

BSpacesâ£areâ£specialB

+

Testing accents

+

À È Ì Ò Ù Ǹ Ẁ Ỳ à è ì ò ù ǹ Ạỳ x̀

+

à É à Ó Ú à Ć Ĺ Ń Å” Åš Ź Ç´ Ḱ Ḿ á¹” Ẃ Ǽ Ǻ Ǿ ǽ Ç» Ç¿ á é í ó ú ý ć ĺ Å„ Å• Å› ź ǵ ḱ ḿ ṕ ẃ vÌ

+

Â Ê ÃŽ Ô Û Ĉ Äœ Ĥ Ä´ Åœ Å´ Ŷ Ạâ ê î ô û ĉ Ä Ä¥ ĵ Šŵ Å· ẑ

+

Ã Ñ Õ Ũ Ĩ Ṽ Ẽ Ỹ ĩ õ ã ñ õ ĩ õ ṽ ẽ ỹ w̃

+

Ä Ë à Ö Ü Ÿ Ḧ Ẅ Ẍ ä ë ï ö ü ÿ ḧ ẅ Ạẗ z̎

+

ŠŰ ő ű e̋

+

Å Ů å ů ẘ ẙ e̊

+

ÄŒ ÄŽ Äš Ľ Ň Ř Å  Ť Ž Ç Ç Ç“ Ǧ Ǩ Èž Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž ÇŽ Ç Ç” ǧ Ç© ÈŸ Ç° xÌŒ

+

Ă Ĕ Ğ Ĭ Ŏ Ŭ ă ĕ ğ ĭ Šŭ x̆

+

Ä€ Ä’ Ħ Ī ÅŒ Ŧ Ū Ȳ Ḡ Ç¢ Ç£ Ä Ä“ ħ Ä« Šŧ Å« ȳ ḡ

+

Ȧ Ḃ Ċ Ḋ Ė Ḟ Ġ Ḣ İ Ŀ Ṁ Ṅ Ȯ Ṗ Ṙ Ṡ Ṫ Ẇ Ẋ Ẏ Ż ȧ ḃ ċ ḋ ė ġ ḣ ŀ Ṡṅ ȯ ṗ ṙ ṡ ṫ u̇ v̇ ẇ ż Ạż q̇

+

Ç Ģ Ķ Ļ Ņ Ŗ Ş Ţ Ȩ ḠḨ ç ģ ķ ļ ņ ŗ ş ţ ȩ ḑ ḩ b̧

+

Ą Ę Į Ǫ Ų ą ę į ǫ ų b̨

+

Ḁ E̥ I̥ O̥ U̥ R̥ Ḡe̥ i̥ o̥ u̥ r̥ y̥

+

Ḇ Ḏ Ḵ Ḻ Ṉ Ṟ Ṯ Ẕ ḇ Ḡḵ ḻ ṉ ṟ ṯ ẕ ẖ e̠

+

Ḅ Ḍ Ḥ Ḳ Ḷ Ṃ Ṇ Ṛ Ṣ Ṭ Ṿ Ẉ Ẓ Ạ Ẹ Ị Ọ Ụ Ỵ ḅ Ḡḥ ḳ ḷ ṃ ṇ ṛ ṣ ṭ ṿ ẉ ẓ ạ ẹ ị Ỡụ ỵ c̣

+

È‚ Ȇ ÈŠ ÈŽ È– È’ ȃ ȇ È‹ È È— È“ xÌ‘

+

Ḛ Ḭ Ṵ ḛ ḭ ṵ o̰

+

Ḓ Ḙ Ḽ Ṋ Ṱ Ṷ ḓ ḙ ḽ ṋ ṱ ṷ a̭

+

Ḁ Ḡe̥

+

Ả Ẻ Ỉ Ỏ Ủ Ỷ ả ẻ ỉ Ỡủ ỷ x̉

+

Some people dont like special characters + + +bad accent ̀ on x bad accent ̆ on z

+

Changing font size +xx +xyzxyz

+

Switch to English, for colons in URLs

+ + + +Mathematical Markup Language (MathML) Version 2.0 +2001 +http://www.w3.org/TR/MathML2/ + + +Produire du MathML et autres ...ML à partir d'Ω : Ω se généralise +Cahiers Gutenberg +33-34 +173-182 +1999 + + + +XSLT, Programmer's Reference +2nd +Wrox Press Ltd +2001 +
verb +vérb +vèrb +I1 +I2 +I3 +G1 +G2 +
diff --git a/thirdparty/tralics-2.15.2/Modele/txtd.xml b/thirdparty/tralics-2.15.2/Modele/txtd.xml new file mode 100644 index 0000000..804ff4e --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/txtd.xml @@ -0,0 +1,19 @@ + + + + + +

OK +a +b +c +d +e +f +g +h +OK

+verb +vérb +vèrb +
diff --git a/thirdparty/tralics-2.15.2/Modele/xii.xml b/thirdparty/tralics-2.15.2/Modele/xii.xml new file mode 100644 index 0000000..19acc14 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Modele/xii.xml @@ -0,0 +1,440 @@ + + + + +

On +the +first +day +of +Christmas +my +true +love +gave +to +me

+

a +partridge +in +a +pear +tree.

+

On +the +second +day +of +Christmas +my +true +love +gave +to +me

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +third +day +of +Christmas +my +true +love +gave +to +me

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +fourth +day +of +Christmas +my +true +love +gave +to +me

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +fifth +day +of +Christmas +my +true +love +gave +to +me

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +sixth +day +of +Christmas +my +true +love +gave +to +me

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +seventh +day +of +Christmas +my +true +love +gave +to +me

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +eighth +day +of +Christmas +my +true +love +gave +to +me

+

eight +maids +a +milking

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +ninth +day +of +Christmas +my +true +love +gave +to +me

+

nine +ladies +dancing

+

eight +maids +a +milking

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +tenth +day +of +Christmas +my +true +love +gave +to +me

+

ten +lords +a +leaping

+

nine +ladies +dancing

+

eight +maids +a +milking

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +eleventh +day +of +Christmas +my +true +love +gave +to +me

+

eleven +pipers +piping

+

ten +lords +a +leaping

+

nine +ladies +dancing

+

eight +maids +a +milking

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

+

On +the +twelfth +day +of +Christmas +my +true +love +gave +to +me

+

twelve +drummers +drumming

+

eleven +pipers +piping

+

ten +lords +a +leaping

+

nine +ladies +dancing

+

eight +maids +a +milking

+

seven +swans +a +swimming

+

six +geese +a +laying

+

five +gold +rings

+

four +calling +birds

+

three french +hens

+

two +turtle +doves

+

and +a +partridge +in +a +pear +tree.

diff --git a/thirdparty/tralics-2.15.2/README b/thirdparty/tralics-2.15.2/README new file mode 100644 index 0000000..1023fa2 --- /dev/null +++ b/thirdparty/tralics-2.15.2/README @@ -0,0 +1,56 @@ +This is the README file for Tralics + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL + http://www.cecill.info +See the files COPYING and Copyright for additional details. +Plain text version of the license are in the files + Licence_CeCILL_V2-en.txt Licence_CeCILL_V2-fr.txt + + +The archive contains four directories and some files. + + +The src directory contains the following files + Copyright: copy of the copyright notice + README: explains how to create the Tralics binary + Makefile : this is the Makefile + *.C *.h : the sources. +You get a binary version of Tralics by saying `make' in this directory. + +The confdir directory contains the following files + config_empty tralics_rc .tralics_rc + -> configuration files + - files of the form foo.tcf, these are Tralics configuration files + - files of the form foo.clt, these are Tralics version of class files + - files of the form foo.plt, these are Tralics version of packages +These files are used by Tralics; when you install a new version, you should +copy them in the appropriate place. + + +The Test directory contains some test files +The Modele directory contains translation of the test files. +The Test directory contains `alltests', + this is a shell script that compiles the test files and compares + them against models. + +Since July 2008, directories raweb, xml, styles, icons are distributed +in an alternate file, named tralics-extra-2.12.7.tar.gz +(the version number may vary). + + + +In case of problem contact : tralics@sophia.inria.fr +or consult the Web page: http://www.inria.fr/apics/tralics + + +The remaining of the archive is formed of miscellaneous files, that can be +used to convert the XML produced by Tralics into HTML, Pdf, or whatever. + + + +July 2008. + + diff --git a/thirdparty/tralics-2.15.2/Test/README b/thirdparty/tralics-2.15.2/Test/README new file mode 100644 index 0000000..2294ca5 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Test/README @@ -0,0 +1,34 @@ +Copyright José Grimm, Inria, projet APICS. 2004 +Email: Jose.Grimm@sophia.inria.fr + +This software is a computer program whose purpose is to +translate LaTeX documents into XML format. + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +As a counterpart to the access to the source code and rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors have only limited +liability. + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. + +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + +------------------------------------------------------------------------------ + diff --git a/thirdparty/tralics-2.15.2/Test/alltests b/thirdparty/tralics-2.15.2/Test/alltests new file mode 100755 index 0000000..f41bba3 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Test/alltests @@ -0,0 +1,189 @@ +#!/bin/bash +# This file runs all Tralics tests +# Most file contain comment telling what happens +# The testb file requires bibtex. + +# We make sure that we call the right binary by saying ../src/tralics +# We also specify where to search for configuration files. + + +# This checks that no error is signaled. +run_tralics() { + local status + echo testing $1 + ../src/tralics -confdir=../confdir $* >> Trace + status=$? + if [[ $status != 0 ]] ; then + echo "Tralics failed for $1" + exit 1 + fi +} + +# in Tralics \read16 reads from the tty, and we use echo to provide a value +# the line is also printed on stderr, that we redirect to /dev/null +run_tralics_with_param() { + local status + echo testing $1 with $2 + echo $2 | ../src/tralics -confdir=../confdir $1 >> Trace 2>/dev/null + status=$? + if [[ $status != 0 ]] ; then + echo "Tralics failed for $1" + exit 1 + fi +} + +# Checking errors: we check for a string in the transcript file +# The XML file should contain an item for each error +run_tralics_with_err() { + local status + echo testing $1 + ../src/tralics -confdir=../confdir $1 $3 >> Trace + grep -q "$2" $1.log + status=$? + if [[ $status != 0 ]] ; then + echo "Tralics failed for $1" + exit 1 + fi +} + +# +compare_file () { + local nb hl + nb=4 + hl=2 + if [ $# = 2 ]; then + nb=$2 + fi + if [ $# = 3 ]; then + nb=$2 ; hl=$3 + fi + head -n $hl $1 > fileA + head -n $hl ../Modele/$1 > fileB + tail -n +$nb $1 >> fileA + tail -n +$nb ../Modele/$1 >> fileB + diff -q fileA fileB + if [[ $? != 0 ]] ; then + diff $1 ../Modele/$1 + echo "Wrong translation of $1 " + exit 1 + fi +} + + +echo "Tralics tests started at $(date) " > Trace +run_tralics hello +run_tralics hello1 +run_tralics hello2.tex -config=hello.tcf -oe8 +run_tralics hello3 +run_tralics testb +run_tralics_with_err txtc "There was one error." -nozerowidthelt +run_tralics txtd +run_tralics torture -oe1 -oldphi +run_tralics tormath +run_tralics tormath1 +run_tralics tormath2 -oe1 +run_tralics tormath3 -oe1 -oldphi +run_tralics amsldoc +run_tralics testmath +run_tralics fptest +run_tralics mathmlc +run_tralics_with_err tpa "No value given for command " +run_tralics tpa2 -nofloathack +mv tpa2.xml tpa2x.xml +run_tralics tpa2 +run_tralics_with_err txerr "There were 8 errors." -oe8a +run_tralics testpack +run_tralics testpackii -param bibtex_fields -year -param bibtex_extensions -phdthesis +run_tralics bo +run_tralics testhtml +run_tralics testclass -defaultclass=article +run_tralics_with_err testkeyval "There were 32 errors." +run_tralics xii +run_tralics_with_param comp_pi 100 +run_tralics_with_err teststr "There were 10 errors." +run_tralics_with_err testerr "Following images not defined: gee." "-year=2008" +run_tralics beauvilams2 +run_tralics testbe +run_tralics testb1 +mv testb1.xml testb0.xml +run_tralics testb1 -raw_bib +run_tralics exemple2003 +mv exemple.xml exemple2003.xml +run_tralics exemple2005 +mv exemple.xml exemple2005.xml +run_tralics exemple2006 +mv exemple.xml exemple2006.xml +run_tralics exemple2007 +mv exemple.xml exemple2007.xml +run_tralics exemple2008 +mv exemple.xml exemple2008.xml +run_tralics ex_emple2008 +mv ex_emple.xml ex_emple2008.xml +run_tralics exemple2009 +mv exemple.xml exemple2009.xml +run_tralics_with_err exempleb2011 "There were 8 errors." +mv exempleb.xml exempleb2011.xml +run_tralics exemple2011 +mv exemple.xml exemple2011.xml +run_tralics exemple2013 +mv exemple.xml exemple2013.xml +run_tralics testm1 -oe8 +mv testm1.xml testm1a.xml +run_tralics testm1 -nomathml -oe8 +mv testm1.xml testm1b.xml +run_tralics testm1 -dualmath -oe8 +mv testm1.xml testm1c.xml + +echo +echo Comparing results with models + +compare_file hello.xml +compare_file hello1.xml +compare_file hello2.xml 5 +compare_file hello3.xml 5 3 +compare_file fptest.xml 5 +compare_file testb.xml +compare_file txtc.xml +compare_file txtd.xml 5 3 +compare_file tpa.xml +compare_file tpa2.xml +compare_file tpa2x.xml +compare_file tormath.xml 5 +compare_file tormath1.xml 5 +compare_file tormath2.xml 5 +compare_file tormath3.xml 5 +compare_file amsldoc.xml +compare_file bo.xml 9 # there is a date on line 8 +compare_file testhtml.xml +compare_file testclass.xml +compare_file torture.xml 6 +compare_file txerr.xml +compare_file xii.xml +compare_file testkeyval.xml +compare_file comp_pi.xml +compare_file testpack.xml +compare_file testpackii.xml +compare_file teststr.xml +compare_file testerr.xml +compare_file testbe.xml +compare_file testb0.xml 5 +compare_file testb1.xml 5 +compare_file exemple2003.xml 5 +compare_file exemple2005.xml 5 +compare_file exemple2006.xml 5 +compare_file exemple2007.xml 5 +compare_file exemple2008.xml 5 +compare_file ex_emple2008.xml 5 +compare_file exemple2009.xml 5 +compare_file exemple2011.xml 5 +compare_file exempleb2011.xml 5 +compare_file exemple2013.xml 5 +compare_file beauvilams2.xml +compare_file testm1a.xml +compare_file testm1b.xml +compare_file testm1c.xml +compare_file testmath.xml + +echo done + + diff --git a/thirdparty/tralics-2.15.2/Test/amsldoc.tex b/thirdparty/tralics-2.15.2/Test/amsldoc.tex new file mode 100644 index 0000000..f2eba21 --- /dev/null +++ b/thirdparty/tralics-2.15.2/Test/amsldoc.tex @@ -0,0 +1,2691 @@ +%% HACK for Tralics, +\begin{filecontents+}{amsldoc.clt} +\ProvidesClass{amsldoc}[2004/08/06 v2.06] +\NeedsTeXFormat{LaTeX2e}[1995/12/01] + +\InputClass{std} +\@titlepagefalse +\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final} + +\ProcessOptions +\let\allowtthyphens \relax +\def\chaptername{Chapter} +\def\pkg#1{\xbox{EM}{\AddAttToCurrent{r}{pkg}#1}} +\def\opt#1{\xbox{EM}{\AddAttToCurrent{r}{opt}#1}} +\def\cn#1{\xbox{EM}{\AddAttToCurrent{r}{cn}#1}} +\def\ncn#1{\xbox{EM}{\AddAttToCurrent{r}{ncn}#1}} +\def\cs#1{\xbox{EM}{\AddAttToCurrent{r}{cs}#1}} +\def\indexcs#1{\xbox{EM}{\AddAttToCurrent{r}{indexcs}#1}} +\def\fn#1{\xbox{EM}{\AddAttToCurrent{r}{fn}#1}} +\def\cls#1{\xbox{EM}{\AddAttToCurrent{r}{cls}#1}} +\def\env#1{\xbox{EM}{\AddAttToCurrent{r}{cls}#1}} + +\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty} +\providecommand{\ndash}{\textendash\penalty\exhyphenpenalty} +\providecommand{\qq}[1]{\textquotedblleft#1\/\textquotedblright} +\def\mail{\texttt} +\def\<#1>{\textit{$\langle$#1\/$\rangle$}} +\def\addvspace#1{} + +\def\indexspace{ } +\def\tex/{\TeX} +\def\latex/{\LaTeX} +\def\amslatex/{\xbox{amslatex}{}} +\def\amstex/{\xbox{amstex}{}} +\def\xypic/{\xbox{xypic}{}} +\let\trivlist\relax \let\endtrivlist\relax +\chardef\bslchar=`\\ % p. 424, TeXbook +\let\addcontentsline\relax +\newenvironment{ctab}{ \begin{tabular}}{ \end{tabular}} +\newcommand*{\secref}[1]{\S\ref{#1}} + +\let\varGamma=\Gamma +\let\varSigma=\Sigma +\let\varDelta=\Delta +\let\varUpsilon=\Upsilon +\let\varTheta=\Theta +\let\varPhi=\Phi +\let\varLambda=\Lambda +\let\varPsi=\Psi +\let\varXi=\Xi +\let\varOmega=\Omega +\let\varPi=\Pi + +\let\error\relax +\newenvironment{error}{\tracingall% + \begingroup\catcode`\\=12 \catcode`\&=12 \expandafter\endgroup\errora +}{% +\end{xmlelement*} +} +\newcommand{\errora}[1]{\begin{xmlelement*}{error} \xbox{msg}{#1}} + + +\newcommand{\errexa}{\par\noindent\textit{Example}:\ } +\newcommand{\errexpl}{\par\noindent\textit{Explanation}:\ } + +\@nomathml=-3 +\end{filecontents+} + +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsldoc.tex", +%%% version = "2.09", +%%% date = "2004/04/06", +%%% time = "15:13:33 EDT", +%%% checksum = "39446 2620 11111 93831", +%%% author = "American Mathematical Society", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% copyright = "Copyright 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% supported = "yes", +%%% keywords = "latex, amsmath", +%%% abstract = "This file is the source file for the user's +%%% guide of the \LaTeX{} package amsmath .", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +\documentclass[leqno,titlepage,openany]{amsldoc}[1999/12/13] + +\ifx\UndEfiNed\url + \ClassError{amsldoc}{% + This version of amsldoc.tex must be processed\MessageBreak + with a newer version of amsldoc.cls (2.02 or later)}{} +\fi + +\title{User's Guide for the \pkg{amsmath} Package (Version~2.0)} +\author{American Mathematical Society} +\date{1999-12-13 (revised 2002-02-25)} + +% Use the amsmath package and amscd package in order to print +% examples. +\usepackage{amsmath} +\usepackage{amscd} + +\makeindex % generate index data +\providecommand{\see}[2]{\textit{see} #1} + +% The amsldoc class includes a number of features useful for +% documentation about TeX, including: +% +% ---Commands \tex/, \amstex/, \latex/, ... for uniform treatment +% of the various logos and easy handling of following spaces. +% +% ---Commands for printing various common elements: \cn for command +% names, \fn for file names (including font-file names), \env for +% environments, \pkg and \cls for packages and classes, etc. + +% Many of the command names used here are rather long and will +% contribute to poor linebreaking if we follow the \latex/ practice +% of not hyphenating anything set in tt font; instead we selectively +% allow some hyphenation. +\allowtthyphens % defined in amsldoc.cls + +\hyphenation{ac-cent-ed-sym-bol add-to-counter add-to-length align-at + aligned-at allow-dis-play-breaks ams-art ams-cd ams-la-tex amsl-doc + ams-symb ams-tex ams-text ams-xtra bmatrix bold-sym-bol cen-ter-tags + eqn-ar-ray idots-int int-lim-its latex med-space neg-med-space + neg-thick-space neg-thin-space no-int-lim-its no-name-lim-its + over-left-arrow over-left-right-arrow over-right-arrow pmatrix + qed-sym-bol set-length side-set small-er tbinom the-equa-tion + thick-space thin-space un-der-left-arrow un-der-left-right-arrow + un-der-right-arrow use-pack-age var-inj-lim var-proj-lim vmatrix + xalign-at xx-align-at} + +% Prepare for illustrating the \vec example +\newcommand{\vect}[1]{\mathbf{#1}} + +\newcommand{\booktitle}[1]{\textit{#1}} +\newcommand{\journalname}[1]{\textit{#1}} +\newcommand{\seriesname}[1]{\textit{#1}} + +% Command to insert and index a particular phrase. Doesn't work for +% certain kinds of special characters in the argument. +\newcommand{\ii}[1]{#1\index{#1}} + +\newcommand{\vstrut}[1]{\vrule width0pt height#1\relax} + +% An environment for presenting comprehensive address information: +\newenvironment{infoaddress}{% + \par\topsep\medskipamount + \trivlist\centering + \item[]% + \begin{minipage}{.7\columnwidth}% + \raggedright +}{% + \end{minipage}% + \endtrivlist +} + +\newenvironment{eqxample}{% + \par\addvspace\medskipamount + \noindent\begin{minipage}{.5\columnwidth}% + \def\producing{\end{minipage}\begin{minipage}{.5\columnwidth}% + \hbox\bgroup\kern-.2pt\vrule width.2pt% + \vbox\bgroup\parindent0pt\relax +% The 3pt is to cancel the -\lineskip from \displ@y + \abovedisplayskip3pt \abovedisplayshortskip\abovedisplayskip + \belowdisplayskip0pt \belowdisplayshortskip\belowdisplayskip + \noindent} +}{% + \par +% Ensure that a lonely \[\] structure doesn't take up width less than +% \hsize. + \hrule height0pt width\hsize + \egroup\vrule width.2pt\kern-.2pt\egroup + \end{minipage}% + \par\addvspace\medskipamount +} + +% The chapters are so short, perhaps we shouldn't call them by the +% name `Chapter'. We make \chaptername read an argument in order to +% remove a following \space or "{} " (both possibilities are present +% in book.cls). + +\renewcommand{\chaptername}[1]{} +\newcommand{\chapnum}[1]{\mdash #1\mdash } +\makeatletter +\def\@makechapterhead#1{% + \vspace{1.5\baselineskip}% + {\parindent \z@ \raggedright \reset@font + \ifnum \c@secnumdepth >\m@ne + \large\bfseries \chapnum{\thechapter}% + \par\nobreak + \vskip.5\baselineskip\relax + \fi + #1\par\nobreak + \vskip\baselineskip + }} +\makeatother + +% A command for ragged-right parbox in a tabular. +\newcommand{\rp}{\let\PBS\\\raggedright\let\\\PBS} + +% Non-indexed file name +\newcommand{\nfn}[1]{\texttt{#1}} + +% For the examples in the math spacing table. +%%\newcommand{\lspx}{\mbox{\rule{5pt}{.6pt}\rule{.6pt}{6pt}}} +%%\newcommand{\rspx}{\mbox{\rule[-1pt]{.6pt}{7pt}% +%% \rule[-1pt]{5pt}{.6pt}}} +\newcommand{\lspx}{\mathord{\Rightarrow\mkern-1mu}} +\newcommand{\rspx}{\mathord{\mkern-1mu\Leftarrow}} +\newcommand{\spx}[1]{$\lspx #1\rspx$} + +% For a list of characters representing document input. +\newcommand{\clist}[1]{% + \mbox{\ntt\spaceskip.2em plus.1em \xspaceskip\spaceskip#1}} + +% Fix weird \latex/ definition of rightmark. +\makeatletter +\def\rightmark{\expandafter\@rightmark\botmark{}{}} +% Also turn off section marks. +\let\sectionmark\@gobble +\renewcommand{\chaptermark}[1]{% + \uppercase{\markboth{\rhcn#1}{\rhcn#1}}} +\newcommand{\rhcn}{\thechapter. } +\makeatother + +% Include down to \section but not \subsection, in toc: +\setcounter{tocdepth}{1} + +\DeclareMathOperator{\ix}{ix} +\DeclareMathOperator{\nul}{nul} +\DeclareMathOperator{\End}{End} +\DeclareMathOperator{\xxx}{xxx} + +\begin{document} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\frontmatter + +\maketitle +\pagestyle{headings} +\tableofcontents +\cleardoublepage % for better page number placement + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\mainmatter +\chapter{Introduction} + +The \pkg{amsmath} package is a \LaTeX{} package that provides +miscellaneous enhancements for improving the information structure and +printed output of documents that contain mathematical formulas. Readers +unfamiliar with \LaTeX{} should refer to \cite{lamport}. If you have an +up-to-date version of \LaTeX{}, the \pkg{amsmath} package is normally +provided along with it. Upgrading when a newer version of the +\pkg{amsmath} package is released can be done via +\url{http://www.ams.org/tex/amsmath.html} or +\url{ftp://ftp.ams.org/pub/tex/}. + +This documentation describes the features of the \pkg{amsmath} package +and discusses how they are intended to be used. It also covers some +ancillary packages: +\begin{ctab}{ll} +\pkg{amsbsy}& \pkg{amstext}\\ +\pkg{amscd}& \pkg{amsxtra}\\ +\pkg{amsopn} +\end{ctab} +These all have something to do with the contents of math formulas. For +information on extra math symbols and math fonts, see \cite{amsfonts} +and \url{http://www.ams.org/tex/amsfonts.html}. For documentation of the +\pkg{amsthm} package or AMS document classes (\cls{amsart}, +\cls{amsbook}, etc.\@) see \cite{amsthdoc} or \cite{instr-l} and +\url{http://www.ams.org/tex/author-info.html}. + +If you are a long-time \latex/ user and have lots of mathematics in what +you write, then you may recognize solutions for some familiar problems +in this list of \pkg{amsmath} features: +\begin{itemize} + +\item A convenient way to define new `operator name' commands analogous +to \cn{sin} and \cn{lim}, including proper side spacing and automatic +selection of the correct font style and size (even when used in +sub- or superscripts). + +\item Multiple substitutes for the \env{eqnarray} environment to make +various kinds of equation arrangements easier to write. + +\item Equation numbers automatically adjust up or down to avoid +overprinting on the equation contents (unlike \env{eqnarray}). + +\item Spacing around equals signs matches the normal spacing in the +\env{equation} environment (unlike \env{eqnarray}). + +\item A way to produce multiline subscripts as are often used with +summation or product symbols. + +\item An easy way to substitute a variant equation number for a given +equation instead of the automatically supplied number. + +\item An easy way to produce subordinate equation numbers of the form +(1.3a) (1.3b) (1.3c) for selected groups of equations. + +\end{itemize} + +The \pkg{amsmath} package is distributed together with some small +auxiliary packages: +\begin{description} +\item[\pkg{amsmath}] Primary package, provides various features for + displayed equations and other mathematical constructs. + +\item[\pkg{amstext}] Provides a \cn{text} command for + typesetting a fragment of text inside a display. + +\item[\pkg{amsopn}] Provides \cn{DeclareMathOperator} for defining new + `operator names' like \cn{sin} and \cn{lim}. + +\item[\pkg{amsbsy}] For backward compatibility this package continues +to exist but use of the newer \pkg{bm} package that comes with \LaTeX{} +is recommended instead. + +\item[\pkg{amscd}] Provides a \env{CD} environment for simple + commutative diagrams (no support for diagonal arrows). + +\item[\pkg{amsxtra}] Provides certain odds and ends such as + \cn{fracwithdelims} and \cn{accentedsymbol}, for compatibility with + documents created using version 1.1. + +\end{description} + +The \pkg{amsmath} package incorporates \pkg{amstext}, \pkg{amsopn}, and +\pkg{amsbsy}. The features of \pkg{amscd} and \pkg{amsxtra}, however, +are available only by invoking those packages separately. + +\chapter{Options for the \pkg{amsmath} package}\label{options} + +The \pkg{amsmath} package has the following options: +\begin{description} + +\item[\opt{centertags}] (default) For a split equation, place equation +numbers\index{equation numbers!vertical placement} vertically centered +on the total height of the equation. + +\item[\opt{tbtags}] `Top-or-bottom tags': For a split equation, place +equation numbers\index{equation numbers!vertical placement} level with +the last (resp.\@ first) line, if numbers are on the right (resp.\@ +left). + +\item[\opt{sumlimits}] (default) Place the subscripts and +superscripts\index{subscripts and superscripts!placement}\relax +\index{limits|see{subscripts and superscripts}} of summation symbols +above and below, in displayed equations. This option also affects other +symbols of the same type\mdash $\prod$, $\coprod$, $\bigotimes$, +$\bigoplus$, and so forth\mdash but excluding integrals (see below). + +\item[\opt{nosumlimits}] Always place the subscripts and superscripts of +summation-type symbols to the side, even in displayed equations. + +\item[\opt{intlimits}] Like \opt{sumlimits}, but for +integral\index{integrals!placement of limits} symbols. + +\item[\opt{nointlimits}] (default) Opposite of \opt{intlimits}. + +\item[\opt{namelimits}] (default) Like \opt{sumlimits}, but for certain +`operator names' such as $\det$, $\inf$, $\lim$, $\max$, $\min$, that +traditionally have subscripts \index{subscripts and +superscripts!placement} placed underneath when they occur in a displayed +equation. + +\item[\opt{nonamelimits}] Opposite of \opt{namelimits}. + +\end{description} + +To use one of these package options, put the option name in the optional +argument of the \cn{usepackage} command\mdash e.g., +\verb"\usepackage[intlimits]{amsmath}". + +The \pkg{amsmath} package also recognizes the following options which +are normally selected (implicitly or explicitly) through the +\cn{documentclass} command, and thus need not be repeated in the option +list of the \cn{usepackage}\verb|{amsmath}| statement. +\begin{description} + +\item[\opt{leqno}] Place equation numbers on the left.\index{equation +numbers!left or right placement} + +\item[\opt{reqno}] Place equation numbers on the right. + +\item[\opt{fleqn}] Position equations at a fixed indent from the left +margin rather than centered in the text column.\index{displayed +equations!centering} + +\end{description} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Displayed equations} + +\section{Introduction} +The \pkg{amsmath} package provides a number of additional displayed +equation structures\index{displayed + equations}\index{equations|see{displayed equations}} beyond the ones +provided in basic \latex/. The augmented set includes: +\begin{verbatim} + equation equation* align align* + gather gather* flalign flalign* + multline multline* alignat alignat* + split +\end{verbatim} +(Although the standard \env{eqnarray} environment remains available, +it is better to use \env{align} or \env{equation}+\env{split} instead.) + +Except for \env{split}, each environment has both starred and unstarred +forms, where the unstarred forms have automatic numbering using +\latex/'s \env{equation} counter. You can suppress the number on any +particular line by putting \cn{notag} before the \cn{\bslchar\bslchar}; you can also +override\index{equation numbers!overriding} it with a tag of your own +using \cn{tag}\verb|{|\

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℘C`EvCtsQ=E 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 Ce?!6m literal 0 HcmV?d00001 diff --git a/Templates/DejaVuSerif-bold.ttf b/Templates/DejaVuSerif-bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0a063ca407f840fdb474cb8608a89f5a27024023 GIT binary patch literal 305644 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%0DO>M+4K^mdkS*nmF)@g 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 O{NF47?{xe0EB*_PR9X`N literal 0 HcmV?d00001 diff --git a/Templates/DejaVuSerif.ttf b/Templates/DejaVuSerif.ttf new file mode 100644 index 0000000000000000000000000000000000000000..77f769e274fdca5c75f1b9db56878b9f30acb386 GIT binary patch literal 328028 zcmeFad0n`1Wdrx;(I^CU>K!BJSHc?vkT?9lxkpKxoSQ1uQ1s4R7O+`dR zKt)hQh=_=wEQ%IASc-8R) zd_PUdRe7EJ-qf!B*4{G+Dew`Z%)Fs*v;0w;{_%(Ef1e~^J;wmju7{| z!>3FNEh%`unvkyBP{*aB5wD_+>4~!)2hnBeBd?YfQulNSydpW*mj2t^@>V2n{-HPwa2x(R^x@5w* zvb-sMh@8@akkmhoDH}dC{<^G%L~fmj>)XZ-om%ehW?4<-QD_edjT<_)Wafk6Lqsl> z2?_TqFPk_i^@nTAi2Oi5Ldw^dPbev$JWV}MG$gQ0-vitKqP&k{sr)(`YGg})_(wHXakZ!u6=tV?tc9s9{1_aW0BKC#6555ft+3f?{fn$*|&RN z9*dlQ*YkS%iMxLFB*y!c_{I*MFq$Nf9X)n53B~B;t>o?Gz=#DDClXbBPZVvV(tN=U z8XqE*`bZVx=IEgm(vn<9I*@LpH@I*s8Ae8uabyyiPUevN$U^cESwU8lbz~!{Alu1n zj`}5{oagxe zVJs0%S|Y815WFY7M?BK|()+|KBqt7Xa+LV=WBM`T*T2%gA@Sgi0_m(P?G>ftL}{Op zD!Sq->XZA(1LWJ}Vknz(d5Sz!zFVFzFP4|dE9JHFdU=z)Ro)@*miNo=${)#} z%g5z!A&RQl6|a)0q$(LoBPCC1uC!6wDP5FaN_=azZ(+{7LyyIj_{Hl4?<%s!vT;Lu!_q ztLCdM)$7y_YB#mF+F!j@9j1;{$ElOl>FONyK6Rn`kh(%$t*%oysuk*X^)>YkLezHv zAE<}bFV&N374WlwpVSMgL5L=6HqEWYYYntCts%ZQ)vnfBYZ0xJ)Y*%%WQC7Oy4Il4{AYG_vGbAWs&|ah7&~E`VNuewIO&BFhNN7|R69RLh-~do2r) zyVSBA@hZzxmS-)SE!%+a1ndPI02~5*0{8-O0&p7eC%}(@^8m~fRtW$itWJOrkPHX` zvH-b&d_YUUb$||lZh+o^{(xHn!vG@z;{cNY(*bh;_W>3H9s;ZYtOl$DYy?yQwgX-R zya9Lz@B!d3;7jXCYnAn^^(X5Et6`IEHcSp~Ks=yjt+g#;>tyR;>th>W zyUkW?E47u|rr2iM?zYXhEw(MQt+cJRt+#EmZME&N?Y8Z=y=(i(_POo2?OWS-wsW>> z+eMw|s&3c4dZM1HXXuUeJiWQzMsKHg(R=Cr^g()&K0+U(Ptd38cVZ@6pfA;z>#Ovq z^k?AJRY3ztB%$M*EZgqkdkmu}gM~-D&sPlkFjUmOa;=Z*OV8&fdY^ z&EDJI-+rron0=&uoE?0!gHLww$qqi*!6!TTWCx$@;FBGEvV%|d3j22ZYxXzn@7O=E zAGUvKKWVSBpSAyFzhE~Uvcu+ZJK`M;9BGb*j;4;Q9jzS^M<+)QM<2%k$8C;cN2#OS zF~u>{akpc>W3gkIW2IxQW4&XOW2<9_W4B|!<6Xx`j?W#(9p5^>bDVQjJ1#njQ+3*% zUT2~+)tTXJ@xbG=B}bl*DGbD3mlgddA^*;adx{X zbGyL12)ql&B|#?@b+TB#!7ZO-yo_{Al-Vut-2#6`;LnJ9=81adiTrwPms5GZoGS8< zitd#c|q2itZ z3;#sB~ zN~YAAJT#^5No6m}nA|Ys$K*y6QCkyHn`mR*$Pyf@CoN{X%-)yGd+W)q^r7JGhl02D zWRm%LKJ$xw(Z6-P66Irj6S&WeMaf)&=l%{qEb=iE)bY7a8bwZjaW&S z9(YVk1XY@7``02C`b3Ut49=^VW-xhT^8d8p^Fn1CuKvhl^b{}ogNVxoht0Nk6_g0> zu@?mXn26_#*le{J1uizyNR*TNzh>B`LU;qk}>+l6WM*d zU91@|&)yep+{w$+&-lIO82?rIm?ji=nflPwCt{4t5uPtcIGr>z%vA%A@FVj?OaKG&_lco-6-&lqI^qnZ%cu% z5cmp?lMj>&JQn#vW@59$G{Mzrf_v`@{9TUIV?xtf1%6!MuxP;HM@5-O1wNGH^lO2~ zIBzUL8IjM1^8C6nE6SKNqZocd z<-7P?Q$PP#mc{_lzrymN9e8=OzoZo+e}$;?Q<481$E62E{sRJU&-1CUl%(|{e?4zk zte&5F89Iy0iCKnD6f$${cV)zL%`$RlUXR>a)Nj%t>X9~y`ZtOEpEyou3E6m3ln)79 zl#kIRp8$_$GV}y+{V(_Gkw(m?Xo`azDA6JPJ=sOL!DklGgCJtR~lxXUTJ<4fz@2 zI_jVf(w6$DpG4^Ov>j?M=GSKC}<%N^hb!k#2Md9ZI^>QM8ow zqT}c|(wk1E)5wiOh-8)AWT=!RC6Q55 zij+c1rS?*LGFs{?btPk1SJst`W!+g1GLGHEZX)Gu02@HYvq9_@GJy?dgUKW|gbg8+ z*>E1+m>!)AfkceB}SHo1o(kbBu& zb|0C`=Ck=^9$UhelKJc*wu~%bkFm$dBDRXHB8%BGY!g|+wy>?_QT8g^Ngijfv)9QJ zY!BNubUQ;is zwd8d*s!_5}V;Up-HIL>eZ|Rb*lXrEe?jnbEkM1F#>#gLg7_vPOitW;M1!e;00i{@CV)>f?g-w zCZxRp{Q!diMSu~2F@Onxsen5ni}wN+0G0xl1NiLo6yRCFW&oeRcLMeT4gd}TJ^{dM zL{9)t1O5bnHl^^o(He|)31ERg&56_pNCt!eS;&K(CFKKJ0bY1;Yb=T_BEBEspwC6a#gM;yDtPDn#_+$}|)qN9LzkjA#^k0jw)GD|P zPXBj4czPD6;J2SE^!@hAzxn&Gc>Qm#`+um;*ar#N2kC~6|3{zbWS-0AugI3K(EJ4ye24gX3`bUvsZ`suAa+<{s|Hth@NtANvON~pA^QW zKOP@{e8u2i6;Xe5);}6^|NM#no~!8h?!51R`{7joG3CE4{lEQg42>=Yyb^`Qa^-X7 zxm=Hf4iTHzO$q&dPeOkq@UlXazffP2IsW@Qkhc z+5h1a<5V-0tzR1TU*X|ztBC2MSJ3uf>G?mt)(w}jSI%7==XZMwEip$O$5IP zhq{l6n_2=_E>j+Tih3V_ue;+)F7i8I#_xcq@8h}uNHXe|{&(ZX%4i2b zzB!xV`M=TZ=2+ly-IXh&qfQsaMnMO(f|nDih-cNw{grzz)8CzAc=BjKuRoG|bMA`{ ztoL+2kBJd@xo)9xQ3vKTTpNfW<~wNbI$b=u{+JaM#AM#=Iq+Vzx~_$nY5c#67#E^J z0E3kLhUeyEV=~5de(d@cOW+E|%W^r3wn55y5DRsrM|0}1U#Gmzx_Wcv;+=5y6QvTcm_G2+f$Dfc^U9Jz@M#c9Li2w&prEPP*x_;KF*2ulbnA|U;ggtt%w=^$rI~ey6gq2pZUMS`HYKo!=}X)Q6nh&P@P%h0FwDGJ@F`{^D5N2R3eRE=&Nw$hu#hGQR?-x~Ce{x+ zxeCEf@(~=Q0Kti!k*kS|6e74ua|91*f#AhnNlTn7=3Mn*$D}p!W5?tgoaAhSkbvEl zYjFa$D?$=>TY6!ar4K?1B<&{BfD9yqNPygekc>00w~|zxQ@#&0&qq+P8*@KsUO*NB ze+VH+9!9X^#ODf7#dl~Nkk!?A`Wl1;vKAqPv!7d0|2CZeOd&fFQpg^JRI(Q#O!gt9 z;`Hnrc*=eRi5x(XaGLfVJnLNqnH)lpak};c#2+CjUlC3URmy?D#aXptL;oR(3pi?4q z&^s>lI`4Z4z2iZz2hdho$bljxKo$M1iT<{T-nELpw28jdMPJ%QUphozIz?Z)L|?kG zOV$Ckc0%xy&Ioa&3xZGdt{*3tyCJ6sLOkh-kU(xgNW^*O8`1Z?*OMWcebFEN5aMDI z&>#9IKyF4zB?AzGkcoll#X$&RAsJ~xGSaa_HyAD9@}UU%$Q1IS3TdzkX|M`uunTE$ zlcx}}$kPbfI5)ik__GKNv6uH8B!449Bl0{#W1JX%0r)nAT=FtP6P&Q#0h~)uQ?d)E zh?@x+$`jI)C#2^p@+LyQkfE!{TL}3=lCC0eBjgKtQprJt93fSjkSa|`l}bKD$RVF0 z6p$kb1>`6~0Xc?HK)ym~OimzZLfSN(SN<0GX#|ZrsS~k_x<~Me}zKw3Wem^Xqbjcb0L2=noiS!XV47Nf@ac8(o#sIPP1t?a4wg2 zdKJBjG^5RN`ni>m(blvjZAq@7ttdvlkXJW-nm$eP#jd7CpT`-F0=kKA0zEI#7l0q7 zM^XQm^h?zF1N{N{XX#nw|AqdAT%)vC+LKmF2c-jPqjXd{0`H`B0^V8a47`id1^7H= zK53;ss6I%p6=UE!^%3{1=({ZRc|&lx5&E(zdhaUqNCEU$ zA*8(pO16S@UjwPW7P8w5l6jNRM7KcF?k3pvBy%BU^C4dg$OD)W7eV(t3^{v*EEl`O zD^!YoKwqLT+A$#JmET*$Fw>3n_U6a&Z7M@Gg4&189&>pgT@NV??1V7<7aW zx*-8NAq72>29D=}udQiYX*99_Ao^b_w(6k~Mb^AFya zXdvE~Xz;6Ryc{o2p&#Vm-C0cB;_ZoY@%BWyczdE;yge~fyggAa-kvBIZ%@n=Z%@n= zZ%-@`Z%@n=Z%-@`Z%@n=Z%@n=Z%>qqwnMW_QIAele3Jy# zJfA|VX~Tz)Eho9fV@BOh@(~RsEkzu`n>AzbCJB#wh`5iqkMogY4#5^DT8;Ygt?p?Y z$MX^6NHTO;1ISMT@UCf^WHAvZVH_wzDwAd<@ZS6n)OIkX3FAY>2>CHc55u< zbDERL^a%X|W8q8W$~1&=n1K-|;i+8P4dVAoBPHy{B2UNDdjk6_f+WrWFsYZ+i^yVU zTfw^&ACP3$lC>nM>~Z!u39={H6C@;GlrNI7GE5jley;SIC z25Db`oR#EB#C%S~ZaV@Knv4k@#)S4_LVGcxy_lF2nV1t9-at8w@}DCx@&y8eCHW;{ zZc{R$!CIi@LonW;`0cMTtHyt66{Mx zHL4-z^DLuw?AJ4)5t-11OlUzS^dA%RFT?mrL>WH+GTMMPK%9!5eFpxA5c64>3H`@} z=3}%WZHSykc;|!BT$+oxDQ$|F>q18JX+Gks>D7q2Mr1-4GK}79fL}|&Z83KBEShqIf4uXiz3}Cxf&cK@QiQOlVCe z^d%G0K!r4zZ*oaO8YCeNR7e9A(m;hYP$3PJ%N*p1r#L?V%p!8Q^qVq{*A;-N7CU0f zrf}TG<(z`Yl;q(q8}zFAPE)*oKd`Rk2IyT0@m$0>K}%%h<2x{XM=pgH=J%x{R*6%e zFYfB0^YPF_l;>|lajdR9FKNSw;C11BGDtAT7Q`?KXJ)Pko=j}|as5l!KF9Qv`ZqYk z@hwj0pF&w1#>WzAsq~<Ur4c;TlSlx>sS%tjA$QVO>27*n3QO&zj?$~rKIx!zNcvRzTsk3rFP&p;S$lQ^P5}*N>GKATq2K_C(DcE$K?(3EAlS9&-0FaNd86fD*^Xg?wWuUum*gAgg`LR zG|(n+OQ0k$H83MEH}FbePim9Y?y195A5VQc_4U*bQ;(*eN&O}04+erAgFS;c2L}dk z2@Vd<3T_MT4}Kav7W_-FI%tHlLajsBh1!L>hHeP;4c#0n4vh~j4lN6<4{Zu<3B4G4 zIn2V=uqzxNP7VjcY2l1;cDQl4Yq)#(-ZYXXr&-hNY5ufOT9dSE)7qzXNxLa+Xj)0y zytFN8Z>3A=db%e)DLtH?ncgscR{G}j4>QuSz-g1!IqUYUvg{|b4`iRr{yt}R&JT^8 zjhZ!1&MnRzlUtU1NAC38SxqvVCN^!lzVrGU*WbJ$enW7>!s@K*hUecp|MB_5msG$sa0iCE2~!{Smlr0k`7=fk18`FK}I8Sl|x9?Z*SJrjpdW z)ZVEhQ&*>MN)iqeYH?oL}MxNS*yrzfU|>T??=R?DomSw&f+!0ord?eDUG1h?(rHYVoW+jGa| zPR^Z{I}_#?=XQtnz1R2KVA+te;Q^@iI&Kq#M1SGjj-HCX5#1Nv8{HFqJ-Q2fHx_NzsI;KN@G$8o&H}$IoNWj65^^%)m1P&h$Og`AnxX9nZ8q)AUU4ne;QxGmfhF ztKO@6yXwuVeO0eky;${J)tahDs+LqOs(PU6{;GLZ_f^fUy0_|{s=KP@RL!oMRW-9} zdeyY5sa2D!CRL5EDz7T58do*Cs<>)M)!?dItGZWps_IbHzUunQzg7NN`RB^-Dyu3_ zSDvi=y7ENj@ybJ$?^W)ve6?~%8TrkylYc*Xb2I;10l4;NVqYh6%j=fw?Bg&mskH0%c)rDz6LtQb0>8 zh{LC_Pt z8Tb*T15HrAMtX}0%1NYyO;8|DLC_bRh4SdT;2gj;>)#gY+a}eW5#q)xn z1C9aji}WkNUx4%HfaYK|@G(fw0}SA0rWy!k0SDhhjR38IuR)5w3S9@h0%$wp&Nih9z!<*@Jw|NQnZhQ`UXrGJqiWL3AK?UuhEheZxBYn{X73~ReI$lPZzY!9a01WuwkwQ*6sOYD#1Kw6!vvO*f>&Y4k)|RAufpJo zhVc;wPdI3JMi~4E-wQkeDcXo?iH34%s5cFDXy98K?oR`q+UrPlfF1Zgq@Xtqv})j6 z8tzYnJZbMDO$R{EwZlkT0TGTiQ*)ze8FC7z+Fx(qcdf z@E?)h4S+0b;B(qS0C=rkK>C&mmIj2RgJupE@F^YbOb4x&RHSZz2Y4D%$bUL`YRNzf zdeg(e!L#&C6D$pp#=w#Te3l6o@G^a~36{o4KQzITOGpOV%fW&+qZ%yxfJ3Kbq3v1V zyR{k8wt&vSuSSYCX59`Pe90OGCeiuQBRTj6IWIsnji zy){zMz5Yhv7`N;D0d58!A!GykYXjs_N7)T2fFN+l=7t9V3xN+Xe|n-C%+&`0M;~#} z?;_+pc*Oy~u|m#&Yyy61g`9`{alr4bz?le8fzQP*A8^A39Q8(j0n`FtMd)YniGBup z^(T>D0|1TO3j8br0A2b9q@4s1eG}4d0JKMc0cjt=XyAB5;RxPFIPwkf4~Qz+@GwHf zAIC0#C;{iir!KvG={E>&#)o0`tH3Lu5eqzTHh8@3*w1ld55tXJ1}}C9eAr8h$38+L z_79S=Z_q&OX9P)zgfXnsf8*)J!XxJG&HE?*-s^ClK0>Z1?MQog_&Q=Qqcip}x?=C5 zJK-L;UhrP<9g9BLsptp4aDR9p23+fPA7G|bi+zlpK5)VS05wO@Y@;7 z)o0-EUI?%EB6z!(kfr27vRHV!`7f(*FZbi*XK8{ohm4nIO0%Rp$#m&1X|^;G0$?K( z(dRqJdkCKb>p@D%cyMJc@Jcd6 zeJ$F-uU};Ei?EWt4{KFoz1d0z=@cb)uxn(Qy>EiJ>pgfncY^PzL3tmZdV)UWdn@fw zdpB_XD7}ZQqn}}adl8u^<1z_QoAMcGDJ8>{&qVkUI{^I2Jg-#wO!a}5Qnd3mP`1v@ zr#Z9_D`F$)0JKn|8(9~Wol8pPB7|%aIv_`iwLy|*;Q6uklJ})sr5rgM?|$9NpMc%< zwV?P~&^rQ@b^%D7e)c_C%b@c}lCqC<)4Hj4s%oxUY8A#V}h zEjxmzV8Cow6`4ttH*dbPH$D$6%>pK7sz#q@X(>iwGdK9#w=dr?P zyj{j}d4#eKxJHsAcG%78+ti{AmSoaw|KYP&5%=MD) zTytLdX@Z&qZYM-fNn!Mv4h=Cj;&rj1)*|~buamkRD%6MD>)wBOf6adPIn;K#x@Lb~ zq}3kJ9`_#C9_JR<7UxpWQuiFs9Cx{=++E};au0D0ao*s%!P(Z;*6H@R-ENoLiJINe zLCywraKsw)1l>Vb&?%44yt;Woe!SnOrl)1ag_%FSkS6qK)uLCg7Oi^7RO&EeWXoQ? zTDIubQ+cN5y_y=d_aNISRf1Nty}CkWGRz{YM6$RKA3uBu6jrx6l%GdE>1c7fhmKq$ zHCUs3R{NRMn1kTnYS>8$%5KyVBsWKz2dv6)k`U(_E~V%&h>{$V-xEx2kdmAL%BUjQ z6XQH?r^9ZwXsXPJ!{)UmN+Eakq5YnOR`|mtsY<$<&Y~CpWVJe50x}LCSYm??1agA^-5{v+i^5KPR9$ zyvuph&gLJ60OWsuz`b{`$D7b9FY`KDcy(4bb5g%AK7o1)QfY#xDe{`P@DzCXm-MDI z8wh$=Lr*lN($?{JOqo!8`-D;D#;`H+ise;1kMA!o*)?#ieZiFTZ+-V^anT1IY~zOX zpBj`N*G3KKT^g?KLVfoyWVAA}VZqururFa$TdvA6E>617YP4zp!h`GIaTz~Rr&Itw zC}e!}l$N9X2suu`JeCdZH!M<+#j-Q9GgxL;W>0%*qFUONlxBEK6SGo_8fJ{TI@9mU zwlbGJ?6;>_?Tu5I{VM%xclB8e9rwA<&w0G9@F#ds4Ic0;_qjX_OUaRoFzuHJY0-hkmH{cjpRoV|GS@Z$dchYi1J_0C;StlhaQZAHzX z6)CG<+qGuRt2>p4*FW;`vm2Hz+fbYS>?03v*zoYO=LQ|$wd>fiU9TOJPX6+<>NvLR z^)HXTw)41<>xZMK)ZJ*mm9!vxBPC9UIa#4bO`D|V<=gCqO-Km+n3dSVmLGDZ zHgV-=xl4!5? zNw1ejtpBF-(+>{lPc7fhJyUY+w03KDrKK6h=<@M{uAMf%_GIr@M~xnR_qRo_a4QXZ zh>jF`$g`c2VK^!xyG`|TNGKmD9#iX}>{G@*X%WV!gEWXZGzU?~J5^%yFv;nLHqD24 z)f@spXqM!0dt3Nbo+L<%e!g(w=au)}x6;@*7TZtc`K_gTrl}$x9hjfiJb~|*NRg*CT+Uyplcec#4g!XJAZynoBa^F!)=hFFQ9+ymMQNnfDjVyqmb-QiATb2hOdb{JU zxtY)Z4J!@w#UOe_8U!1T5%tDH4Yd<;8&tyoPQNY2qqTc3<=qeGhxII32VN zvn&DOHT%0)#N9Yxn+@~3+@_7YO`CyNk!@l!hDI{4DU|7&c`dI+y~%T5-K<$RVRCv% zw4Jn7$Y`U8N5a+$p%U#Wkx?@CDp@nMhj-7Rm_9oQeRdG~47y74uB|<{R{89gv7l8V z^P;EZC3Si=f(ga0mUu_mixL@BpH+3~iJ-5V3)|^xXo9@Vd@g0_X+n;19Lr4#@_8&h z@YsqKk8$|f_zU&?Tut4^kDc&(e_w3k_BJYvO~wmG#c;X;@AQ|^6~;*8LE|A~q~O;@ zOmx+t!A7P=8py@iC1k~_(vzt&Rn$=yI*~vWF$#6`7i<;u|JnTN{T`?q(L5Q7MdsSN zdxfpvfY-tH2pEK4F^leP>1ok&V8j|CA==E^%q9;;8C{f#?lsGhh$zEFNGZ%LfJD)B zDjT2DF$*ZRq`rLfp0gLH$HpVpp>i+K*?{zngzY}!a*#<>`8)Z zaoXI}s|PSRxOwJ2$2B5XltNE}>{fXZy_2nz-pSs{*U7J7gr|{GK|E4-)OhJgIDQ&9(Hc<#V1`uw<1yp4wWq`Sy)t#)k>Gw!>IA zmhNAEX~Cl#7jqd|g}$8)dK-b>#@0YdFm95!B%vhe%9%t;vPu{xgT|p$Yal(xM$%RM ze4yQDBVMVo(EFE3=YoX3uQ}^JAQXM8yf{uRx9l`-0m$LBtZZ%~nDb;~T4*AmT}yv^ z@{!w)o!_`>$9u*Zx$CcYQuYT;s?G;1vw`^HDZ{8!0a%FjL)7PJ!_i`xt$nzh6 zonJuHmM(j7WyQ-Q9(?GY2j<)f8HL|Ou0T8Z8ND@;OsUvvv(jRl&DxXN>|~-7!adP8 zib>p7^f;JHw@6-hHIxO{79P&~(=}}lw>g_16BtN~IlpghW~FrS_K-E?2sxQ49NjDI z{ch=A;oy<0-z|_QuaFfl7TBh&L=trzj%Z1{QdyParG~cVQcGKBsf$g+fjjE4*7YD4 zrm&|#de4y9_SykI)=rWZAD{u_)Q|KcORlLh)KZ!`mQ~l-MjLR2QnDHSH4S4rNM49! zGBq$YxkPnOa+UZ>u$;Mr46_%70v^ehN)l9Ss>kNyhAOvaV7&2GiV-UM$T;nVM($o= z?Z?IaazjF*As7s?hMsFt`$i67?7 zwDgjcQU0Q=kS#Tysb0TbwJM2v7FYs(Rj08awcOOhkju2%tqzauR@|yv^H}2SaSpc= z%NMuDlVi_u^a}P0^$L3jX9{D_v_4o}qtb<<3&S+=!|;XjlU6TUv0~AZQgmwxQt4Xrx`wK$F5M(5Mbsj25n zN{ugt?%M>}z6X77Arm42#?LcIj8f7QlffO@Fp8BaygoKKk*s`Fnk$m(vvq=e*-+(u z4NaF~R>ug8vCP6?k1FEhCYY_^l|4l8;nlIpkq?SOp&`BX zml14t`^{rd7*U$=eJynvyN%|Xrnql*_mx%T_&lv})N?7#uBo_LTO=^6@C}k=s+J@GJ}5CutEk zx2U{B?XurWT#A?ZVeJU#1Yc);P~WbKtM{y!jn$Svl0%)bCF?DF_G*DVjD(})HszSS z9&6uV#I0}>RbiMQC6Xv7Xc*`DTgC$LlGa z!JOu!bcAw@t%gKvBoJ|8k5`=_TNIiolLQO=3W7bRI|W*s2YBCjRTmAmdhLa^TtEMc z9vCV3JI6J#EfjrYEitM~Mrms6uwKnvF)Y^+vOebef>$f#@lAMvSR6(k2p$ zM`tDa!}in?ziX7WC><7KO0w5aNrE>_?NYi>^5!y3NFiU8xj%3lZ{^i@u?S@a6GGK6 zpzDkWEuD_+Y5H7xepR}s-w8^;`g+ETFFkbUga`dY>+DHoc(bOTZ{K;gz@S|kzq{)G z)%VO0bj~wYX=Tb&&>cPDJG!Rb_1!yW_sX!7?j0LuFh|Gf*6!0?(<5wV#`MP4nTgXI zx9FAK(Ch4yqF#?*=XN&m2Ch{bq^4YZmDCF=0h-vT6&@76cH|vrX0 z@-q4O$$~cE%R$&fravMpgU=_bJFEfQ22S|dA4D!kg;qIm{vs05fKZpevg zJjE87&TAeXyyeR;w+w#xnpGQL>(IW``0%Ac75(2mSv+JcZT!MrCyNTl80VgT#dvAf zU32f7Gn)>4<8wOnjvl>?okkU1GI83x`O_yXzR;)l#e)Zb>D^~>O-<&-*UAp`o4Y70 zd$2L@?;DIWx8E_VM~_Z}2hW``n|6ME2kkWb&iU(C4Xc`IR2v6zY;n}A$G5Crv*iiM zVzgSUaXy1odNI@ANVvr-6;qs$Q@kF@4cpfxvS3wf7LB?sniHVgC5PK$(Rxa%vy8a0 zSd+`tVK(M*yPOUk{woCo#1Us@aTpUZ*VXB>aQI+}Q|H!5$k#As@L9tmOdz1hihUWF zwzZ)b_E03APw+0M%Oy8d8mbK)4V}53#$GYghpjO0u#711!%SsiR^X>Ar3~X-ZI^o_ z-?Nhc;o5K3&#GNGYn>F34qOV9Dx)txQd){%JKZ5{Xa;XLQHsTU=fQ47$4GXnR%Z3P z%MymgkuvL@Ubju7iK!V1aX3?CXE@%QVI>}4IFk=|IIA$NplQOMK8r=bS$MG^En#!g z21x>GOhKdvZiD(pD!oV>Z(IM&%f@HMxmS=Y`ucfW zjkU%k@Ql+`0Gbj=pGYHroa-*n9LHU{W}U;zlwq_iZjOE@0eQelw8SY)ROFlNX@&4qrwE%5?(kYVtYs%tiS&T5B&Ej&Zb%b%=al)XA zxx17v>CWY2Q70(N`$zN?_&GHPX4GCs4NxQf<=3>_8CzF!*?JSQl}b9p!u41kWiIPD zADJB}X5*4a`HF(X6>!=;fh;#1xtT#OVy7>=?D@h>n7FO-wueG_I6TTAYLKiDmgulQ z;Iie5TgaZ-kzDYUVETyzaGg=r82`aw;|x7L*LZ)6vDp}f_4&X#)U#4f*!7aJ4a@dd zjLj`u(z{02e%iAq-GCqG8%CeGri}qNyWpXEKX{lzZi_Tcm}7P68e?S+WmuBm!ze~G zHYDvCwq!NK;&o=k+dOWtGSPxQZcx|9;3s_0_yadF6C~uHZ-WRn3Ks2w^1z(Ho&ZEL z##?Tw^8Q9D^bfuX4ojVPGj%uO-LL?LH2puS_52z1uIjh&{vUu~}dw?XQ6~hItUe zjRqSBxMKkJx^Q9Ow-Q0GpZH_;`qsR7bZYksCzfmGq7+xm5;04knf7J#!We_Zw#%jo zY`}m!Zu?Fezx%-P&JP>33W4-hhqwuw5Az@4@&bHiyoF()%hs|cwZFbdx|8(F|-KrY4T|N0u|&)zIDA*4)wD z$-OM_wb&!}PW%Vpoe^g{SHu(XM&csANOE7>0DXY{CdW z%v0noiYxL>(`W0`?6d7t98;WAT+`gsJngaEy&{cN2&0wHhS((GgB{W!-SZUv@!8th z()$~YXKLHTr13qe5Hk6GZ9%E@R_!x<;F~%q2;MtLUL;w!YFsT^=g=~O0b_I7!B0L` z;7ArK+kIMSob%`Mp#`tdz~wRa;Eh7pjlSf$Xuws)-|ZsWLD9EykunX+%GXuv;=RG!Ev}nyfHuH8#5*W%kZ+VW(p%;o6*tOvhc??AR8^2}VR05;yymm` z;dGI-K6!i+!WW(SF9CVisOd+CTWu`lj0`&<|MC4 z-jcj0Ipaz=o)-pqRNIgXS^nz%W4H8>VrJ>43Gl~!g`hGDcgi8Vv>X1MhX&E-JXx?NJ(7wcNE zQuOWt%qQR?{8TZEtMRA&wqoz+&{;^#;;sy1hzzlS`_pbA3R9$gQV|B z_Jh-EIvnJ>>Cy;#JW|+@1 zSKPkahoqIItxdz!@@ogMFlS(U!&8Fk#V2V_%DVjR;>Ew6zj*QdiYSbkvE{>RR??1i z={O+0=#8`+?M`nrwiquP+l?)wxlz;L<(FxoeAsZKzwz`-#y4fdhJ(bIO~ZAQ1uORU zkuWLq-y`gr1eyQ-ikJj0VG0TQ~T;+5= ziNH9tJhE!lBluw@ZWg|A5;Nn)lg8U;qzg~3cxs2@A5^?dED$au~uz06GGuyLXJ<70!*{k1s8?Erm-4!y!h;|pVK z>-LdXEsy;2Tb|ePR^|3j3as$?kuKN+Vs?w0$qeIGW<9ax(tybg%Jh5ER_jW|45ia@iIg!nYBx ztV+0wfF^+lA6v_DP^PRYZOlhvY_1h%{ADAbeb%X@;nD5J+V9(!5BvJl+I8r#zkT`V z7iy=|>_?X_ebhKARmR=Y$LLr}k1e>dcAJ=-KiaeM#jGXEmkYo6CisCWA^SNrJJJpo zct+Tb|96ralma2Q-LCi4?V+$7PiOO~J3D^1zc_iEcT{#!qmXV72P_FLK8;&){8~mJ zhq$Ch!d(u9$Q?siyo$xG=`e@02<`g)W+)~+Hx?;_BYLQDUgO@4%Nx&Wtnm3g=8o-N z;S)aDM#2oh4-VA%WG6MW<>=g9nG?(j<%Dz6T3TD#TI;RttsSkLtx{VDTZdYQTcx#3 z?`rF+ce8hObP0A1bq#k-8)zG-53~<-3=9nn4@@hyjJ%fhR%)ULlz8${2UI{~{V zD!cY<-8FvuTc2;C&gzjD7LND4`10y!W*&U?y%&r>8GoJ;?SdVljZZI{H)c|cYp#Fe zx!s>MX>7c)deL1oMo(|k;@a2O96g@T$3KM)Mex6oKEv6P8IcsLqO&q>m;=+J&1I2Y zsx!l4#~MFB*A?^j7+q&5O=lQg_ms-j-_s(9;w8J#3zQT= zui|VJG}gFCrd>^nBi6a`7(R@Yxujw7MaeKUF=kxu3@^=4JUH0P=K$FAVg`T8m3ZNZeH6uxr2EE%9SS+pmaB-issg@mD5XmF3zWzVk4 z%3XWth26$Q;{d|nl+w|oYif*dzx|e`GFZwr-x<%t+0lUF#3k(5v*0~Hi{m5@MOxv2 zl*G*kT1+Sm2k1zBd7hglpp9HrsssjMzVcU|^Gm_17}02k)x5*q2cw^Y>I7~!B$B$7SlCP z=?J{#x8qs5{lVHFHr1YcL<%XTm+q6NW5Qd`TPbA8hV!_5E$XAoBe$?(jCbyF!DyG< zOma9K)a`USu(OFpJ@Gk<9ZsAL)7^GmRzQkmb1RD6)2XACaV{%U$~<;$7$ZLJda>&^ zi+P01c!4G^-0cn3q_wWtHo;7bj@MGB0Gts z(0DZ0FDF@&tUf)?p6Ez&;w?ZNPRL?8at3VYLg{MOT)*1h!hsi{X-BCY>m+y7JKH-r zx;XKpBXodtGrL6|09|s66KBEPLp(#gL*j<`hQyB`CA35;VI$?+l@XQ^*4u5j>m%&N zu%}15O5LTNk-o{&L^eg4Y?*AGVw6zy14;2$m=erT2Utv%K=i;m; ztur?Vwhv3IEBF6C2p*#;{8dJF}E| zY{Qb{aTcO1k)CW_IBxNKw3*dJkXbY`{qou2ryOpPfzY}RsJ4>BeN42A)yQ?d}*s6QWqAwBC4lpW%h<7(LcXy(?&hcHK+Af7X~xkF2e&*ecDg z{Q=H`iPECcqm3Z_2Fta5wQWmHy&lDRd;EVsu0NVZIy&r_CmY2UG`zD8b(j~^mEEJqIpNu|`f*y>8JFSlC|F8CQ=EnifP21$?;EMGk>Gg{ zisPT@N*C7?ThV)5S%{6l-#QGCADiFmWaxM5q*${xw{^7L!UlOp*ru{OY!=OG(V3k& zlC@-u+wOKW(i&Ns#kba4TUuCK+S=-^>}~C>9BmzK`SDM8Cu>)|zjdH~i~SbID1D^8 z%s$dl<|vAvqD>L~HPx{sK8Fu%%%64R+Em+o61``SQLs>Iycz%8Ve+$d>msA=o>II} zeg<4$Ct)zx=GGoAg$;mRNTn_K?tnif-Rj067s+k0T6*eMS(>9_xlEv)nTF*ub18Ph zk4Eu5F3wgyAkUqLdv1T7`@3!}>f*LnvK{{uKvMC~Hu297t{kU#-Qco;>ViUZXVfot z^KWHO)zr+8SJm9cdQ9)4c)zBDx?DUbT#2Bu!uUzL3+J>nk`eLB6IC1&8gJq5c*eZ^ z@G1=cz4*Y_Q-hU&I4{JH22{|GjdRp%G*f-0zif@!55GFsLm1a!*bU~V(EiD}o;YaE zwc=n8Ki8u^44PJhrZPbj-wm8d6+x3^Azm4$X|W{$?wI7@6qRtHN@YefP;*Z8T{uyy z_KMMSls${{Sf61JE-?Zj2O%1cglU-Ocm>sm^0E0wh3aOnNx{dAL?daX1gA#rr~FWt zgfq<)Z(0OoVvNP!o9ktAA5Qg3%?{yau!6$G$Ejsp?9Gp$u5$uE6Hi`jdH{i0e&#psC9yQ+BkQ<%8f%oSQmQuVknZ~ZdBH2YQw#a z{s{u_s8!~*qgXFX>T&NmIu>9^LPRby*RN*a@K8@h0R?rExnMR zT!?4Q{(S#^^CwMQv}2vI?%K7ZU;OCYQ7Sz=cii3XAw@6u|LP3w_05#&Wp^*8uho81 zIz3a5O#lw!|2x-pOm`Mp z7J5^X^};wQ*YAO+!?}nj4SOQ4cR%^x%Vw7Cv06L`rMN77sDry?D_$IHY)e zDV@Cc;J3%WI{EG%EEEc~1RAIFww5&jZLytu?m4f&z~O#$Igov#;yc*L$={W{Q!?7W=$=PbJi7dj#mTho z#;vpfujbRMn&lZkE}V0ws_MI$csnX4H>YC!yCISlFT26Nq-BoaGR-qR4*b)K91A6H zuHVhFX)Y;jkZfzj8CZ=YOKrHv@7D~BSn(=b`t0tRH8?GSjhb^@ zqP?L&BrrR`@Z(+dL+L~RhbdU)!VP0?%eKH-%gd)EH0)Slb64(PbLOel(;g2l%l-4d z?~O_t|LtF?bXa|G{_Ka`I6Had*z8$bD!}X-9IHR_;?CE1zslv5;(Zmu#)Hod$oNPW z-fHyPrsKG$yd-J7+dkcAS>?1kXcOYlwQSNn&IL)$!vQ_GsljG!=7^d1Tt4>|;S{_$ z$(*-!Nh+6z?iGG+jR%Cj31I)v)Hkmbks>O!O{JJCsMyF;185juAevr_g4pgg8$Xox zz2WwLG{-n{wsuoRMa8QxwZE^OlGMG|_y_MFU9-8gl=T@sckA}VBq1+GEBO@o9>lv@ zBO(R4*olpEHwdvDGCh#9EY7l8voDd;mnA{h$WH`THL*6)QgcHMT-l^BD_Lt1->8Xs zWJTy2^vBt==n?n16Hql`3_|hqp21HSx|_~!TG13@L_K1&Aa+8f`L$vQ)QJ>dU)4LQ zQz#eId_QXMfFkdGvz~hNie%A|#)>-0Vz1TQQu#|(*4HD8UfI9oijb`zZ7ht5*xtH6 zlQG?Zr)81cWS{1s33F|1x-ve+>tuAgZ6RK3yEd*tuIkE-%XYMubCcC2LP8QEBx$w~_7EV1 zEd&UGBwz?(4IrC z=f1!9-ut=#ToF2{RO-~Jdg`fX{XSMN=9dYNBJ2+&HW9&Gr+7k~f_Lbq!dk{u#mtHc zSj%WWPsIPJ^E}!V(iAER6FSV77<>n+%6Xe6-YYYsPdd2JOOKbVES#txRW@#P+x+F` z`fH8*o{x?FsA}w@<#eWdAU5u6&_@_s>Z=IZZ8UgxyFEsOb+^q55ioeS(P(hGM2EW& zX-L+>U@LUGAs(v%`n<8(tZCLYhPt5KH=A1=0@F%Hc%UsNo!z5%*pa*%qW5akq)eD! zzyiox2|1kN+7&epdK?{_c87+dso@f9Q`^x(QO8HDWLoxJ&>M_aqsI{9F@#&gJxPXS zYqAHbk|#f;#9D3`ZJlPAW}W7l9x~r>k7t|p8AGVXh_c#dlmmxL3)O|K2B+Dj_c)AB zlM|}BGsqEagL^B&6$-7av$3q>5t$VF!bHq05Hrunt=S*_ymvnxnd@e@3)%DC#l6Au$IW5)&sr6T~ou4YxaF*}f-RuN=lq$Q$d!$>eu}o@(G_ z3Xl1E#e_S9G`dtl(ns1>N#5qVdamlk8diPaT_6oh%* zY0jd~X(=(@gtVm0u9y}v9h?-E@u;){qc*%>6c$L-0&}m=T$D92t08Mk)}btl?pAqF zS3Y$@iB*+&XND=moDq@{dd76dd?w^f=&3B@1jK#gCclLx(dlpFPbw>L^RAl2oIl?A z=)V23xTmUN(egdALH!gt7kjvR@qVdd?))=nIpa$F!#d8m>cq6&Ym~2~k+pxVo3%(; zFVv~;3w}Jy*F_)X3fD*~M{fC_b7UN<|2{)jUg?&%@5qp=77|0orTNzYeta+D75w~| zWWYMS2gO3BBBx=qMYowmmQX3&-PZ_#r9G#C4teI$n6L&4DG7}I4e^I>BBoiKzV*Qe zw{CrK`~4*Sg!P-a4#=uG}V|K$yP zuqrqf098wnEwc0YP{YVA_4irBs9CU5cJ6X*IVU`L#^LF`FjG!HEn%8`|@{13x$@YckvFP!UHfW8=YDvSexyF z*0TYZgS`bdTj-{?G>5@!Nej-Ts0AEuT!E*-cM#SizXCDPhL{Wr_3aMV0Bqhi$wuMh zZkxvzVhha(_X$4c6Md2o<$?RUeI8$kFVu}ki_|%W#fUl*cGc4##!r73`~s@JsziV3 z{Iu@hLyz=sop$J;d+t5g`ZgWl+=I>OQ#8r)&%=fuKLiS|qvP685A!sSNt2G?9g~F* zeZ9CJt59`g6~eylcVj&w?9p!adLD7_3CAgDcVnfyBMYqtue&%wOt%XCZtuprj_4Gw zq;_;;sd;=yVz?Kp!W-?4@y2@NyzygAW6fhNV}r&!kan=VZvq(34@o zxOwvYaV_1F6web6301=IDLGT|JW-BuQ=Mkxy2UFd?pU>U(ffZL`P`H`%{_DH%pbev zz6V!*{pPgOJ^np^-h?s5?w^%)AsN3}C$_k%LiIK~OEYS{l8^x&f}r8ciX8+Z#MP|RHkoJlV9SF@ zWeDY#g-{{X@4a(t^;&~l?=~dqlMESQOT#vY?G7_daK?kVE6E~U2Uhf=q@0U;_dd(U z%KN(&m-H6b8#dj$`)=uYJsT)LQ{Osa&EQcJ?_Is|F`9E8_}xd)yu*aKzPJ#(&JyGj zR~bXWZiE(Nl?Jj7W}L?E2u`zkEg9V5#DyM^I-fY*TwHL*%z1XyEiR^|5r@ddq|!1x zPk1UkP<~ogv>rOnNj(0@uITdic<~&ocv9Y(y|@1Gqx;!JE=p^>*Zb5RuWNYyyqI6# z`oN1@j{li`L2Hi+@q%V4-XmBz=F2x3MZ<15X7sytdbnovg$4rK)S%95Az8%qg2e!X ze6tDlRD*+f`ZoET%woIG344N|qyJ<_HJC_rE78G3?$yWWN9d>M=jrtZgTWYq?0&b= zZAuhUG%4B?V~QyyxVw;PD-rq!^$!NXMesCXdhk5WJnekl0s|MMf;xd*V>?Cc~ zh3v{fxU*Atv(5A6h1kLR)R5g6mJkzY!6#aXq% z?S3gRXId8jdA_}WLh(|y`K7AJ-t4;pX@Gf5;m!n>X6lT*=K@o{vo9NH8sHpls&rPf zT2rla4z{G(xz6MPObJ|hLAdy|Ff8jJ>LPl}<>Z{yDLK_d9K_xmY(|I4We&A?oK9Dg z(3vG0lT7jE6bQPB2<-vvG+>^Kq#{j`wn$e5V{{Mryn9%>2X%McfvBNkp&#pK=x3x@ zuK|{lpb}e&y~I(1AfVwW9b77wN~M}oZKYEL|=!NiHHJazD@nG|9^X>B; zbDZ;C>x^qnr#uU=|3-$>49AsX66IeynRK4nzTe4~&y!E@fcy2=`{kGCv(KJ@?H6a^ zMe$vt1;TCMw2>|Wa)#k71BVTC5y1}mrje&=w+k*R90>AM6}EY*3gM0=8!--vPS~w@ zxeD97T!o|&aX%KEJ#<<^r55hcYPOsFek^ihSsWUpBLse|(}9jG<^23-Lb=tE1twvE zA=b@}uD3X@KGg`OU^lV@aIk{=3j=VJM(f7}SGa408vXR(>F$NW3*D=P^}#L^cUc*O zbXIMcHe440IASqeB6n4IklPv-78dS~0AM*w6VoJ${OcU#4NkHq*^=zZVaeg%hJAI#wsvNz?Sx;l!BE)uft; z1;S#sSX?YE)-4R0A3Vo8$2P}4$F;yc&oeh{E}Ts$e68PL-e6f9v^IE+b&YGadv)0A z@YNCHKm#fXsBR~-5-YFzqQsG(Y-T$)%3rX->t*+vufJI*&)CQk<-e|EA1xKvvTSHe z^W{8fONH`__;)KiL5@xEM%aajH+Eu@Zw%WlB0fK&lNc`SwpxSDCegS%7;)6#5%|_n zXf(i2qScA|LXgG~L!@X87etR6_kWO)xP)2L;@A}_x`T;BKr%8|Eg|V{ixkPdCw3?? zJfH9?rvNerkQ@Yc$L~kEdDs0p{sz*A5dsEgF*d|D23p|)rqRQy@B>hT+}*mK2lQwOdamet&lF(s=~m)|q5&r64;clS^NlsXxjjnBSUE_0?PRXsuXd6mN1gm5DoBf2fmcT5H7K_2p8{F&1Bbea8#(In0j< z@)1o4^yUP_TW7*$Yu3dY!)fX2DN&o?5uC`B0VjzG^IElu zJOvD94*Cy<9VLN3gB(%_P9q-#Z{#1DS~tJRyCtc~yhsv5KpGk5Vbq~yJ-XmEA%(v_ zHe*vk!KN9H{aV;}V|n$8yC;`#{IYiIMJ8^WQ#)rH6EEIBy<(&M*~9ll#jV~Yf3^__ zUU(0K9LWv>kw+2;UqK`ECwv9i#o$yzPCtNM4(`=O{u^O`9o~7IFT>&qvqozS5pHvs zRU4y;XbKaW;;l{gMolNM1Dh3tCE~~7?r68ytZ9E`9)O1T!!{`|?0;Xy^_rilrPwCC zC1FrN&*rZUCEVp{e{D#*Lh*)ClUJ^oGHOF{(XWrr*i=}!X~v_!7JWH-6N}!pIxgy- zhgtNd(bMn0D9il)W%=S(qN@+tMdY4=mm_~N#_bAo=yhfdb6CU7@W%Zi%=`yOC$|gu zGeT%EnDCERIkW=pi;X}x_{mfDg}I5)GZ>;S$ym<4JkiV(LNPzukE)MOsCv?5_S`>l z{GY~D|GARBaosy<{2|G^wPIv%jmDTiV955-!||2jj)8;?1Z6c=`!DFph(q$(f{l}; zT8oth*(ql*C;%BK<7XtBv4HHo2-t(%&Hy~0K8yNlXY$Owp+kRrQ_8u1{ra2OYf;!K zpU3q(82-aJ*hanj9nreYW>ffsVGl$Jn_V8~h9FZ_ywf5WO%dr~ar!8?NeZ{cgB%ET z2Ob(5TuGn|QYwK{19klsx#w4z3Vuik(!>aUhSI-;4#+e>4H4%q$A9dj_~YBFKStG= zkE_QYD6MlgRgazHmOin5_5S&5+Xa%&m!C@p++ge3~5qK(4~ZC;yk|h z)+q|{=H$oCqY7=J-G(0!&rpn}6bX)!93ecDSEq+@Rbk0`uLA3m=gkAW1}t070B3@< z>TKoN)a2y!GgW80&+q43Qt;Nqx091o(#}jg(|tj|-p#`wnmw!Kp~l7*>BBRXXL~mH z?l&+0Oy%2YDapxiSDqASkavsTYD0F6#iAeL(1w|sA`CH7lQzU@lPpc{;K^~UDM~AZxgw*( zL!Fv-}!4v!d%p7y z*B$Qs&|>o-%aEWU!Go-WYy<5`ZE*MY^bRQw9S~MwD7TMsj&Y4~j|rWIc$;aKX%KK~ ztTnc2_B!WuSA%Q1yTM%-S{F9G(_HgH=VI4V*JAfl_rlQTuw^d%L7@2-*A{m%sWzNK zV{^O+7wCBV!tJGZE50u_{iHmDZ7q{eFunZQdNKJaHkyrilpWe6Uj`z`(f;gydFF{a z)==APV=eo^AMGJqYnw;b%J-5(Ma2EEmmSn@$Niuu#10O9ve+An zY7=^EbrOObvNf)#jNp8ilqwHtecH(psy2=C&yl?@G(KYuw6*BO=eT(&3XwHZHa3nzv1?Hw>XwX19ao^&-XrKWgkYHbQ5Fu0tx&KdZnku^ z%RT;dCD=f~NMQ@{n+*Imk{ip^_GKK0h4EN#l0LfSD(Rcb*Q_A3U+?U!-u>9q8U1=^ zW%uroWYv5$XP6`v-Zm<;&P^x^iJ zyLSG<1@k5~y02_!`k6Cl%$PY-{&o9y`B&v@rr*Bu^U4VmCr+sReC6F=R8E*sIll4> zv0&xK?_YcUUy0sxGi(0x%+pU#oFZ+x6TkV}&h7HGnKSRi*G#*8C)45UX_b`|zFfKD z^UBJJ6DuctzH-$U6DljQUcwSFL?V2RNW`_I!FS$Mh_-oxwMkLY?3k3A9DOYKcyiJ) z$>4b|^qBLQ;rWQ#^yCn8OuQxqv25`gPly<0)r=A1$Ap+gxSnxDaA6}oosNh9f85`| zP(Xz9>F?f#pX419nYmO$YYJO%JP%@^E$>0gL!ym8f~7swg`DeBap~pEC8Ia)J8|&s zIklr}f(H-T();kSt;cI;Or12oq4h`cxz=LMOY*9brP-M)X3bufKC-g7->%5Wo$}_b zr9+30nj~K#$RY5ChlP!h72_e7pl+M56GEE|OfMij67D#o7%T~6MXgCc)@UIhFR*wV zev(570gL|7r|lI4nY*cISdLTq&?L&|;pb0{S3WfHP4WTxKoi?r#`d;-NzW&lFd8yp zC6MhxeP&SuI0DInjDH<)Yq%r~Bt|F4wgQI0o@)!@SuT%N*g3Jh^`Q1=s1%^z zmr$>!fZuJf!}`oRw_vG_Fgm2r2rjkJk%N$y83;E5)I#M3QkWRfXQxjaGI)C3K;OL7 zE?u5oz2@jKZB6Zv!8Owc4XR()wM+W!-gp1y=$h5f(eplpOr_wmS%nmzOABN+)XTHX z1`r|8*(}HaKpF-P1;lj9<-Llp@g0c(*z$p``&nf9z)2&AR%&ez$Hd(|z4=M|`5C7N$wQiZkD5Z2 znX1K&;@g;iicscDbA(uhB*_^4Vx;q>kQc4VFD1QbJr((iG+l+>65_|}!p8$mOab1) zoT2o*L-ST<&8LlcDwUny1isZ#j_~X2Di2*UV0Djm57bSZzwoI)l&tStterf*vZiKg zPQ;`s!v~j*))#A!hlkIYQi81C`PH+VJ9Rq91`eqxn=o zv^tE_>iiL%+=M%_YhAczv&g&U!sMjzU;^lUAWVt5yMv* z?eJtoAwEH9fq{DkJQ}tbS8$p|NQ+eb8m=^t#p}q7A?GPM=n>9A_ch4y^40HTupJ2C zxO4b*L_vtQSS6x>`#NH{mnNnS_v*;fSa|IMJQ~0@^9SFw`!&AcevNMTkIk?2l0$Vr ztK@EJ7<7A0hjRmfR@>_9HP-?h9Ei!i(L-}T^b)I(?(>)c9@aqkwl<*KF)gC=jX_3A zWde8()Ct=B(*$q<2L=ufsyFdJJoidmD2C6g|GNJCe=&{rT>YX!?H+x+g3|Y?c7wGgB1%i-YD~LW0P~%Vdv0=nl71W)DHUCkhsEdjPD}I6 z>N;j_T$Kam|vWNmk>PMu35U&MWW1rR4 z�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